如何循环访问寄存器输出的hostvar

时间:2020-08-10 02:57:52

标签: loops ansible ansible-2.x hostvars

我正在努力遍历动态清单中所有主机的注册输出的hostvar。 这是代码。

$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 }}" 

我得到的错误是未定义项目。我希望主机引用它们各自的result.container。不确定如何使用hostvars作为主机来引用各自的result.containers。

这是result.container输出。

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",
},
]}

这就是我要实现的目标

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",
 },

任何帮助将不胜感激。 我将使用图像名称运行此任务

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

1 个答案:

答案 0 :(得分:1)

group_byloop配对怎么样?

- 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

您不需要添加前缀。但这会将每个主机添加到具有其容器映像前缀的组中。您稍后应该可以在剧本或剧本中使用该组。