如何使用Ansible检查文件中是否存在特定的文本块?

时间:2018-04-04 09:30:09

标签: ansible

我在安装某些应用程序时使用Ansible自动执行某些任务。

在某些时候,我想检查文件中是否存在某些行。在文件中有几行总是以相同的顺序具有相同的内容。我想检查前一行之间是否没有插入额外的行。

我认为正确的命令是blockinfile,与state: present混合以确保线条在那里。我还使用check_mode来更改文件。然后任务是:

- name: Check content of file
  delegate_to: localhost
  blockinfile:
    dest: "{{ file.path }}"
    block: 
      line 1 text....
      line 2 text....
      line 3 text....
    state: present
  check_mode: yes

但是,如果块存在,任务也不会失败。 Ansible继续不停。正如所建议in this answer。我可以将failed_when添加为:

- name: Check content of file
  delegate_to: localhost
  blockinfile:
    dest: "{{ file.path }}"
    block: 
      line 1 text....
      line 2 text....
      line 3 text....
    state: present
  check_mode: yes
  register: block_exists
  failed_when: (block_exists | changed)

始终block_exists被标记为changed

这是blockinfile正确的命令吗?如何检查文件中是否存在一组行?

1 个答案:

答案 0 :(得分:2)

blockinfile模块的阻止是由开始和结束标记标记的多行文本(默认情况下以评论的形式添加)。

对于在检查模式下使用replace模块的用例是合适的:

- name: Check content of file
  delegate_to: localhost
  replace:
    path: "{{ file.path }}"
    regexp: |
      line 1 text....
      line 2 text....
      line 3 text....
  check_mode: yes
  register: block_exists
  failed_when: block_exists is changed