ansible_hostname in with_items

445 views
Skip to first unread message

Bachu Prathap

unread,
Jun 27, 2018, 7:03:55 AM6/27/18
to Ansible Project
Hi Team

I am writing a playbook to automate assigning an IP address to a set of hosts, however, I am stuck at pulling IP details from vars_files. below is the code, any pointers will be much helpful to me. thank you.

vars_files:

[root@dljdaprdqmc1v commvault]# cat host_ip.yml
dlabcpdtmdb1v: 172.20.0.63
[root@dljdaprdqmc1v commvault]#

[root@dljdaprdqmc1v commvault]# cat check_ip.yml
---
- hosts: all
  remote_user: root
  vars_files:
  - host_ip.yml
  tasks:
  - shell: ip  a s | grep DOWN | /bin/awk -F":" '{$2=$2;print}' | /bin/awk '{print $2}'
    register: nic
    ignore_errors: yes
  - stat: path=/etc/sysconfig/network-scripts/ifcfg-{{nic.stdout}}
    register: nicfile
    ignore_errors: yes
  - lineinfile: path=/tmp/ifcfg-{{nic.stdout}} line={{item}} create=yes
    with_items:
    - TYPE=Ethernet
    - BOOTPROTO=static
    - DEFROUTE=yes
    - PEERDNS=yes
    - PEERROUTES=yes
    - IPV4_FAILURE_FATAL=no
    - IPV6INIT=no
    - IPV6_AUTOCONF=no
    - IPV6_DEFROUTE=no
    - IPV6_PEERDNS=no
    - IPV6_PEERROUTES=no
    - IPV6_FAILURE_FATAL=no
    - NAME={{nic.stdout}}
    - DEVICE={{nic.stdout}}
    - ONBOOT=yes
    - IPADDR="{{ansible_hostname}}" <== here i need to get value from host_ip.yml which allocate that host
    - NETMASK=255.255.252.0
    when: nicfile.stat.exists == false
[root@dljdaprdqmc1v commvault]#


[root@dljdaprdqmc1v commvault]# ansible-playbook -i list_test check_ip.yml

PLAY [all] ********************************************************

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

TASK [command] ******************************************************
changed: [dlabcpdtmdb1v]

TASK [stat] *******************************************************
ok: [dlabcpdtmdb1v]

TASK [lineinfile] *****************************************************
ok: [dlabcpdtmdb1v] => (item=TYPE=Ethernet)
ok: [dlabcpdtmdb1v] => (item=BOOTPROTO=static)
ok: [dlabcpdtmdb1v] => (item=DEFROUTE=yes)
ok: [dlabcpdtmdb1v] => (item=PEERDNS=yes)
ok: [dlabcpdtmdb1v] => (item=PEERROUTES=yes)
ok: [dlabcpdtmdb1v] => (item=IPV4_FAILURE_FATAL=no)
ok: [dlabcpdtmdb1v] => (item=IPV6INIT=no)
ok: [dlabcpdtmdb1v] => (item=IPV6_AUTOCONF=no)
ok: [dlabcpdtmdb1v] => (item=IPV6_DEFROUTE=no)
ok: [dlabcpdtmdb1v] => (item=IPV6_PEERDNS=no)
ok: [dlabcpdtmdb1v] => (item=IPV6_PEERROUTES=no)
ok: [dlabcpdtmdb1v] => (item=IPV6_FAILURE_FATAL=no)
ok: [dlabcpdtmdb1v] => (item=NAME=eth2)
ok: [dlabcpdtmdb1v] => (item=DEVICE=eth2)
ok: [dlabcpdtmdb1v] => (item=ONBOOT=yes)
changed: [dlabcpdtmdb1v] => (item=IPADDR=dlabcpdtmdb1v)
ok: [dlabcpdtmdb1v] => (item=NETMASK=255.255.252.0)

PLAY RECAP ********************************************************
dlabcpdtmdb1v              : ok=4    changed=2    unreachable=0    failed=0

[root@dljdaprdqmc1v commvault]#

Regards
Pratap Bachu

Kai Stian Olstad

unread,
Jun 30, 2018, 6:48:43 AM6/30/18
to ansible...@googlegroups.com
<snip />

> changed: [dlabcpdtmdb1v] => (item=IPADDR=dlabcpdtmdb1v)
> ok: [dlabcpdtmdb1v] => (item=NETMASK=255.255.252.0)

as you see IP becomes the hostname, since you need the content of the
variable with the same name as the host you need to use
vars/hostvars/lookup vars.

So {{ vars[ansible_hostname] }} would give you that, but vars is not a
documented feature that is schedule for removal.

So you are left with more unreadable code like

{{ hostvars[inventory_hostname][ansible_hostname] }}

or

{{ lookup('vars', ansible_hostname }}

--
Kai Stian Olstad

Bachu Prathap

unread,
Jul 8, 2018, 11:39:53 PM7/8/18
to Ansible Project
Thanks a lot Kai Stian, it worked well.
Reply all
Reply to author
Forward
0 new messages