My main objective is, I want to create a playbook with one task which will 
take list of docker images and list of hosts and then run one image on one 
host respectively or run list of images on one of host list supplied.
To make it clear on understanding consider below declaration

hostImageList:
   - { hostList: { host: 'abc' }, imageList: { cName: 'tomcatNewImg', iName: 
'tomcat:latest', iPort: 9999, volumes: '/temp' } }
   - { hostList: { host: 'xyz'}, imageList: { cName: 'nginxNewImg', iName: 
'nginx:latest', iPort: 8888, volumes: '/data' } }

abc and xyz are defined in my ansible/hosts file. Now tomcat image should 
be run on abc host and
nginx image on xyz.

There might be a need where I might need both tomcat , nginx on abc .

So, my playbook should be able to achieve this.

I was having challenges to loop hosts and image list together in a task in 
playbook.

*So to achieve this, I am trying as below -*

Wrote a playbook with a task which will take list of docker images to be 
run and run the images on the host name supplied through command prompt. I 
am using docker-container module of ansible for this.

I am have file img_vars.yml in which I have defined my list of items to be 
used in my playbook.
I need to pass the variable defined in this yml to playbook from commmand 
prompt to with_items
ISSUE TYPE 
   
   - Bug Report

COMPONENT NAME 

Ansible : 2.7.10
Am using with_items to loop
ANSIBLE VERSION 

Ansible: 2.7.10
CONFIGURATION 

REDHAT 7.x with ANSIBLE and docker pip module installed
OS / ENVIRONMENT 

REDHAT 7.x
STEPS TO REPRODUCE 

Created below yml files:

img_vars.yml

---
 imageList:
   - { cName: 'tomcatImg', iName: 'tomcat:latest', iPort: 9999, volumes: 
'/temp' }

 imageNginxList:
   - { cName: 'nginxImg', iName: 'nginx:latest', iPort: 8001, volumes: '/data' }

 hostImageList:
   - { hostList: { host: 'abc', user: 'tcs', pwd: 'tcs@12345' }, imageList: { 
cName: 'tomcatNewImg', iName: 'tomcat:latest', iPort: 9999, volumes: '/temp' } }
   - { hostList: { host: 'xyz', user: 'tcs', pwd: 'tcs@12345' }, imageList: { 
cName: 'nginxNewImg', iName: 'nginx:latest', iPort: 8888, volumes: '/data' } }

my main playbook yml file

---
- name: Ansible Looping Expirement
  hosts: "{{ gethostname  }}"
  gather_facts: true
  become: yes
  become_method: sudo
  vars_files:
    - img_vars.yml
  tasks:
   - name: Installing docker images using loops in Ansible
     docker_container:
        name: "{{ item.cName }}"
        image: "{{ item.iName }}"
        state: started
#        exposed_ports:
#           - "{{ item.iPort }}"
        volumes: "{{ item.volumes }}"
     with_items:  "{{ ' getwithlist' }}"


Running my playbook with below command
ansible-playbook --ask-become-pass main.yml --extra-vars "gethostname=abc 
getwithlist=imageList"

Here I am trying to pass "imageList" which is defined in img_vars.yml from 
command prompt through getwithlist variable.
EXPECTED RESULTS 

Playbook executed successfully and run docker image "tomcat" on host 
supplied through gethostname .

getwithlist in with_items should be replaced by imageList and the value of 
imageList in img_vars.yml should be picked up in with_items. So if this 
variable replacement happens correctly, tomcat image will be running on 
remote host.

When I want to install another image on another host, i will run playbooks 
with changed parameters as below :
ansible-playbook --ask-become-pass main.yml --extra-vars "gethostname=xyz 
getwithlist=imageNginxList"
ACTUAL RESULTS 

Am getting below error

"msg": "The task includes an option with an undefined variable. The error 
was: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 
'iName'\n\nThe error appears to have been in 
'/u01/HomeDir/e166110/ansible_poc/loops/dynamic_loop_docker.yml': line 10, 
column 6, but may\nbe elsewhere in the file depending on the exact syntax 
problem.\n\nThe offending line appears to be:\n\n tasks:\n - name: 
Installing docker images using loops in Ansible\n ^ here\n"

Am doing a mistake but not sure where am doing. Can someone guide me please 
?
Is my main objective which I described in beginning is achievable ?

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to ansible-project+unsubscr...@googlegroups.com.
To post to this group, send email to ansible-project@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/17ed6b67-5ad5-417c-b9b5-70d257748776%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to