为什么 ansible 在 lineinfile 中忽略这个正则表达式?
Why is ansible ignoring this regexp in a lineinfile?
我试图告诉 ansible 将 "ALL : ALL" 行添加到 /etc/hosts.deny 每当该行不存在时。这是我的任务:
- name: Ensure hosts.deny has default ALL entry
lineinfile: dest="/etc/hosts.deny" regexp="^\s*ALL\s*:" line="{{ deny_all }}" insertbefore=EOF
这一切都属于合规性角色,所以在 compliance/vars/main.yml 中,我有:
deny_all: 'ALL : ALL'
这是为了解决解析器问题,那里有一个单独的冒号。
我也尝试过这些正则表达式,但并不满意:
- "^\s*ALL"
- "ALL"
- "FOO"
我已经用一个完全空的文件替换了现有的 /etc/host.deny,但我每次 运行 仍然执行此任务 returns "ok"。我在这里错过了什么?我敢肯定这是一件非常明显的事情,但我只是没有看到它。
谢谢。
---编辑了新的细节---
我修改了原来的任务,现在看起来像这样:
- name: Ensure hosts.deny has default ALL entry
lineinfile: dest='/etc/hosts.deny' line='ALL' insertbefore=EOF create=True state=present
然后我从远程系统中删除了 /etc/hosts.deny。 运行 此任务(通过标签)产生 "ok" 而不是创建文件:
# ansible-playbook compliance -i inventory.yml --tags deny -l us202
PLAY [Compliance] *******************************************
TASK: [Ensure /etc/hosts.deny has default ALL entry *********
ok: [us202]
PLAY RECAP **************************************************
us202 : ok=1 changed=0 unreachable=0 failed=0
#
这怎么可能?
lineinfile
模块中的冒号存在普遍问题。我找到 this thread on the mailing list.
如果line
中包含冒号,则整个内容需要用双引号或多行YML语法编写。
双引号:
- name: Ensure hosts.deny has default ALL entry
lineinfile: 'dest="/etc/hosts.deny" line="ALL {{":"}} ALL"'
多行:
- name: Ensure hosts.deny has default ALL entry
lineinfile: >
dest="/etc/hosts.deny"
line="ALL {{':'}} ALL"
多行语法中的 >
很重要。
上一个回答:
你的台词看起来很静止。问题中没有提到需要正则表达式的原因吗?如果没有,您可以简单地删除它,然后 Ansible 将搜索确切的行 - 不需要正则表达式。
如果行可以变化并且您需要通过模式识别它,则需要正则表达式,例如具有 undefined/unknown 值的设置 foo
。
附带说明一下,有一个技巧可以避免冒号解析错误:您可以在 YML 中简单地使用 {{':'}}
。归功于 github user drewp.
问题是我误读了文档,使用的是 insertbefore=EOF,而不是 insertafter=EOF。当我切换到 insertafter=EOF 时,它没有问题。
我试图告诉 ansible 将 "ALL : ALL" 行添加到 /etc/hosts.deny 每当该行不存在时。这是我的任务:
- name: Ensure hosts.deny has default ALL entry
lineinfile: dest="/etc/hosts.deny" regexp="^\s*ALL\s*:" line="{{ deny_all }}" insertbefore=EOF
这一切都属于合规性角色,所以在 compliance/vars/main.yml 中,我有:
deny_all: 'ALL : ALL'
这是为了解决解析器问题,那里有一个单独的冒号。
我也尝试过这些正则表达式,但并不满意:
- "^\s*ALL"
- "ALL"
- "FOO"
我已经用一个完全空的文件替换了现有的 /etc/host.deny,但我每次 运行 仍然执行此任务 returns "ok"。我在这里错过了什么?我敢肯定这是一件非常明显的事情,但我只是没有看到它。
谢谢。
---编辑了新的细节---
我修改了原来的任务,现在看起来像这样:
- name: Ensure hosts.deny has default ALL entry
lineinfile: dest='/etc/hosts.deny' line='ALL' insertbefore=EOF create=True state=present
然后我从远程系统中删除了 /etc/hosts.deny。 运行 此任务(通过标签)产生 "ok" 而不是创建文件:
# ansible-playbook compliance -i inventory.yml --tags deny -l us202
PLAY [Compliance] *******************************************
TASK: [Ensure /etc/hosts.deny has default ALL entry *********
ok: [us202]
PLAY RECAP **************************************************
us202 : ok=1 changed=0 unreachable=0 failed=0
#
这怎么可能?
lineinfile
模块中的冒号存在普遍问题。我找到 this thread on the mailing list.
如果line
中包含冒号,则整个内容需要用双引号或多行YML语法编写。
双引号:
- name: Ensure hosts.deny has default ALL entry
lineinfile: 'dest="/etc/hosts.deny" line="ALL {{":"}} ALL"'
多行:
- name: Ensure hosts.deny has default ALL entry
lineinfile: >
dest="/etc/hosts.deny"
line="ALL {{':'}} ALL"
多行语法中的 >
很重要。
上一个回答:
你的台词看起来很静止。问题中没有提到需要正则表达式的原因吗?如果没有,您可以简单地删除它,然后 Ansible 将搜索确切的行 - 不需要正则表达式。
如果行可以变化并且您需要通过模式识别它,则需要正则表达式,例如具有 undefined/unknown 值的设置 foo
。
附带说明一下,有一个技巧可以避免冒号解析错误:您可以在 YML 中简单地使用 {{':'}}
。归功于 github user drewp.
问题是我误读了文档,使用的是 insertbefore=EOF,而不是 insertafter=EOF。当我切换到 insertafter=EOF 时,它没有问题。