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



我正在为动态资源清册中的所有主机循环已注册的results.containers

这是代码。

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

现在,item[1].Imageitem[1].Names[0]仅取自第一台主机(vm1.nodekite.com(的results.containers输出。我想为每一位主持人打个电话。这样,我就可以为所有具有各自容器的主机创建动态组。在我的代码中,主机vm1、vm2和vm3都引用vm1.nodekite.com's 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。例如

- name: dynamic grouping
debug:
msg:
- "name: {{ item }}"
- "groups: {{ my_result.containers|
map(attribute='Image')|
map('regex_replace', '.*?/(.*?):.*', '\1')|
list }}"
- "container_names: {{ my_result.containers|
map(attribute='Names')|
map('regex_replace', '/', '')|
list }}"
loop: "{{ ansible_play_batch }}"
vars:
my_result: "{{ hostvars[item].result }}"
run_once: true

给出

ok: [vm1.nodekite.com] => (item=vm1.nodekite.com) => 
msg:
- 'name: vm1.nodekite.com'
- 'groups: [''webproxy'', ''egacustomer'']'
- 'container_names: ["[''customer1'']", "[''webproxy'']"]'
ok: [vm1.nodekite.com] => (item=vm2.nodekite.com) => 
msg:
- 'name: vm2.nodekite.com'
- 'groups: [''webproxy'', ''lega-customer'']'
- 'container_names: ["[''webproxyui'']", "[''webproxy'']"]'
ok: [vm1.nodekite.com] => (item=vm3.nodekite.com) => 
msg:
- 'name: vm3.nodekite.com'
- 'groups: [''webproxy'', ''saga-customer'']'
- 'container_names: ["[''webproxy'']", "[''customer'']"]'

(根据您的需要随意调整代码。(

我遇到了一个问题,要将传递到下面名称中的项设置为:item='nginx'而不是item='[u'/nginx]'的纯字符串

为了解决这个问题,我做了以下操作:

- name: Get docker containers
become: docker
community.docker.docker_container
containers: yes
register: docker_info
- name: Stop running containers
become: docker
community.docker.docker_container
name: "{{ item }}"
state: stopped
loop: "{{ docker_info.containers | sum(attribute='Names', start=[]) | map('regex_replace','\/','') | list }}"
when: item in apps.split(,)

在这种情况下,apps是一个逗号分隔的字符串变量,我将其传递到易翻译的剧本中,以限制停止哪些应用程序。

求和部分将运行的所有应用程序的名称扁平化为一个列表。

regex片段删除Names参数中的/

最新更新