This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
ansible:ansible_variables [2021/08/25 22:37] manu |
ansible:ansible_variables [2025/05/21 16:24] (current) manu |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Ansible variables ====== | ====== Ansible variables ====== | ||
- | Understanding variable precedence | + | ===== Understanding variable precedence ===== |
Ansible does apply variable precedence, and you might have a use for it. Here is the order of precedence from least to greatest (the last listed variables override all other variables): | Ansible does apply variable precedence, and you might have a use for it. Here is the order of precedence from least to greatest (the last listed variables override all other variables): | ||
Line 29: | Line 29: | ||
In general, Ansible gives precedence to variables that were defined more recently, more actively, and with more explicit scope. Variables in the defaults folder inside a role are easily overridden. Anything in the vars directory of the role overrides previous versions of that variable in the namespace. Host and/or inventory variables override role defaults, but explicit includes such as the vars directory or an include_vars task override inventory variables. | In general, Ansible gives precedence to variables that were defined more recently, more actively, and with more explicit scope. Variables in the defaults folder inside a role are easily overridden. Anything in the vars directory of the role overrides previous versions of that variable in the namespace. Host and/or inventory variables override role defaults, but explicit includes such as the vars directory or an include_vars task override inventory variables. | ||
+ | |||
+ | ===== Example in a playbook ===== | ||
+ | |||
+ | Ex: yml file | ||
+ | <code> | ||
+ | - hosts: webservers | ||
+ | vars: | ||
+ | http_port: 80 | ||
+ | base_path: http://ansibile.local/wiki | ||
+ | app_path: {{ base_path }}/{{ http_port }} | ||
+ | </code> | ||
+ | |||
+ | ===== variables: facts ===== | ||
+ | |||
+ | Facts are variable collected each time you contact a client. It contains IP adresses, OS type, level, hardware.... | ||
+ | |||
+ | To improve you ansible command, you can use cache on server into /etc/ansible/ansible.cfg (here cache is valid for 1 hour) | ||
+ | <code> | ||
+ | [defaults] | ||
+ | fact_caching = jsonfile | ||
+ | fact_caching_timeout = 3600 | ||
+ | fact_caching_connection = /tmp/myfacts | ||
+ | </code> | ||
+ | |||
+ | You can call them on the ansible server by using the command (xml output): | ||
+ | <cli prompt='#'> | ||
+ | opensuse:~ # ansible -m setup localhost | ||
+ | localhost | SUCCESS => { | ||
+ | "ansible_facts": { | ||
+ | "ansible_all_ipv4_addresses": [ | ||
+ | "10.1.3.22" | ||
+ | ], | ||
+ | "ansible_all_ipv6_addresses": [ | ||
+ | "fe80::209a:12e0:e8a7:8ea" | ||
+ | ], | ||
+ | "ansible_apparmor": { | ||
+ | "status": "enabled" | ||
+ | }, | ||
+ | "ansible_architecture": "x86_64", | ||
+ | "ansible_cmdline": { | ||
+ | "BOOT_IMAGE": "/boot/vmlinuz-4.12.14-lp151.28.91-default", | ||
+ | |||
+ | }, | ||
+ | "ansible_date_time": { | ||
+ | "date": "2021-09-13", | ||
+ | "day": "13", | ||
+ | "epoch": "1631520866", | ||
+ | "hour": "10", | ||
+ | "minute": "14", | ||
+ | "month": "09", | ||
+ | "second": "26", | ||
+ | "time": "10:14:26", | ||
+ | "tz": "CEST", | ||
+ | "tz_offset": "+0200", | ||
+ | "weekday": "Monday", | ||
+ | "weekday_number": "1", | ||
+ | "weeknumber": "37", | ||
+ | "year": "2021" | ||
+ | }, | ||
+ | ... | ||
+ | "ansible_distribution": "openSUSE Leap", | ||
+ | "ansible_distribution_file_parsed": true, | ||
+ | "ansible_distribution_file_path": "/etc/os-release", | ||
+ | "ansible_distribution_file_variety": "SUSE", | ||
+ | "ansible_distribution_major_version": "15", | ||
+ | "ansible_distribution_release": "1", | ||
+ | "ansible_distribution_version": "15.1", | ||
+ | </cli> | ||
+ | |||
+ | Example of facts on AIX | ||
+ | <code> | ||
+ | { | ||
+ | "_ansible_facts_gathered": true, | ||
+ | "ansible_all_ipv4_addresses": [ | ||
+ | "10.10.10.100" | ||
+ | ], | ||
+ | "ansible_all_ipv6_addresses": [ | ||
+ | "::1%1" | ||
+ | ], | ||
+ | "ansible_apparmor": { | ||
+ | "status": "disabled" | ||
+ | }, | ||
+ | "ansible_architecture": "chrp", | ||
+ | "ansible_date_time": { | ||
+ | ... | ||
+ | }, | ||
+ | "ansible_distribution": "AIX", | ||
+ | "ansible_distribution_major_version": "7", | ||
+ | "ansible_distribution_release": "2", | ||
+ | "ansible_distribution_version": "7.2", | ||
+ | "ansible_nodename": "myaixhost", | ||
+ | "ansible_os_family": "AIX", | ||
+ | "ansible_pkg_mgr": "yum", | ||
+ | "ansible_processor": "PowerPC_POWER8", | ||
+ | "ansible_processor_cores": 8, | ||
+ | "ansible_processor_count": 1, | ||
+ | "ansible_product_name": "IBM,8284-22A", | ||
+ | "ansible_product_serial": "21xxxxV", | ||
+ | |||
+ | </code> | ||
+ | |||
+ | Example on linux ppc64le | ||
+ | <code> | ||
+ | { | ||
+ | "_ansible_facts_gathered": true, | ||
+ | "ansible_all_ipv4_addresses": [ | ||
+ | "10.x.x.x0" | ||
+ | ], | ||
+ | "ansible_all_ipv6_addresses": [ | ||
+ | "fe80::5b6c:b599:xxx9:xxxc" | ||
+ | ], | ||
+ | "ansible_apparmor": { | ||
+ | "status": "disabled" | ||
+ | }, | ||
+ | "ansible_architecture": "ppc64le", | ||
+ | "ansible_bios_date": "NA", | ||
+ | "ansible_bios_vendor": "NA", | ||
+ | "ansible_bios_version": "NA", | ||
+ | "ansible_board_asset_tag": "NA", | ||
+ | "ansible_board_name": "NA", | ||
+ | "ansible_board_serial": "NA", | ||
+ | "ansible_board_vendor": "NA", | ||
+ | "ansible_board_version": "NA", | ||
+ | "ansible_chassis_asset_tag": "NA", | ||
+ | "ansible_chassis_serial": "NA", | ||
+ | "ansible_chassis_vendor": "NA", | ||
+ | "ansible_chassis_version": "NA", | ||
+ | "ansible_cmdline": { | ||
+ | "BOOT_IMAGE": "/vmlinuz-4.18.0-240.el8.ppc64le", | ||
+ | "ansible_distribution": "CentOS", | ||
+ | "ansible_distribution_file_parsed": true, | ||
+ | "ansible_distribution_file_path": "/etc/redhat-release", | ||
+ | "ansible_distribution_file_variety": "RedHat", | ||
+ | "ansible_distribution_major_version": "8", | ||
+ | "ansible_distribution_release": "NA", | ||
+ | "ansible_distribution_version": "8.4", | ||
+ | "ansible_nodename": "mylnxhost", | ||
+ | "ansible_os_family": "RedHat", | ||
+ | |||
+ | </code> | ||
+ | |||
+ | ==== How to Create and Use Custom Facts in Ansible ==== | ||
+ | |||
+ | Custom facts (local facts) are the variables which are declared on ansible managed host. Custom facts are declared in ini or json file in the /etc/ansible/facts.d directory on managed host. File names of custom facts must have .fact extension. | ||
+ | |||
+ | https://www.linuxtechi.com/create-use-custom-facts-in-ansible/ | ||
+ | |||
+ | |||
+ | Get the value of a variable Ex: var1 | ||
+ | <cli prompt='#'> | ||
+ | opensuse:~ # ansible -i "node2," all -e "var1=toto" -m debug -a 'msg={{ var1 }}' | ||
+ | </cli> | ||
+ | |||
+ | ===== Ansible inventory ===== | ||
+ | |||
+ | <cli prompt='$'> | ||
+ | $ ansible --version | grep 'config file' | ||
+ | config file = /home/tux/.ansible.cfg | ||
+ | $ ansible-config dump --only-changed | ||
+ | DEFAULT_BECOME(/home/tux/.ansible.cfg) = True | ||
+ | DEFAULT_BECOME_METHOD(/home/tux/.ansible.cfg) = sudo | ||
+ | DEFAULT_HOST_LIST(/home/tux/.ansible.cfg) = ['/home/tux/ | ||
+ | inventory'] | ||
+ | DEFAULT_REMOTE_USER(/home/tux/.ansible.cfg) = ansible | ||
+ | </cli> | ||
+ | |||
+ | List all hosts, use the keyword **all**. To specify all host not in a group use **ungrouped** | ||
+ | <cli prompt='$'> | ||
+ | $ ansible all --list-hosts | ||
+ | hosts (21): | ||
+ | green.example.com | ||
+ | blue.example.com | ||
+ | 192.168.100.1 | ||
+ | 192.168.100.10 | ||
+ | alpha.example.org | ||
+ | beta.example.org | ||
+ | www001.example.com | ||
+ | www002.example.com | ||
+ | www003.example.com | ||
+ | db-99-node.example.com | ||
+ | db-100-node.example.com | ||
+ | db-101-node.example.com | ||
+ | </cli> | ||
+ | |||
+ | List the group webservers | ||
+ | <cli prompt='$'> | ||
+ | $ ansible webservers --list-hosts | ||
+ | hosts (10): | ||
+ | alpha.example.org | ||
+ | beta.example.org | ||
+ | 192.168.1.100 | ||
+ | 192.168.1.110 | ||
+ | www001.example.com | ||
+ | www002.example.com | ||
+ | www003.example.com | ||
+ | </cli> | ||
+ | |||
+ | Print inventory in YML format | ||
+ | <cli prompt='$'> | ||
+ | $ ansible-inventory --list --yaml | ||
+ | all: | ||
+ | children: | ||
+ | ungrouped: | ||
+ | hosts: | ||
+ | 172.16.120.161: {} | ||
+ | 172.16.120.185: {} | ||
+ | 172.16.120.188: {} | ||
+ | </cli> | ||
+ | |||
+ | ===== Custom variable ===== | ||
+ | |||
+ | ==== Time / date ==== | ||
+ | |||
+ | <code> | ||
+ | - hosts: test | ||
+ | vars: | ||
+ | time: "{{ lookup('pipe', 'date -d \"1 day ago\" +\"%Y%m%d\"') }}" | ||
+ | </code> | ||
+ | |||
+ |