介紹
到目前為止,我們在/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 方法,這使得臨時狀態變得不必要 - 但這取決於您的需求 - 如果您立即在所有地方刪除舊樣式,則第二種方法可能會更容易。如果您連續幾個月遷移盒子,那麼狀態的定義會更加清晰。