Grow up

生活とプログラミング

DockerでAnsibleを使ってcronを設定する

f:id:knkomko:20210718235123p:plain:w250

はじめに

エージェントレスな構成管理ツール Ansible を使ってみました。
今回 Docker を使って cron の設定を試しています。

github.com

フォルダ構成
C:\docker\ansible-cron\
│  docker-compose.yml
│  inventry.ini
│  playbook.yml
│
├─ansible\
│     Dockerfile
│
└─target\
    │  Dockerfile
    │
    └─home\
cron の設定内容

Ansible を使うため playbook.yml に cron の設定内容を記載しています。
1分間隔で /var/log/test.log に test の文字列を追記することにしました。

- hosts: target
  tasks:
  - name: "setup cron"
    cron: 
      name: "create log" 
      minute: "*" 
      hour: "*" 
      day: "*"
      job: "echo 'test' >> /var/log/test.log"
Docker コンテナの起動
# docker-compose.yml のディレクトリに移動
$cd C:\docker\ansible-cron\
# コンテナの起動
$docker compose up -d --build
inventory.ini の変更

Ansibleからcronの設定を行うコンテナのIPアドレスを inventory.ini に入力します。
今回は 192.168.16.2 と記載していますが、環境に合わせて変更が必要です。

[target]
192.168.16.2

[target:var]
ansible_python_interpreter=/usr/bin/python3

コンテナのIPアドレスは内部で起動しているUbuntuに接続すると確認できます。

# target コンテナに接続
$docker exec -it target bash
# IPアドレスの確認
$hostname -i
playbook.yml の実行

ansible のコンテナに接続してAnsibleから cron の設定を行います。
今回SSH接続のパスワードは password としています。

# ansible コンテナに接続
$docker exec -it ansible bash
# Ansibleから cron の設定
$ansible-playbook -i inventry.ini playbook.yml --ask-pass

SSH password:

PLAY [target] *******************************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************************
ok: [192.168.16.2]
TASK [setup cron] ***************************************************************************************************************************************************************
changed: [192.168.16.2]
PLAY RECAP **********************************************************************************************************************************************************************
192.168.16.2               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
cron ファイルの確認

今回設定した内容は root のファイル名で記載されています。

$cat /var/spool/cron/crontabs/root

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab2yp2i8ru installed on Sun Jul 18 14:24:59 2021)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
#Ansible: create log
 * * * * * echo 'test' >> /var/log/test.log
cron の動作確認

1分間隔で文字列が追記されていることを確認します。

$cat /var/log/test.log
test
test
test
cron の実行ログ

デバックをする際に使用したので忘備録として残します。
rsyslog の設定ファイルから cron の実行ログを残すように変更を行います。

# rsyslog の設定を変更
$vi /etc/rsyslog.d/50-default.conf
# コメントアウトを外す
cron.* /var/log/cron.log

設定を反映させるために rsyslog のサービスを再起動します。

$service rsyslog restart

cron の実行ログは /var/log/cron.log から確認できます。

$cat /var/log/cron.log

Jul 18 14:25:01 7a07b9e45953 CRON[554]: (root) CMD (echo 'test' >> /var/log/test.log)
Jul 18 14:26:01 7a07b9e45953 CRON[567]: (root) CMD (echo 'test' >> /var/log/test.log)
Jul 18 14:27:01 7a07b9e45953 CRON[569]: (root) CMD (echo 'test' >> /var/log/test.log)