Ansible 初心者からなかなか脱却出来ないかっぱです。
Ansible で OS を判断させて何かさせたい場合には...
Ansible で OS を判断させて何かさせたい場合には... fact パイセンで取得出来る情報を利用して判断させる。
setup モジュールを利用することで対象ホストの fact 情報を取得することが出来ちゃう。
$ ansible -i inventories/docker_inventory.rb all -m setup -c paramiko
ansible_01 | success >> {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.17.0.22"
],
"ansible_all_ipv6_addresses": [
"fe80::42:acff:fe11:16"
],
"ansible_architecture": "x86_64",
"ansible_bios_date": "12/01/2006",
"ansible_bios_version": "VirtualBox",
"ansible_cmdline": {
"BOOT_IMAGE": "/boot/vmlinuz-3.13.0-53-generic",
"console": "ttyS0",
"ro": true,
"root": "UUID=74067709-41f2-4c31-95fb-9e71e95977b1"
},
"ansible_date_time": {
"date": "2015-06-17",
"day": "17",
"epoch": "1434548591",
"hour": "13",
"iso8601": "2015-06-17T13:43:11Z",
"iso8601_micro": "2015-06-17T13:43:11.114545Z",
"minute": "43",
"month": "06",
"second": "11",
"time": "13:43:11",
"tz": "UTC",
"tz_offset": "+0000",
"weekday": "Wednesday",
"year": "2015"
},
(snip)
"uuid": "NA"
}
],
"ansible_nodename": "767187c7c66d",
"ansible_os_family": "RedHat",
"ansible_pkg_mgr": "yum",
"ansible_processor": [
"GenuineIntel",
"Intel(R) Core(TM) i7-4650U CPU @ 1.70GHz"
],
"ansible_processor_cores": 1,
"ansible_processor_count": 1,
"ansible_processor_threads_per_core": 1,
"ansible_processor_vcpus": 1,
"ansible_product_name": "VirtualBox",
"ansible_product_serial": "NA",
"ansible_product_uuid": "NA",
"ansible_product_version": "1.2",
"ansible_python_version": "2.6.6",
"ansible_selinux": false,
"ansible_ssh_host_key_dsa_public": "AAAAB3NzaC1kc3MAAACBALYuwGoXfZ466L/GXIoXEiA/GEgbw3ukhIExYcZXfEMtaJKldlEqRgrNrZRFg3sl8puOuB7b/8Fl2qhYaAU/u6YeDGnS06Swh2Cge/bknNUOE3jWnqEaauoycIzE9qwxj5jwyUvDv+nJ3Yz+aI0aWaXBbyurUfQ2imZKX33NYBHfAAAAFQC5HkOwPB+e/U1W+CL9ZoPwwWZcxwAAAIAX53f2ms6t+e4E+9Ui+7vjiQWz6xWZrudvEfjqvskJHcCiA+NDkHAMcLd0wfijxgTE98tTrVJXygjA90EKzj2Fn1nhbJW5myEM/sBdMKU8DxXAOmOeL1Hk13iiGNw3yRWBIXpi+PSbFmILIzcwX0LjnYTPcutPlh3mYqgxfZdmtQAAAIB8tWmw8AjBY9TqYrR+UxaZtQ4i4sqwdwVDGYCXKreeg7sHpkKIuSoXx4Ur/3r2Pk5T2lbWrRi3LQ4EE9bbSYfR5GD+xwdRAiEnUX/A7nj5QzB6oWMml9Q19yT0yDgaC1pU1SEpDSrM6iBk7Ry5Xld8/E4DaVBszHYfaZL2LCsSCQ==",
"ansible_ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAABIwAAAQEA2W5Mz8+zCBOwWUjIZFtUg+gKs7KcpLkx2tmwwrA0ZysVk5NGy2N01jAYeNBXypgiAPPLsgqeI9LjDESEj8r7XnLyo1dcIM7+YICGWRZAOa+YDTrrgmQ1603ZV9CycoGiRejkaOjs2AW0Gn45YkH/+Pdrc4gL3NV/DfJUC9l6aXV7vSsPm65tkVZfXtJwU+lCYKyvOzMnvhb5L8YUhUaRNLbXUXvRcFLeKTNR6KHEL13VtywRh6ezzcvPiXRCNBviikCqNu1u/YZ1uI/2ZgliCmSOQywi+QIlhkE/zWjGFCR5jh0S1+9fi827sFNlb/DDnS/inJK7QM0yVX+aU+OM2w==",
"ansible_swapfree_mb": 0,
"ansible_swaptotal_mb": 0,
"ansible_system": "Linux",
"ansible_system_vendor": "innotek GmbH",
"ansible_user_dir": "/home/ansible",
"ansible_user_gecos": "",
"ansible_user_gid": 500,
"ansible_user_id": "ansible",
"ansible_user_shell": "/bin/bash",
"ansible_user_uid": 500,
"ansible_userspace_architecture": "x86_64",
"ansible_userspace_bits": "64",
"ansible_virtualization_role": "guest",
"ansible_virtualization_type": "docker",
"module_setup": true
},
"changed": false
}
上記の出力結果は Docker コンテナが対象となる場合の出力例。
尚、ansible_os_family に RedHat が含まれている環境に対して適用する場合には以下のように...
- name: hogehoge shell: echo "hogehoge" when: "ansible_os_family == 'RedHat'"
ってな感じで書く。
但し、Amazon Linux であれば...
正攻法
ところがどっこい Amazon Linux だけ何かさせたいと思った時に ansible_os_family ではなくて ansible_distribution を使えば良さそう。
- name: hogehoge for Amazon Linux shell: echo "hogehoge" when: "ansible_distribution == 'Amazon'"
ちょっと強引
ちょっと強引かもしれないけど、以下のように "'Amazon' in ansible_distribution" という書き方でもイケた。
- name: update ntpd for amazon linux shell: yum install ntp when: "'Amazon' in ansible_distribution"
'foo' in xxxxxxx を利用すれば fact で取得した xxxxxxx の値が foo に完全一致していなくても条件として合致することが出来るので、foo バージョン番号 みたいな場合にも利用出来そう。