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_familyRedHat が含まれている環境に対して適用する場合には以下のように…

- 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 バージョン番号 みたいな場合にも利用出来そう。

元記事はこちら

Ansible で Amazon Linux を判断させる為の正攻法とちょっと強引なやり方