【问题标题】:Why is ansible ignoring this regexp in a lineinfile?为什么ansible会忽略lineinfile中的这个正则表达式?
【发布时间】:2015-03-18 14:01:42
【问题描述】:

我试图告诉 ansible 在 /etc/hosts.deny 中添加一个“ALL : ALL”行,只要该行不存在。这是我的任务:

- name: Ensure hosts.deny has default ALL entry
  lineinfile: dest="/etc/hosts.deny" regexp="^\s*ALL\s*:" line="{{ deny_all }}" insertbefore=EOF

这一切都在一个叫做合规性的角色中,所以在合规性/vars/main.yml 中,我有:

deny_all: 'ALL : ALL'

这是为了解决一个带有单独冒号的解析器问题。

我也尝试过这些正则表达式,但没有任何乐趣:

  • “^\s*全部”
  • “全部”
  • “FOO”

我已将现有的 /etc/host.deny 替换为一个完全空的文件,但每次运行此任务时仍然返回“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

#

这怎么可能?

【问题讨论】:

    标签: regex ansible ansible-playbook


    【解决方案1】:

    问题是我误读了文档并且使用的是 insertbefore=EOF,而不是 insertafter=EOF。当我切换到 insertafter=EOF 时,它没有问题。

    【讨论】:

      【解决方案2】:

      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 将搜索确切的行 - 不需要正则表达式。

      如果行可以变化并且您需要通过模式识别它,则需要正则表达式,例如具有未定义/未知值的设置 foo

      附带说明,有一个技巧可以避免使用冒号的解析错误:您可以在 YML 中简单地使用 {{':'}}。这要归功于github user drewp

      【讨论】:

      • 太棒了。我想我陷入了在所有 lineinfile 条目上使用正则表达式的模式。大多数比这更有活力。感谢您的课程和技巧!可悲的是,即使删除了正则表达式,然后用“ALL {{':'}} ALL”替换了该行,它仍然无法正常工作。
      • 是的,这是有道理的,因为我本来希望您的正则表达式首先可以工作。我搜索了一下,发现了问题,请看上面的更新答案。
      • 这仍然不起作用,即使逐字使用多行版本。或者删除冒号只是为了让它做某事。它没有认识到该文件不再存在并且需要创建它。奇怪的是,我有一个“副本”,它查看同一个文件,它检测到丢失的文件并替换它。但是“lineinfile”似乎根本看不到文件!
      • 我在 Fedora 20 上运行 ansible 1.7.2,如果这有什么不同的话。我应该将其重新发布到 ansible 列表(现在我在您的帮助下找到了它)?
      • 我认为这是最好的选择。至少我没有进一步的想法。但我认为他们会要求你做的第一件事是更新到 1.8.4 或 devel 分支,看看是否有帮助。
      猜你喜欢
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 2020-06-16
      • 2010-09-22
      • 2018-07-01
      相关资源
      最近更新 更多