顧客が、RHELサーバーとAIXサーバーに集中化されたsudoersファイルを展開するためのスクリプト移行の支援を求めたとします。

まあ、これは非常に一般的なシナリオです。その例では、Ansibleの高度な機能の使用方法と、アプローチがどのように変化するかを示すことができます-特定のタスクを実行するスクリプトから、dem等の(変更を加えずに)説明とインスタンスの状態の監視
スクリプトを実行します。
212行のコードがあり、sudoersファイルにはバージョン管理がありません。 顧客は、週に1回実行され、ファイルのチェックサムをチェックしてセキュリティを確保するプロセスをすでに持っています。 スクリプトにはSolarisへの参照が含まれていますが、この顧客のためにこの要件を転送する必要もありませんでした。
まず、ロールを作成し、バージョン管理のためにGitにsudoersファイルを配置します。 とりわけ、これにより、NFSボリュームをマウントする必要がなくなります。
コピーおよび
テンプレートモジュールの検証およびバックアップオプションを使用すると、ファイルをバックアップおよび復元するコードを記述する必要がなくなります。 この場合、ファイルが宛先ポイントに配置される前に検証が実行され、検証が失敗した場合、モジュールはエラーをスローします。
ロールごとに、タスク、テンプレート、および変数を指定する必要があります。 対応するファイルの構造は次のとおりです。

