2022年10月22日土曜日

Ansibleを使ってcronを設定する

自宅ではAlmaLinux上にAnsibleコントロールノードを構築し、各種処理の自動化・コード化を進めている。

さらにAnsibleを使って、GitLabのバックアップやdnfを用いたパッケージ更新を定期的にcronで実行しているが、そもそもcronの設定自体もAnsibleでできるのでは?と思い実際にPlaybookを作ってみた。

今回はAnsibleを使ってcronを設定する手順を記載する。

環境

今回手順を確認した環境のOSは以下の通り。

  • コントロールノード
    • OS : AlmaLinux 8.5
    • Ansible : ansible [core 2.13.1]
  • Ansible実行対象サーバ
    • OS : AlmaLinux 8.5

Ansibleコントロールノード構築やLinuxサーバの事前準備の手順は、以下記事を参照いただきたい。

Ansibleを使ってcronを設定する手順

1. cronジョブ

今回設定するcronジョブは以下2つとした。各ジョブはAnsibleのPlaybookを実行する処理となる。

処理内容 実行時間
GitLabバックアップ 毎日1:30
サーバのパッケージ更新 毎週土曜日2:00

2. Playbook

cronの設定はansible.builtin.cronモジュールを用いる。通常、cronには「ジョブの名前」という概念は存在しないが、本モジュールを利用する場合は、nameによる名前の設定が必須となる。nameで設定したジョブ名は、cronの設定ファイルのコメントとして記載される。

Playbookの各タスクの処理内容を以下に記載する。

タスク名 説明
Setup cron job (Backup gitlab) GitLabをバックアップするcronジョブを設定する。
Setup cron job (Update all package for testserver) サーバのパッケージ更新を行うcronジョブを設定する。
Get crontab 設定したcrontabの情報をcrontab -lコマンドで取得する。
Show crontab コマンド実行結果を表示する。

以下に実際のPlaybookを記載する。cronの記載方法はいつもうろ覚えになるので、あえてコメントで記載ルールを書いておいた。

---
- name: Setup cron job
  gather_facts: false
  hosts: t1025alma

  vars:
    ansible_ssh_user: ansibleuser

    ansible:
      cmd: /usr/local/bin/ansible-playbook
      hosts: /root/jobs/hosts
      playbook_path: /root/jobs
    
  tasks:
    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # |  |  |  |  |
    # *  *  *  *  * user-name  command to be executed

    # cronの設定ファイルは/var/spool/cron/[Username]に存在
    - name: Setup cron job (Backup gitlab)
      ansible.builtin.cron:
        name: Backup gitlab
        minute: '30'
        hour: '1'
        day: '*'
        month: '*'
        weekday: '*'
        job: "{{ ansible.cmd }} -i {{ ansible.hosts }} {{ ansible.playbook_path }}/backup_gitlab.yml"
        user: root
        state: present
      become: true

    - name: Setup cron job (Update all package for testserver)
      ansible.builtin.cron:
        name: Update all package for t3036vpns
        minute: '0'
        hour: '2'
        day: '*'
        month: '*'
        weekday: '6'
        job: "{{ ansible.cmd }} -i {{ ansible.hosts }} -l testserver {{ ansible.playbook_path }}/update_linux_dnf.yml"
        user: root
        state: present
      become: true

    # crontabの表示
    - name: Get crontab
      ansible.builtin.command: crontab -l
      register: result
      changed_when: false
      become: true

    - name: Show crontab
      ansible.builtin.debug:
        msg: "{{ result.stdout_lines }}"

3. Playbook実行結果

実際にPlaybookを実行した結果を以下に記載する。Show crontabのタスクの出力結果より、nameで設定したcronジョブ名がコメントとして記載されていることがわかる。

# ansible-playbook -i hosts linux/setup_cron_job.yml 

PLAY [Setup cron job] ***********************************************************************************************

TASK [Setup cron job (Backup gitlab)] *******************************************************************************
changed: [t1025alma]

TASK [Setup cron job (Update all package for t3036vpns)] ************************************************************
changed: [t1025alma]

TASK [Get crontab] **************************************************************************************************
ok: [t1025alma]

TASK [Show crontab] *************************************************************************************************
ok: [t1025alma] => {
    "msg": [
        "#Ansible: Backup gitlab",
        "30 1 * * * /usr/local/bin/ansible-playbook -i /root/jobs/hosts /root/jobs/backup_gitlab.yml",
        "#Ansible: Update all package for t3036vpns",
        "0 2 * * 6 /usr/local/bin/ansible-playbook -i /root/jobs/hosts -l t3036vpns /root/jobs/update_linux_dnf.yml"
    ]
}

PLAY RECAP **********************************************************************************************************
t1025alma                  : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

以上で、Ansibleを使ってcronを設定する手順は完了となる。

0 件のコメント:

コメントを投稿

人気の投稿