我想将属性附加到文件,而不是在新行上替换或设置它。
档案内容:
PATH = "/a/path"
属性必须附加到文件中的变量:
"{{ key.values() | map(attribute='hi') | list | join(' ') }}"
变量的输出是:
/hi1 /hi2 /hi3
尝试使用lineinfile
附加,但参数insertafter
将属性放在新行上,而不是放在同一行。
- lineinfile:
dest: /file
state: present
insertafter: 'PATH = "'
line: "{{ mounts.values() | map(attribute='mountpoint') | list | join(' ') }}"
预期结果:
PATH = "/a/path /hi1 /h2 /hi3"
实际结果:
PATH = "/a/path"
/hi1 /hi2 /hi3
如果我使用此处描述的方法,则会收到语法错误:Ansible: insert a single word on an existing line in a file
我应该为这个特定用例使用哪个模块?
使用Ansible v2.1.2.0
backrefs选项提供相同的结果,这是不期望的:
- lineinfile:
dest: /file
backrefs: yes
regexp: 'PATH = "'
line: "{{ key.values() | map(attribute='hi') | list | join(' ') }}"
答案 0 :(得分:1)
感谢您帮助@Mir。 最终解决方案:
- lineinfile:
dest: /file
backrefs: yes
regexp: '(^PATH\s+\=\s+)(?:")([\w+\s/]+)(?<!{{ hi }})(?:")'
line: '\1"\2 {{ hi }}"'
hi
是变量。
答案 1 :(得分:0)
Lineinfile模块具有backrefs选项,该选项与regexp选项配对,允许您匹配现有行并仅更改其中的部分行。
像(未经测试)
之类的东西- lineinfile:
[...]
regexp: ^PATH = "(.*)"$
line: PATH="\1 {{ your_variable_here}}"
backrefs: yes
可能是你需要的。