Ansible で Amazon Linux と Amazon Linux 2 を見分ける
Posted on
- #aws
先日 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 を書いたほうが楽かもしれませんね。