Loops 如何循环寄存器输出的hostvars

Loops 如何循环寄存器输出的hostvars,loops,ansible,ansible-2.x,hostvars,Loops,Ansible,Ansible 2.x,Hostvars,我正在努力循环动态资源清册中所有主机的注册输出的hostvars。 这是代码 $cat collect.yaml --- - hosts: "{{ env }}" become: True tasks: - name: Get dockerinfo docker_host_info: containers: yes register: result - name: Debug dockerInfo debug:

我正在努力循环动态资源清册中所有主机的注册输出的hostvars。 这是代码

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

只需将
groupby
循环搭配使用如何

- 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

您不需要添加前缀。但这会将每个主机添加到带有容器图像前缀的组中。您应该能够在以后的剧本或剧本中使用该组。

您能解释一下为什么图像前缀会进入主机目录吗?是因为你最终会使用容器的图像名在容器上运行一些任务吗?没错,Andy。如果我选择组“webproxy”,它应该重新启动/停止vm1.nodekite.com和vm2.nodekite.com的webproxyui上的容器。这不起作用!:(它将我抛出下面的错误:“msg”:“任务包含一个带有未定义变量的选项。错误是:'dict object'在我尝试此
键时没有属性'image'”{{item.image | regex_replace('.*?/(.*?):.''\\1')}“
使用精确的代码。对不起,我是用我自己的VAR进行测试的。在您的情况下,它将使用大写字母I:
Image