ロールスクリプトファイル(プレイブック)
sudoers.ymlの構造は単純です:
---
##
# Role playbook
##
- hosts: all
roles:
- sudoers
...
ロール変数は
vars / main.ymlファイルにあります 。 このファイルにはチェックサムファイルが含まれ、ローソンホストをスキップしてhdホストのみにsudoers.dファイルを含めるための特別なロジックを作成するために使用されるinclude / excludeディレクティブが含まれます。
vars / main.ymlファイルの内容は次の
とおりです 。
---
MD5FILE: /root/.sudoer.md5
EXCLUDE: la
INCLUDE: hd
...
copyおよび
lineinfileモジュールを使用する場合、ロールはべき等ではありません。 コピーモジュールはベースファイルをインストールし、lineinfileは開始するたびにincludeを再挿入します。 この役割は
Ansible Towerで開始されるため、べき等性は必須です。 ファイルをjinja2テンプレートに変換します。
最初の行に、
スペースとインデントを
制御する次のコマンドを追加します。
#jinja2: lstrip_blocks: True, trim_blocks: True
テンプレートモジュールの新しいバージョンには、
trim_blocks (Ansible 2.4で追加)のパラメーターが含まれていることに注意してください。
ファイルの最後に
インクルード行を挿入するコードは
次のとおりです。
{% if ansible_hostname[0:2] == INCLUDE %}
#includedir /etc/sudoers.d
{% endif %}
名前が文字「hd」で始まるホスト用の行を挿入するシェルコマンドに、条件付き構成({%if%}、{%endif%})を使用します。 Ansibleファクトとフィルター[0:2]を使用して、ホスト名を解析します。
それでは、タスクに移りましょう。 最初に、ホスト名を解析するためのファクトを確立する必要があります。 条件構成では、事実「parhost」を使用します。
---
##
# Parse hostnames to grab 1st 2 characters
##
- name: "Parse hostname's 1st 2 characters"
set_fact: parhost={{ ansible_hostname[0:2] }}
RHELストックサーバーには
csumパラメーターはありません。 必要に応じて、別のファクトを使用して、チェックサムでバイナリファイルの名前を条件付きで示すことができます。 これらの機能がAIX、Solaris、およびLinuxで異なる場合、追加のコードが必要になる場合があることに注意してください。
さらに、AIXとRHELのルートグループの違いの問題はまだ解決されていません。
##
# Conditionally set name of checksum binary
##
- name: "set checksum binary"
set_fact:
csbin: "{{ 'cksum' if (ansible_distribution == 'RedHat') else 'csum' }}"
##
# Conditionally set name of root group
##
- name: "set system group"
set_fact:
sysgroup: "{{ 'root' if (ansible_distribution == 'RedHat') else 'sys' }}"
ブロックを使用すると、タスク全体の条件を設定できます。 ブロックの最後の条件を使用して、「la」ホストを除外します。
##
# Enclose in block so we can use parhost to exclude hosts
##
- block:
テンプレートモジュールは、ファイルを検証してインストールします。 タスクが変更されたかどうかを判断できるように、結果を修正します。 このモジュールでvalidateパラメーターを使用すると、ホストに配置する前に新しいsudoerファイルの有効性を検証できます。
##
# Validate will prevent bad files, no need to revert
# Jinja2 template will add include line
##
- name: Ensure sudoers file
template:
src: sudoers.j2
dest: /etc/sudoers
owner: root
group: "{{ sysgroup }}"
mode: 0440
backup: yes
validate: /usr/sbin/visudo -cf %s
register: sudochg
新しいテンプレートがインストールされている場合は、シェルスクリプトを実行してチェックサムファイルを生成します。 条件付きコンストラクトは、sudoersテンプレートのインストール時、またはチェックサムファイルが欠落している場合にチェックサムファイルを更新します。 実行中のプロセスは他のファイルも監視するため、ソーススクリプトで提供されるシェルコードを使用します。
- name: sudoers checksum
shell: "grep -v '/etc/sudoers' {{ MD5FILE }} > {{ MD5FILE }}.tmp ; {{ csbin }} /etc/sudoers >> {{ MD5FILE }} ; mv {{ MD5FILE }}.tmp {{ MD5FILE }}"
when: sudochg.changed or MD5STAT.exists == false
ファイルモジュールは、必要な権限のインストールを確認します。
- name: Ensure MD5FILE permissions
file:
path: "{{ MD5FILE }}"
owner: root
group: "{{ sysgroup }}"
mode: 0600
state: file
バックアップパラメータには、以前のバックアップを処理するためのオプションがないため、適切なコードを自分で作成する必要があります。 以下の例では、これに「register」パラメーターと「stdout_lines」フィールドを使用します。
##
# List and clean up backup files. Retain 3 copies.
##
- name: List /etc/sudoers.*~ files
shell: "ls -t /etc/sudoers*~ |tail -n +4"
register: LIST_SUDOERS
changed_when: false
- name: Cleanup /etc/sudoers.*~ files
file:
path: "{{ item }}"
state: absent
loop: "{{ LIST_SUDOERS.stdout_lines }}"
when: LIST_SUDOERS.stdout_lines != ""
ブロック完了:
##
# This conditional restricts what hosts this block runs on
##
when: parhost != EXCLUDE
...
意図されたユースケースは、Ansible Towerでこの役割を果たすことです。 Ansible Tower Alertsを設定して、ジョブの実行に失敗した場合、アラートを電子メール、Slack、またはその他に送信することができます。 このロールは、Ansible、Ansible Engine、またはAnsible Towerで実行されます。
その結果、スクリプトから不要なものをすべて削除し、sudoersファイルの目的の状態を提供できる完全にべき等の役割を作成しました。 SCMを使用すると、バージョン管理が可能になり、変更管理と透過性がより効率的になります。 Jenkinsまたは他のツールを備えたCI / CDを使用すると、将来の変更に備えてAnsibleコードの自動テストを設定できます。 Ansible TowerのAuditorロールを使用すると、組織の要件を監視および実施できます。
チェックサムを操作するためのコードはスクリプトから削除できますが、このためには、顧客はまずセキュリティサービスに相談する必要があります。 必要に応じて、sudoersパターンをAnsible Vaultで保護できます。 最後に、グループを使用すると、包含および除外を使用したロジックの記述が回避されます。
→この
リンクで GitHubからロールをダウンロードできます。