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)}}”
当我尝试上面的代码时,我得到一个未定义项的错误。请帮忙。