你如何在 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