Ansible执行sysctl模块时提示文件访问失败报错排查
报错根因
Ansible sysctl 模块开启reload=yes参数时,会默认执行sysctl -p全量加载/etc/sysctl.conf内的所有配置项,只要文件中任意一项配置加载失败,整个任务就会返回FAILED状态,和本次要修改的vm.overcommit_memory参数是否配置成功无关。
从报错日志可以定位到sysctl.conf内存在3处问题:
kernel.msgmni = 64417配置值非法:该参数的内核硬上限为32768,设置值超出范围时会触发Invalid argument错误kernel.randomize_va_space = 0对应参数路径不存在:通常是容器/轻量化虚拟化环境下proc路径被隔离,或者内核编译时未开启ASLR功能,系统本身不支持该参数调整vm.overcommit_memory配置行混入全角引号:日志里报错路径为/proc/sys/“vm/overcommit_memory”,引号是中文全角字符,导致sysctl无法正确识别参数路径
重复执行playbook仍报错的原因也很明确:sysctl.conf里的存量错误配置一直没有被修正,每次触发全量重载时都会复现报错,和目标参数是否已经写入配置无关。
修复方案
- 先修正sysctl.conf内的存量错误配置
- 将
kernel.msgmni的值调整为32768以下的合法值,通用场景设置为1024即可 - 删除不被当前系统支持的
kernel.randomize_va_space配置项,这类内核全局参数如果是在虚拟机/容器内运行,不需要在节点内配置,由宿主机统一设置 - 全局检查sysctl.conf的标点符号,把所有全角引号、全角特殊字符替换为英文半角格式,清除参数名前后多余的特殊符号
- 将
- 调整playbook逻辑,避免被无关配置干扰
如果不需要每次修改参数时全量重载所有sysctl配置,可以关闭模块自带的reload,通过handler单独重载本次修改的参数,参考配置如下:
--- - hosts: "{{ target }}" gather_facts: yes become: yes become_user: root tasks: - name: add a vm.overcommit_memory setting at the end of the sysctl.conf sysctl: name: vm.overcommit_memory value: 0 state: present reload: no notify: reload overcommit memory config handlers: - name: reload overcommit memory config command: sysctl -w vm.overcommit_memory=0
这种写法只会针对本次修改的单个参数做动态加载,不会触发全量配置读取,不会被文件内其他历史错误配置影响任务状态。
内容的提问来源于stack exchange,提问作者user19137493
相关产品推荐
相关产品推荐

