Ansible で amazon-cloudwatch-agent をプロビジョニングしようとしたら毎回 changed になった件

環境

  • 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