Not sure if it meets your needs, but why not do something like this:
- hosts: localhost
> vars:
> docker_configs:
> tomcat: { cName: 'tomcatImg', iName: 'tomcat:latest', iPort: 9999,
> volumes: '/temp' }
> nginx: { cName: 'nginxImg', iName: 'nginx:latest', iPort: 8001,
> volumes: '/data' }
> tasks:
> - name: configure images
> debug:
> msg: "going to configure {{ docker_config }} on {{
> ansible_hostname }}"
> vars:
> docker_config: "{{ docker_configs[item] }}"
> loop: "{{ docker_images }}"
Then you can pass list of images to configure on the command line or add to
your host_vars.
ansible-playbook -e "docker_images=['nginx','tomcat']" testa.yml
On Thursday, May 9, 2019 at 11:04:45 PM UTC-7, Anuradha Gangu wrote:
>
> 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
> ANSIBLE VERSION
>
> Ansible: 2.7.10 on RHEL 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 [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/aa2fa627-35ae-4f8b-87a8-e10b63b7b72e%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.