Contents
Accessing variables programatically
The Ansible FAQ details how to build up varibles programatically.
{{ hostvars[inventory_hostname]['ansible_' + which_interface]['ipv4']['address'] }}In order to access concatenated variables they need to be in the inventory. This doesn’t happen with vars inline in the playbook but does work if you use include_vars
1
2
3
4
5
6
7
8
- hosts: localhost
  connection: local
  vars:
    test_app: admin
  tasks:
    - include_vars: concat_vars.yml
    - debug:
        msg: "admin port from inventory = {{ hostvars[inventory_hostname][test_app+'_port'] }}
admin_port: 1000TASK: [debug ] ****************************************************************
ok: [localhost] => {
    "msg": "admin port from inventory = 1000"
}Dictionaries
The following example shows how you can iterate over a dict and access directly
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- hosts: localhost
  connection: local
  vars:
    apps:
      admin:
        service: admin
        handler: /admin
        port: 1200
      rpt:
        service: rpt
        handler: /rpt
        port: 1234
  tasks:
    - debug:
        msg: "{{ item.key }} -- {{ item.value.service }} {{ item.value.port }}"
      with_dict: apps
    - debug:
        msg: "{{ apps.admin.service }}"
TASK: [debug ] ****************************************************************
ok: [localhost] => (item={'key': 'admin', 'value': {'handler': '/admin', 'port': 1200, 'service': 'admin'}}) => {
    "item": {
        "key": "admin",
        "value": {
            "handler": "/admin",
            "port": 1200,
            "service": "admin"
        }
    },
    "msg": "admin -- admin 1200"
}
ok: [localhost] => (item={'key': 'rpt', 'value': {'handler': '/rpt', 'port': 1234, 'service': 'rpt'}}) => {
    "item": {
        "key": "rpt",
        "value": {
            "handler": "/rpt",
            "port": 1234,
            "service": "rpt"
        }
    },
    "msg": "rpt -- rpt 1234"
}Looping over dictionaries
Sometimes its necessary to loop over a list of dictionaries. The following example has a dictionary with 3 keys
- name: Configure environment
  template: src={{ item.src }} dest={{ item.dest }} mode={{ item.mode }} owner=root group=root
  with_items:
    - { src: 'hosts.equiv.j2',   dest: '/etc/hosts.equiv',                mode: '0644' }
    - { src: 'informix.conf.j2', dest: '/etc/ld.so.conf.d/informix.conf', mode: '0444' }
    - { src: 'informix.csh.j2',  dest: '/etc/profile.d/informix.csh',     mode: '0644' }
    - { src: 'informix.init.j2', dest: '/etc/init.d/informix',            mode: '0755' }
    - { src: 'informix.sh.j2',   dest: '/etc/profile.d/informix.sh',      mode: '0644' }
  notify:
    - Reload ldconfigChecking if a value is in a multiple lists
We have a situation where we want to install applications on a number of hosts. This information needs to be available to all hosts as its used by Apache in the web tier and on the db tier. The information is stored in group_vars/all to allow global access.
app_layout:
  admin:
    groups: ['group-boapp-layout-A', 'group-boapp-layout-B']
  rpt:
    groups: ['group-boapp-layout-A']- name: Establish if application can be installed on host
  set_fact:
    install_app: true
  when: inventory_hostname in groups[item]
  with_flattened: app_layout.groups
- include: app.yml
  when: install_app == trueThe fact install_app will only be set if the current inventory_hostname is in each of the lists. group-boapp-layout-A and group-boapp-layout-B expand to
"all": [
      "ec2-test-boapp03",
      "ec2-test-boapp04",
      "ec2-test-boapp01",
      "ec2-test-boapp02"
  ],
  "group-boapp-layout-A": [
      "ec2-test-boapp01",
      "ec2-test-boapp02"
  ],
  "group-boapp-layout-B": [
      "ec2-test-boapp03",
      "ec2-test-boapp04"
  ],TASK: [app-appserv | Establish if application can be installed on host] ***
skipping: [ec2-test-boapp03] => (item=group-boapp-layout-A)
skipping: [ec2-test-boapp04] => (item=group-boapp-layout-A)
ok: [ec2-test-boapp02] => (item=group-boapp-layout-A)
ok: [ec2-test-boapp03] => (item=group-boapp-layout-B)
skipping: [ec2-test-boapp02] => (item=group-boapp-layout-B)
ok: [ec2-test-boapp01] => (item=group-boapp-layout-A)
ok: [ec2-test-boapp04] => (item=group-boapp-layout-B)
skipping: [ec2-test-boapp01] => (item=group-boapp-layout-B)