ユーザー、ファイル、およびスケジュール済みタスクの自動化

AnsibleBeginner
オンラインで実践に進む

はじめに

ユーザー管理やスケジュール済みタスクの自動化は、運用プレイブックにおいて一般的なタスクです。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 ジョブのインストールを行い、プレイブックが冪等(べきとう)であることを確認しました。