Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Ansible:如何在下一个任务中循环动态主机的已注册输出_Loops_Ansible_Nested Loops_Ansible 2.x - Fatal编程技术网

Loops Ansible:如何在下一个任务中循环动态主机的已注册输出

Loops Ansible:如何在下一个任务中循环动态主机的已注册输出,loops,ansible,nested-loops,ansible-2.x,Loops,Ansible,Nested Loops,Ansible 2.x,我正在努力循环动态资源清册中所有主机的注册结果.容器 这是代码 $cat collect.yaml --- - hosts: "{{ env }}" become: True tasks: - name: Get dockerinfo docker_host_info: containers: yes register: result - name: Debug dockerInfo de

我正在努力循环动态资源清册中所有主机的注册
结果.容器

这是代码

$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') }}"
        container_name: '{{ item[1].Names[0] | regex_replace("^/", "") }}'
      with_nested: 
        -  "{{ ansible_play_batch }}"
        -  "{{ result.containers }}"
这里是
result.containers
输出

TASK [Debug dockerInfo]
ok: [vm1.nodekite.com] => {
"result.containers": [
{
    "Image": "ca.docker/webproxy:1.0.0",
    "Names": [
           "/customer1"
     ],
},
{
    "Image": "docker.local/egacustomer:1.0.1",
    "Names": [
           "/webproxy"
     ],
},
]}
ok: [vm2.nodekite.com ] => {
"result.containers": [
{
    "Image": "ca.docker/webproxy:1.0.0",
    "Names": [
           "/webproxyui"
     ],
},
{
    "Image": "cna-docker-local/lega-customer:1.0.1",
    "Names": [
           "/webproxy"
    ],
},
]}
ok: [vm3.nodekite.com ] => {
"result.containers": [
{
    "Image": "ca.docker/webproxy:1.0.0",
    "Names": [
           "/webproxy"
     ],
},
{
    "Image": "local.docker/saga-customer:1.0.1",
    "Names": [
           "/customerr
     ],
},
]}
当前
项[1]。图像
项[1]。名称[0]
仅取自第一台主机(vm1.nodekite.com)的结果。容器输出。我想为每一个主机循环。这样,我就可以使用各自的容器为所有主机创建动态组。在我的代码中,主机vm1、vm2、vm3都引用了
vm1.nodekite.com的result.containers
,但我希望主机引用各自的容器。任何帮助都将不胜感激

我已经更新了动态分组任务输出以进行澄清

changed: [vm1.nodekite.com] => {
"add_host": {
    "groups": [
        "webproxy"
    ],
    "host_name": "vm1.nodekite.com",
    "host_vars": {
    "container_name": "customer1" }
},
changed: [vm1.nodekite.com] => {
"add_host": {
    "groups": [
        "egacustomer"
    ],
    "host_name": "vm1.nodekite.com",
    "host_vars": {
    "container_name": "webproxy" }
},
changed: [vm2.nodekite.com] => {
"add_host": {
    "groups": [
        "webproxy"            >> this should be webproxy
    ],
    "host_name": "vm2.nodekite.com",
    "host_vars": {
    "container_name": "customer1" }     >> this should be webproxyui
},
changed: [vm2.nodekite.com] => {
"add_host": {
    "groups": [
        "egacustomer"           >> this should be lega-customer
    ],
    "host_name": "vm2.nodekite.com",
    "host_vars": {
    "container_name": "webproxy" }    >>  this should be webproxy
},
如果您看到vm2仍然引用vm1的result.containers输出

当我尝试此操作时…我得到一个未定义项的错误

   - name: adding it to groups using images
    add_host:
      name: "{{ item[0] }}"
      groups: "{{ item[1].Image | regex_replace('.*?/(.*?):.*', '\\1') }}"
      container_name: '{{ item[1].Names[0] | regex_replace("^/", "") }}'
    loop:
      -  "{{ ansible_play_batch }}"
      -  "{{ myresult.containers }}"
    vars:
      myresult: "{{ hostvars[item].result }}"
    run_once: true
Q:“主机应参考其各自的容器。”

A:使用hostvars。比如说

-名称:动态分组
调试:
味精:
-“名称:{{item}}”
-“组:{{my_result.containers|
映射(属性='Image')|
映射('regex_replace','.*?/(.*?:.'.','\\1')|
列表}”
-“容器名称:{{my_result.containers|
映射(属性=“名称”)|
映射('regex_replace','\/','')|
列表}”
循环:{{ansible\u play\u batch}”
变量:
my_结果:“{{hostvars[item].result}”
跑一次:对
给予

ok:[vm1.nodekite.com]=>(item=vm1.nodekite.com)=>
味精:
-'名称:vm1.nodekite.com'
-'组:['webproxy','egacustomer']
-'容器名称:[“[“客户1]”,“[“网络代理”]”
确定:[vm1.nodekite.com]=>(item=vm2.nodekite.com)=>
味精:
-'名称:vm2.nodekite.com'
-'组:['webproxy','lega-customer']
-'容器名称:[“[“webproxyui]”,“[“webproxyui]”,“[“webproxy]””
确定:[vm1.nodekite.com]=>(item=vm3.nodekite.com)=>
味精:
-'名称:vm3.nodekite.com'
-'组:['webproxy','saga-customer']
-'容器名称:[“[”“webproxy”“]”,“[”“customer”“]”

(请根据您的需要调整代码。)

谢谢您的及时回复,先生。我添加了动态分组任务ouput,以澄清我试图实现的目标。我在检查我是否可以通过这种方式实现它<代码>带有嵌套:-“{ansible\u play\u batch}”-“{{hostvars[*].result.containers{124; flatte(1)}}”
当我尝试上面的代码时,我得到一个未定义项的错误。请帮忙。