Deploy variables in Playbook

Ansible also allows you to put variables into one or more files, using a section called vars_files.

Let’s say we wanted to take the preceding example and put the variables in a file named nginx.yml instead of putting them right in the playbook. We would replace the vars section with a vars_files that looks like this:

vars_files:
- nginx.yml

The nginx.yml file would look like:

key_file: /etc/nginx/ssl/nginx.key
cert_file: /etc/nginx/ssl/nginx.cr

 

View the values of Variables

We can use debug module to output the value of the variable. It works like this:
- debug: var=myvarname

The value of a variable set using the register clause is always a dictionary, but the specific keys of the dictionary are different, depending on the module that was invoked.

The simplest way to find out what a module returns is to register a variable and then output that variable with the debug module.

The output:

1. The changed key is present in the return value of all Ansible modules, and Ansible uses it to determine whether a state change has occurred. For the command
and shell module, this will always be set to true unless overridden with the changed_when clause.
2. The
cmd key contains the invoked command as a list of strings.
3. The
rc key contains the return code. If it is non-zero, Ansible will assume the task failed to execute.
4. The
stderr key contains any text written to standard error, as a single string.

Sometimes it’s useful to do something with the output of a failed task. However, if the task fails, then Ansible will stop executing tasks for the failed host. We can use the ignore_errors: True clause to let ansible keep on working.

Access Dictionary keys

If a variable contains a dictionary, then you can access the keys of the dictionary using either a dot (.) or a subscript ([]).

all of the following are equivalent:
ansible_eth1[‘ipv4’][‘address’] ansible_eth1[‘ipv4’].address
ansible_eth1.ipv4[‘address’] ansible_eth1.ipv4.address

Facts

Before Ansible runs a playbook, Ansible gathers facts, it connects to the host and queries the host for all kinds of details about the host: CPU architecture, operating system, IP addresses, memory info, disk info, and more.  This information is stored in variables that are called facts .

Ansible get the facts by using of a special module called the setup module. You don’t need to call this module in your playbooks because Ansible does that automatically when it gathers facts.

setup module supports a filter parameter that lets you filter by fact name.

For example: $ ansible web -m setup -a 'filter=ansible_eth*'

Local Facts

Ansible also provides an additional mechanism for associating facts with a host. You can place one or more files on the host machine in the /etc/ansible/facts.d directory.

Ansible will recognize the file if it’s:

• In .ini format
• In JSON format
• An executable that takes no arguments and outputs JSON on standard out

 

Variables

 

Built-in Variables

 

 

Parameter Description
hostvars A dict whose keys are Ansible host names and values are dicts that map variable names to values
inventory_hostname Name of the current host as known by Ansible
group_names A list of all groups that the current host is a member of
groups A dict whose keys are Ansible group names and values are a list of hostnames that are members of the
group. Includes all and ungrouped groups: {“all”: […], “web”: […], “ungrou
ped”: […]}
play_hosts A list of inventory hostnames that are active in the current play
ansible_version A dict with Ansible version info: {“full”: 1.8.2″, “major”: 1, “minor”: 8,
“revision”: 2, “string”: “1.8.2”}

 

Variables set by passing -e var=value to ansible-playbook have the highest precedence.

For example, in greet.yml:

- name: pass a message on the command line
  hosts: localhost
  vars:
    greeting: "you didn't specify a message"
  tasks:
    - name: output a message
      debug: msg="{{ greeting }}" 

If you want to put a space in the variable, you’ll need two use quotes like this:

$ ansible-playbook greet.yml -e 'greeting="hi there"'

The basic rules of precedence are:
1. (Highest)
ansible-playbook -e var=value
2. Everything else not mentioned in this list
3. On a host or group, either defined in inventory file or YAML file
4. Facts
5. In
defaults/main.yml of a role.