Ansible で Amazon Linux と Amazon Linux 2 を見分ける

Posted on

先日 Amazon Linux 2 が発表されましたね。

サポート面ではこれまでのローリングアップデートから LTS への変更がありましたが、技術面でもさまざまな変更が入っています。特に init の仕組みが upstart から systemd へ変更されたのは影響が大きそうです。

Ansible で Amazon Linux と Amazon Linux 2 を見分ける

Amazon Linux 向けに書いた Ansible Playbook を Amazon Linux 2 に対応させようと思ったのですが、facts を見ても区別できる要素がありません。必要なところだけ抜き出すとこんな感じです。

# Amazon Linux
"ansible_distribution": "Amazon",
"ansible_distribution_major_version": "NA",
"ansible_distribution_release": "NA",
"ansible_distribution_version": "2017.09",

# Amazon Linux 2
"ansible_distribution": "Amazon",
"ansible_distribution_major_version": "NA",
"ansible_distribution_release": "NA",
"ansible_distribution_version": "Candidate",

CentOS などであれば ansible_distribution_major_version に値が入っていますが、Amazon Linux ではバージョンに関わらず NA になっています。

他に区別できる要素がないか探してみると、init の名前が入った ansible_service_mgr が使えそうでした。この要素には Amazon Linux であれば upstart、Amazon Linux 2 であれば systemd が入っています。

テストしてみる

簡単な Playbook でテストしてみました。 crond を service モジュールと systemd モジュールで停止してみます。

- hosts: all
  become: yes
  remote_user: ec2-user

  tasks:
  - name: Stop cron service.
    service:
      name: crond
      state: stopped
    when: ansible_distribution == 'Amazon' and ansible_service_mgr == 'upstart'

  - name: Stop cron service.
    systemd:
      name: crond
      state: stopped
    when: ansible_distribution == 'Amazon' and ansible_service_mgr == 'systemd'

実行結果がこちら。 13.112.xxx.xxx が Amazon Linux、52.197.xxx.xxx が Amazon Linux 2 です。問題なく skipping されていますね。

$ ansible-playbook -i hosts test.yml

PLAY [all] ********************************************************************

TASK [Gathering Facts] ********************************************************
ok: [52.197.xxx.xxx]
ok: [13.112.xxx.xxx]

TASK [Stop cron service.] *****************************************************
skipping: [52.197.xxx.xxx]
changed: [13.112.xxx.xxx]

TASK [Stop cron service.] *****************************************************
skipping: [13.112.xxx.xxx]
changed: [52.197.xxx.xxx]

PLAY RECAP ********************************************************************
13.112.xxx.xxx             : ok=2    changed=1    unreachable=0    failed=0
52.197.xxx.xxx             : ok=2    changed=1    unreachable=0    failed=0

まとめ

Ansible で Amazon Linux のバージョンを見分ける方法でした。愚直に when の条件を増やしていくと複雑になってしまうので、fork して Amazon Linux 2 用の Playbook を書いたほうが楽かもしれませんね。