介绍
到目前为止,我们在/etc/sudoers
文件中创建了一个包含 N 个条目的块。
这不是一个好的解决方案,因为有时我们只想更新一个系统并提供明确的支柱数据。然后pillar.systems
是一个只有一个条目的列表。
旧代码
etc_sudoers:
file.blockreplace:
- name: /etc/sudoers
- marker_start: "# START managed zone etc_sudoers -DO-NOT-EDIT-"
- marker_end: "# END managed zone etc_sudoers --"
- content: |
{% for system_name in pillar.systems %}
{{system_name}} ALL = NOPASSWD: /bin/systemctl restart apache2*
{% endfor %}
- append_if_not_found: True
- backup: '.bak'
- show_changes: True
新代码
{% for system_name in pillar.systems %}
etc_sudoers_{{system_name}}:
file.blockreplace:
- name: /etc/sudoers
- marker_start: "# START managed zone etc_sudoers_{{system_name}} -DO-NOT-EDIT-"
- marker_end: "# END managed zone etc_sudoers_{{system_name}} --"
- content: |
{{system_name}} ALL = NOPASSWD: /bin/systemctl restart apache2*
- append_if_not_found: True
- backup: '.bak'
- show_changes: True
{% endfor %}
问题
如何删除仍然存在于服务器上的旧块?
答案1
我将通过建立这样的状态来解决这个问题:
etc_sudoers:
file.blockreplace:
- name: /etc/sudoers
- marker_start: "# START managed zone etc_sudoers -DO-NOT-EDIT-"
- marker_end: "# END managed zone etc_sudoers --"
- content: '#'
- append_if_not_found: False
- backup: '.bak'
- show_changes: True
之后,我将使用cmd.run
例如sed。
您可能希望直接使用 sed 方法,这样就不需要临时状态了 - 但这取决于您的需求 - 如果您一次性删除所有地方的旧样式,第二种方法可能更简单。如果您连续数月逐个迁移盒子,则定义状态会更清晰。