需要在文本文件中添加一行代码

时间:2019-04-07 11:26:13

标签: ansible

我需要在远程服务器上的配置文件中添加代码块,如果该内容已经存在于conf文件中,则不应将其添加到配置文件中。 当值固定不变但超时值和会话值从一个服务器更改为另一个时(例如,第一台服务器上的Timeout为100,第二台服务器上为150),该代码工作正常。

- shell: cat /tmp/httpd.conf | egrep -i "Timeout 100| session 200"| wc -l

   register: test_grep

- debug: var=test_grep.stdout

- blockinfile:
      path: /tmp/httpd.conf

      block: |

        Timeout 100
        session 200

   when test_grep.stdout == "0"

期望值应始终为

Timeout 100
Session 200

1 个答案:

答案 0 :(得分:1)

一种选择是首先使用lineinfile模块删除所有匹配的行。例如:

- lineinfile:
    path: /tmp/httpd.conf
    state: absent
    regexp: '^ *(Timeout|Session) \d+'

- blockinfile:
      path: /tmp/httpd.conf
      block: |

        Timeout 100
        Session 200

这将从配置中删除任何TimeoutSession行,然后添加所需的块。该解决方案的不利之处在于,它将始终导致变更。

如果您不想这么做,则可以只使用 lineinfile来做到这一点,就像这样:

- lineinfile:
    path: /tmp/httpd.conf
    state: present
    regexp: '^ *{{ item.0 }} \d+'
    line: '{{ item.0 }} {{ item.1 }}'
  loop:
    - [Timeout, 100]
    - [Session, 200]

这具有以下优点:如果文件已经包含所需的行,则任务将不会显示任何更改。