介绍

介绍

介绍

到目前为止,我们在/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 方法,这样就不需要临时状态了 - 但这取决于您的需求 - 如果您一次性删除所有地方的旧样式,第二种方法可能更简单。如果您连续数月逐个迁移盒子,则定义状态会更清晰。

相关内容