Ansible shell模块执行sed字符串插入操作失败该如何解决?
错误原因分析
1. shell模块执行失败的原因
你在shell的多行块(|)中额外加了列表标识符-和多余的引号,导致最终传给shell执行的命令前缀带了-,系统识别为非法参数,才报/bin/sh: 0: Illegal option - 的错误。
2. lineinfile模块替换整行的原因
lineinfile模块匹配到regexp对应的行之后,会直接用line参数的内容替换整行,你给出的line只写了参数没有保留Environment=前缀,也没有使用反向引用保留原有内容,所以直接覆盖了整行。
解决方案
方案1:修正shell模块写法
直接去掉多余的-和引号即可,正确配置如下:
- name: "Set in flag for ulimit in docker conf" shell: sed '/^Environment=/ s/"$/ --default-ulimit memlock={{ memlock_value }}"/' {{ docker_options_file }} -i
如果要保留多行写法,也可以按如下配置:
- name: "Set in flag for ulimit in docker conf" shell: | sed '/^Environment=/ s/"$/ --default-ulimit memlock={{ memlock_value }}"/' {{ docker_options_file }} -i
方案2:使用lineinfile模块的正确配置(更推荐,符合Ansible最佳实践)
开启反向引用保留原有行的内容,只在末尾追加参数即可,配置如下:
- name: "Set in flag for ulimit in docker conf" lineinfile: path: "{{ docker_options_file }}" regexp: '^Environment=(.*)"$' backrefs: yes line: 'Environment=\1 --default-ulimit memlock={{ memlock_value }}"'
backrefs: yes开启后,regexp里捕获的分组可以在line中用\1、\2调用- 正则
^Environment=(.*)"$会捕获双引号前所有的原有配置内容 - 最终生成的行会保留原有参数,同时追加memlock配置,不会覆盖已有内容
内容的提问来源于stack exchange,提问作者AhmFM
相关产品推荐
相关产品推荐

