環境
- CentOS 7.8.2003
- amazon-cloudwatch-agent 1.246396.0
Ansible で amazon-cloudwatch-agent をプロビジョニングするために次のようにロールを書いていました。
### tasks/main.yml - name: install cloudwatch-agent yum: name: https://s3.amazonaws.com/amazoncloudwatch-agent/centos/amd64/latest/amazon-cloudwatch-agent.rpm - name: copy cloudwatch-agent config copy: src: amazon-cloudwatch-agent.json dest: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json mode: '0644' notify: - cloudwatch-agent fetch config - cloudwatch-agent restart ### handlers/main.yml - name: cloudwatch-agent fetch config shell: | /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \ -a fetch-config \ -m ec2 \ -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json \ -s - name: cloudwatch-agent restart systemd: name: amazon-cloudwatch-agent.service state: restarted
CloudWatch Agent を試す - ngyukiの日記 の通り、JSON で書かれた設定ファイルを amazon-cloudwatch-agent-ctl
コマンドで変換する必要があります。ので amazon-cloudwatch-agent.json
を /opt/aws/amazon-cloudwatch-agent/etc/
にコピーした後に handler で amazon-cloudwatch-agent-ctl -a fetch-config
しています。
これで amazon-cloudwatch-agent.json
に変更があるときだけ amazon-cloudwatch-agent-ctl -a fetch-config
が実行されるように出来ている、はずでした。
がしかし毎回 changed になってしまいました。
理由はよくわかりませんが amazon-cloudwatch-agent-ctl -a fetch-config
を実行したときに /opt/aws/amazon-cloudwatch-agent/etc/
にあった amazon-cloudwatch-agent.json
が削除されることが原因でした。
ファイル名が異なれば大丈夫だったので適当に in-amazon-cloudwatch-agent.json
とかに変更して解決しました。
### tasks/main.yml - name: install cloudwatch-agent yum: name: https://s3.amazonaws.com/amazoncloudwatch-agent/centos/amd64/latest/amazon-cloudwatch-agent.rpm - name: copy cloudwatch-agent config copy: src: amazon-cloudwatch-agent.json dest: /opt/aws/amazon-cloudwatch-agent/etc/in-amazon-cloudwatch-agent.json mode: '0644' notify: - cloudwatch-agent fetch config - cloudwatch-agent restart ### handlers/main.yml - name: cloudwatch-agent fetch config shell: | /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \ -a fetch-config \ -m ec2 \ -c file:/opt/aws/amazon-cloudwatch-agent/etc/in-amazon-cloudwatch-agent.json \ -s - name: cloudwatch-agent restart systemd: name: amazon-cloudwatch-agent.service state: restarted
適当にググって出てきたロールだと、削除されたファイルを再び生成していました。
うーん amazon-cloudwatch-agent-ctl -a fetch-config
の前後でファイルを退避しておくだけでも良いかもしれない。
- name: cloudwatch-agent fetch config shell: | cp -Taf /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json \ /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json.tmp /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \ -a fetch-config \ -m ec2 \ -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json \ -s mv -Tf /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json.tmp \ /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json