Ansibleのfactを使ってシステム変数を取得する

Ansibleのfactsを使って、システム変数を取得する

- 公式ドキュメント
  - https://docs.ansible.com/ansible/2.7/user_guide/playbooks_variables.html


- playbookで `gather_facts: yes` に設定する

```
- hosts: role_bastion
  user: ubuntu
  become_method: sudo
  gather_facts: yes

  roles:
    - verifi
```




```tasks/main.yml
---
- name: echo environment
  debug:
    var: "{{ item }}"
  with_items:
    - "{{ env }}"

- name: print ansible variables
  debug:
    var: '{{ item }}'
  with_items:
    - inventory_hostname
    - ansible_os_family
    - ansible_distribution
    - ansible_distribution_version
    - ansible_kernel
    - ansible_architecture
    - ansible_default_ipv4.address
    - ansible_default_ipv4.interface
    - ansible_default_ipv4.netmask
    - ansible_default_ipv4.network
    - ansible_dns.nameservers
    - ansible_effective_user_id
    - ansible_effective_group_id
    - ansible_env.HOME
    - ansible_env.SHELL
    - ansible_eth0.ipv4.address
    - ansible_processor_cores
    - ansible_processor_vcpus

- name: output env parameter as file
  template:
    src: env_params.j2
    dest: /home/ubuntu/output_params_ansible_facs
    owner: ubuntu
    group: ubuntu
    mode: 0644
```


```templates/main.yml
{{ inventory_hostname }}
{{ ansible_os_family }}
{{ ansible_distribution }}
{{ ansible_distribution_version }}
{{ ansible_kernel }}
{{ ansible_architecture }}
{{ ansible_default_ipv4.address }}
{{ ansible_default_ipv4.interface }}
{{ ansible_default_ipv4.netmask }}
{{ ansible_default_ipv4.network }}
{{ ansible_dns.nameservers }}
{{ ansible_effective_user_id }}
{{ ansible_effective_group_id }}
{{ ansible_env.HOME }}
{{ ansible_env.SHELL }}
{{ ansible_eth0.ipv4.address }}
{{ ansible_processor_cores }}
{{ ansible_processor_vcpus }}
```


- 実行結果

```
PLAY [role_bastion] ********************************************************************************************

TASK [Gathering Facts] *****************************************************************************************
ok: [localhost]

TASK [verifi : echo environment] *******************************************************************************
ok: [localhost] => (item=dev) => {
    "dev": "VARIABLE IS NOT DEFINED!",
    "item": "dev"
}

TASK [verifi : print ansible variables] ************************************************************************
ok: [localhost] => (item=inventory_hostname) => {
    "inventory_hostname": "localhost",
    "item": "inventory_hostname"
}
ok: [localhost] => (item=ansible_os_family) => {
    "ansible_os_family": "Debian",
    "item": "ansible_os_family"
}
ok: [localhost] => (item=ansible_distribution) => {
    "ansible_distribution": "Ubuntu",
    "item": "ansible_distribution"
}
ok: [localhost] => (item=ansible_distribution_version) => {
    "ansible_distribution_version": "16.04",
    "item": "ansible_distribution_version"
}
ok: [localhost] => (item=ansible_kernel) => {
    "ansible_kernel": "4.4.0-1072-aws",
    "item": "ansible_kernel"
}
ok: [localhost] => (item=ansible_architecture) => {
    "ansible_architecture": "x86_64",
    "item": "ansible_architecture"
}
ok: [localhost] => (item=ansible_default_ipv4.address) => {
    "ansible_default_ipv4.address": "10.0.1.113",
    "item": "ansible_default_ipv4.address"
}
ok: [localhost] => (item=ansible_default_ipv4.interface) => {
    "ansible_default_ipv4.interface": "eth0",
    "item": "ansible_default_ipv4.interface"
}
ok: [localhost] => (item=ansible_default_ipv4.netmask) => {
    "ansible_default_ipv4.netmask": "255.255.255.0",
    "item": "ansible_default_ipv4.netmask"
}
ok: [localhost] => (item=ansible_default_ipv4.network) => {
    "ansible_default_ipv4.network": "10.0.1.0",
    "item": "ansible_default_ipv4.network"
}
ok: [localhost] => (item=ansible_dns.nameservers) => {
    "ansible_dns.nameservers": [
        "10.0.0.2"
    ],
    "item": "ansible_dns.nameservers"
}
ok: [localhost] => (item=ansible_effective_user_id) => {
    "ansible_effective_user_id": 1000,
    "item": "ansible_effective_user_id"
}
ok: [localhost] => (item=ansible_effective_group_id) => {
    "ansible_effective_group_id": 1000,
    "item": "ansible_effective_group_id"
}
ok: [localhost] => (item=ansible_env.HOME) => {
    "ansible_env.HOME": "/home/ubuntu",
    "item": "ansible_env.HOME"
}
ok: [localhost] => (item=ansible_env.SHELL) => {
    "ansible_env.SHELL": "/bin/bash",
    "item": "ansible_env.SHELL"
}
ok: [localhost] => (item=ansible_eth0.ipv4.address) => {
    "ansible_eth0.ipv4.address": "10.0.1.113",
    "item": "ansible_eth0.ipv4.address"
}
ok: [localhost] => (item=ansible_processor_cores) => {
    "ansible_processor_cores": 1,
    "item": "ansible_processor_cores"
}
ok: [localhost] => (item=ansible_processor_vcpus) => {
    "ansible_processor_vcpus": 2,
    "item": "ansible_processor_vcpus"
}

TASK [verifi : output env parameter as file] *******************************************************************
--- before
+++ after: /home/ubuntu/.ansible/tmp/ansible-local-3830A34Lzo/tmpJscd8s/env_params.j2
@@ -0,0 +1,18 @@
+localhost
+Debian
+Ubuntu
+16.04
+4.4.0-1072-aws
+x86_64
+10.0.1.113
+eth0
+255.255.255.0
+10.0.1.0
+[u'10.0.0.2']
+1000
+1000
+/home/ubuntu
+/bin/bash
+10.0.1.113
+1
+2

changed: [localhost]

PLAY RECAP *****************************************************************************************************
localhost                  : ok=4    changed=1    unreachable=0    failed=0
```

- `$ cat output_params_ansible_facs`

```
localhost
Debian
Ubuntu
16.04
4.4.0-1072-aws
x86_64
10.0.1.113
eth0
255.255.255.0
10.0.1.0
[u'10.0.0.2']
1000
1000
/home/ubuntu
/bin/bash
10.0.1.113
1
2
```

# まとめ
ansible_factを利用して様々なシステム情報を取得することができた。
これで、システム変数を利用したplaybookやtasksを条件に応じた定義をすることができる。