はじめに
ユーザー管理やスケジュール済みタスクの自動化は、運用プレイブックにおいて一般的なタスクです。Ansible を使用すると、アカウントの作成、ファイルの所有権管理、および cron エントリのインストールを安全に行うことができます。
この実験では、一時的なサービスユーザーを作成し、レポート用ディレクトリとファイルの管理を行い、そのユーザー向けの cron ジョブをインストールします。
ユーザー自動化プロジェクトの作成
このステップでは、rhce_ops という名前の使い捨てサービスユーザーを管理するためのプロジェクトを作成します。
cd /home/labex/project
mkdir -p rhce-ansible/{inventory,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[managed]
host ansible_connection=local
EOF
セットアップにより、以前の rhce_ops アカウントは削除されているため、最初のプレイブック実行時には作成プロセス全体が表示されます。このアカウントは使い捨てであり、LabEx の labex ユーザーとは分離されています。
アカウントとスケジュールの変数を定義する
このステップでは、サービスアカウント、レポート用ディレクトリ、および cron スケジュールの変数を定義します。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。これにより、LabEx が各ステップを個別に実行する場合でもコマンドが安定して動作します。
cd /home/labex/project/rhce-ansible
mkdir -p inventory/group_vars
cat > inventory/group_vars/managed.yml <<'EOF'
ops_user: rhce_ops
ops_comment: RHCE automation operator
ops_report_dir: /home/rhce_ops/reports
cron_minute: '*/15'
EOF
これらの変数は、アカウントとスケジュールのポリシーを記述しています。*/15 を引用符で囲んでいるのは、YAML が * を特殊文字として扱う可能性があるためであり、引用符によって cron 文字列として保持されます。
cat inventory/group_vars/managed.yml
ユーザーとファイルのプレイブックを作成する
このステップでは、ユーザーの作成、所有ディレクトリの作成、管理ファイルの書き込み、および cron エントリのインストールを行うプレイブックを作成します。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。
cd /home/labex/project/rhce-ansible
cat > playbooks/users-files-cron.yml <<'EOF'
---
- name: Manage user files and scheduled task
hosts: managed
become: true
gather_facts: false
tasks:
- name: Ensure operations user exists
ansible.builtin.user:
name: "{{ ops_user }}"
comment: "{{ ops_comment }}"
shell: /bin/bash
state: present
- name: Ensure report directory exists
ansible.builtin.file:
path: "{{ ops_report_dir }}"
state: directory
owner: "{{ ops_user }}"
group: "{{ ops_user }}"
mode: '0750'
- name: Install managed report file
ansible.builtin.copy:
dest: "{{ ops_report_dir }}/status.txt"
content: |
managed_by=ansible
owner: "{{ ops_user }}"
group: "{{ ops_user }}"
mode: '0640'
- name: Install heartbeat cron job
ansible.builtin.cron:
name: RHCE heartbeat
user: "{{ ops_user }}"
minute: "{{ cron_minute }}"
job: "/usr/bin/date >> {{ ops_report_dir }}/heartbeat.log"
EOF
各タスクは依存関係に基づいています。ユーザーが存在しなければ所有権を割り当てられず、レポート用ディレクトリが存在しなければステータスファイルを書き込めず、cron ジョブはそのユーザーとして実行される必要があります。
ansible-playbook playbooks/users-files-cron.yml --syntax-check
ユーザー自動化プレイブックを実行する
このステップでは、プレイブックを実行し、アカウント、ファイルの所有権、および cron エントリを確認します。
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/users-files-cron.yml | tee reports/users-files-cron-run.txt
最初の実行で、ユーザー、ディレクトリ、ステータスファイル、および cron エントリが作成されるはずです。出力を保存しておくことで、アカウントの変更とファイルや cron の変更を区別しやすくなります。
id rhce_ops
id コマンドにより、アカウントが存在し、数値のユーザーID とグループ ID が割り当てられていることを確認します。
sudo ls -ld /home/rhce_ops/reports && sudo ls -l /home/rhce_ops/reports/status.txt
ディレクトリとファイルは rhce_ops が所有しているはずです。ステータスファイルはモード 0640 を使用し、所有者に読み取り/書き込み権限、グループに読み取り権限を与えます。
sudo crontab -u rhce_ops -l
crontab には、名前付きの heartbeat エントリと、heartbeat.log に日付を追記するコマンドが含まれているはずです。
プレイブックの収束を確認する
このステップでは、プレイブックを再実行します。アカウント、ファイル、および cron エントリはすでに目的の状態と一致しているため、変更は発生しないはずです。
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/users-files-cron.yml | tee reports/users-files-cron-second.txt
2 回目の実行では、アカウント、ファイルの状態、および crontab がすでに変数やタスクと一致しているため、changed=0 と報告されるはずです。
grep -E 'host.*changed=0' reports/users-files-cron-second.txt
まとめ
使い捨てユーザーの自動化、ファイルの所有権と権限の設定、cron ジョブのインストールを行い、プレイブックが冪等(べきとう)であることを確認しました。


