Ansible:如果 replace 没有找到任何要替换的内容,则会引发错误

Ansible:如果 replace 没有找到任何要替换的内容,则会引发错误

你如何在 Ansible 中解决这个问题?

我有一个文件/etc/foo/foo.config。我想将此文件中的字符串“DisallowBar”替换为“AlllowBarUntilMidnight”。

在这些情况下,Ansible 应该采取如下行动:

  • 案例 1:DisallowBar 被发现并被替换:OK
  • 案例 2:AllowBarUntilMidnight 已存在于文件中。没有执行任何操作:OK
  • 案例 3:DisallowBar 和 AllowBarUntilMidnight 不在文件中:我希望 ansible 失败。

Case3 对我很重要,因为这种状态不应该存在。这是一个错误,不应该默默地过去。

答案1

您可以使用以下validate参数代替以确保要写入的文件包含AllowBarUntilMidnight并且不再包含DisallowBar

tasks:
- name: replace DisallowBar 
  replace:
    path: /etc/foo/foo.config
    regexp: 'DisallowBar'
    replace: "AllowBarUntilMidnight"
    validate: 'grep "AllowBarUntilMidnight" %s'

validate命令在生成的临时文件上运行,然后在运行后将其复制到位replace。在这种情况下,如果失败grep,则意味着没有进行替换,并且您的原始文件DisallowBar从一开始就不包含。然后播放失败,文件保持不变。

答案2

您可以简单地依赖replace函数来确保文件不再包含该字符串DisallowBar

运行替换任务后,您只需确认文件确实包含字符串AllowBarUntilMidnight,如果不包含,则引发错误。您可以使用简单的 来做到这一点grep

  tasks:
  - name: replace DisallowBar 
    replace:
      path: /etc/foo/foo.config
      regexp: 'DisallowBar'
      replace: "AllowBarUntilMidnight"

  - name: Check for AllowBarUntilMidnight setting
    shell: grep "AllowBarUntilMidnight"  /etc/foo/foo.config

相关内容