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

如何使用Ansible检查文件中是否存在特定的文本块?,ansible,Ansible,我正在使用Ansible在安装某些应用程序时自动执行某些任务 在某些情况下,我想检查文件中是否存在某些行。文件中有几行内容始终相同,顺序相同。我要检查在前面的行之间是否插入了额外的行 我认为正确的命令是blockinfle,它与state:present混合使用,以确保行在那里。此外,我还使用check_mode不更改文件。那么任务是: - name: Check content of file delegate_to: localhost blockinfile: dest:

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

在某些情况下,我想检查文件中是否存在某些行。文件中有几行内容始终相同,顺序相同。我要检查在前面的行之间是否插入了额外的行

我认为正确的命令是
blockinfle
,它与
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不停地继续。正如建议的那样。当为时,我可以将失败添加为:

- 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)
始终
块_存在
标记为
已更改


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

模块的
blockinline
块是一个多行文本,由开始和结束标记(默认情况下以注释的形式添加)标记

对于您的用例,在检查模式下使用
替换
模块是合适的:

- 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

我尝试过这个选项,任务从未失败过。无论
regexp
中的一行文本是否包含在文件中,这都无关紧要。因此,您做了一些错误的事情,因为如果多行文本出现错误,它确实会失败:
失败!=>{“changed”:true,“failed_when_result”:true,“msg”:“1 replacements made”}
。请记住,
regexp
值是一个正则表达式。您可能需要转义某些字符才能获得匹配。好的,我已转义了这些字符,但我将检查完整的测试以查找可能缺少的字符。好的,这是一个缺少的转义字符。谢谢