Sara James
Sara James

Reputation: 143

how to loop over hostvars of register output

I'm struggling to loop over hostvars of the registered output of all the hosts in dynamic inventory. Here is the code.

$cat collect.yaml 
---
- hosts: "{{ env }}"
  become: True
  tasks:
   - name: Get dockerinfo
     docker_host_info:
       containers: yes
     register: result

- name: Debug dockerInfo
  debug:
    var: result.containers

- name: dynamic grouping
  add_host:
    name: "{{ item[0] }}"  
    groups: "{{ item[1].Image | regex_replace('.*?/(.*?):.*', '\\1') }}"
  loops: 
    -  "{{ ansible_play_batch }}"
    -  "{{ hostvars[item].result.containers }}" 

Error i get is item not defined. I would want the hosts refer to their respective result.containers. Not sure on how to use hostvars for the host to refer their respective result.containers.

Here is result.container output.

TASK [Debug dockerInfo]
ok: [vm1.nodekite.com] => {
"result.containers": [
{
"Image": "ca.docker/webproxy:1.0.0",
},
{
"Image": "docker.local/egacustomer:1.0.1",
},
]}
 ok: [vm2.nodekite.com ] => {
 "result.containers": [
 {
"Image": "ca.docker/webproxyui:1.0.0",
 },
 {
"Image": "cna-docker-local/lega-customer:1.0.1",
},
]}

Here is the what i'm trying to achieve

changed: [vm1.nodekite.com] => {
"add_host": {
"groups": [
    "webproxy"
],
"host_name": "vm1.nodekite.com",
},
changed: [vm1.nodekite.com] => {
"add_host": {
"groups": [
    "egacustomer"
],
"host_name": "vm1.nodekite.com",
},
changed: [vm2.nodekite.com] => {
"add_host": {
"groups": [
    "webproxy"            >> this should be webproxyui
],
"host_name": "vm2.nodekite.com",
},
changed: [vm2.nodekite.com] => {
"add_host": {
"groups": [
    "egacustomer"           >> this should be lega-customer
],
"host_name": "vm2.nodekite.com",
 },

Any help would be greatly appreciated. I would run this task using Images Names

- hosts: "{{ group }}"
  gather_facts: false
  become: true
  become_method: sudo
  tasks:
    - name: stop or restart docker containers
      command: "docker {{ state }} {{ container_name }}"

Upvotes: 0

Views: 513

Answers (1)

Andy Shinn
Andy Shinn

Reputation: 28543

How about just group_by paired with the loop?

- hosts: "{{ env }}"
  become: True
  tasks:
    - name: Get dockerinfo
     docker_host_info:
       containers: yes
     register: result

    - debug:
        var: result.containers

    - group_by:
        key: "container_{{ item.image | regex_replace('.*?/(.*?):.*', '\\1') }}"
      loop: "{{ result.containers }}"

    - debug:
        var: group_names

You don't need to add the prefix. But this would add each host to groups with their container image prefixes. You should be able to use the group later in the play or playbook.

Upvotes: 1

Related Questions