我正在尝试通过ansible lineinfile模块在文件中添加新行。以下是剧本中定义的任务。
lineinfile:
path: /etc/httpd/file.conf
line: myfilecontent
它可以正常工作,并在文件中添加新行。但是,当我将行内容修改为另一个值,即mynewfilecontent时,它将添加另一行而不是对其进行更新。
lineinfile:
path: /etc/httpd/file.conf
line: mynewfilecontent
我们非常感谢您的帮助。 谢谢
答案 0 :(得分:3)
使用lineinfile模块的 state 参数并在下面创建结构
my_lines:
- line: myfilecontent
state: absent
- line: mynewfilecontent
state: present
state 参数控制文件中是否存在该行。参见下面的示例
- hosts: localhost
vars:
my_lines:
- line: myfilecontent
state: absent
- line: mynewfilecontent
state: present
tasks:
- lineinfile:
path: /tmp/test.conf
create: yes
line: "{{ item.line }}"
state: "{{ item.state }}"
loop: "{{ my_lines }}"
注释1。
仅当该行不存在
时,才可以通过添加 state 参数来简化结构my_lines:
- line: myfilecontent
state: absent
- line: mynewfilecontent
在循环中声明默认的状态
state: "{{ item.state|default('present') }}"
注释2。
模块中定义的默认 state 为 present ,因此如果数据结构中不存在 state 参数,则可以省略
state: "{{ item.state|default(omit) }}"
以上所有3个变体在功能上都是等效的。
答案 1 :(得分:0)
如果您希望您的行可能替换文件中的现有行,则需要为regexp
模块提供一个lineinfile
参数。
要在文件的每一行中查找的正则表达式。 对于state = present,如果找到则替换模式。仅找到的最后一行将被替换。 对于状态=不存在,要删除的行的样式。 如果正则表达式不匹配,则该行将按照insertbefore或insertafter设置添加到文件中。 修改线时,正则表达式通常应匹配线的初始状态以及被线替换后的状态,以确保幂等。
与您的正则表达式匹配的最后一行将替换为您的line
值;如果没有匹配项,则会添加新行。
如果没有参数regexp
,模块将仅检查与您的line
值的完全匹配。
请参见https://docs.ansible.com/ansible/latest/modules/lineinfile_module.html。