自宅では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 件のコメント:
コメントを投稿