lineinfile:如果已经存在,则不要插入行

时间:2015-08-11 08:19:16

标签: ansible ansible-playbook

它正在创建一个新文件并向其中添加内容。如果再次重新运行ansible文本内容将再次应用于行下方,但会覆盖最后一行min

我需要它做的是,如果文本已经应用,请不要再添加它。我认为我的bantime = 86400设置错误。

regexp

2 个答案:

答案 0 :(得分:8)

来自lineinfile examples

# Add a line to a file if it does not exist, without passing regexp
- lineinfile: dest=/tmp/testfile line="192.168.1.99 foo.lab.net foo"

\n的行不是一行,它们是多行,并且在下次运行时不能作为一行匹配。您应该将每一行添加为单独的任务:

- name: add maxretry setting
  lineinfile: dest=/etc/fail2ban/jail.local line='maxretry = 3' create=yes

- name: add findtime setting
  lineinfile: dest=/etc/fail2ban/jail.local line='findtime = 10800' create=yes

- name: add bantime setting
  lineinfile: dest=/etc/fail2ban/jail.local line='bantime = 86400' create=yes

同时删除regexpbackerefs设置,因为它们不需要state,因为present是默认值。

然而,使用设置和没有值的名称传递regexp会更好。因此,如果您更改设置值,它将替换文件中的字符串而不是添加新字符串,例如:

- name: add maxretry setting
  lineinfile: dest=/etc/fail2ban/jail.local regexp='^maxretry = ' line='maxretry = 3' create=yes

答案 1 :(得分:1)

@ devoto13的回答是正确的。问题是你正在尝试添加多行。但是,如果您的要求是使用这些行而不是单独使用,则可以使用blockinfile模块。这也可以加快游戏速度,因为你只有一个任务,而不是每行一个。