Loops 如何循环寄存器输出的hostvars
我正在努力循环动态资源清册中所有主机的注册输出的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:
$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
。