docker - ansible dict 对象没有属性
问题描述
我是新来的,也是 ansible 的新手。我知道有几本关于我正在做的事情的剧本,但所以我学得更好。
我尝试通过 ansible 创建一个 docker swarm。我的问题是我收到以下错误:
fatal: [dn12]: FAILED! => {
"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'stdout'
我不明白为什么我会收到这个错误。这是我使用 Join-Token 获得 var 的输出。
changed: [dn11] => {
"changed": true,
"cmd": "docker swarm join-token --quiet worker",
"delta": "0:00:00.060052",
"end": "2020-05-05 13:54:04.939337",
"invocation": {
"module_args": {
"_raw_params": "docker swarm join-token --quiet worker",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"stdin_add_newline": true,
"strip_empty_ends": true,
"warn": true
}
},
"rc": 0,
"start": "2020-05-05 13:54:04.879285",
"stderr": "",
"stderr_lines": [],
"stdout": "SWMTKN-1-2g5ndm8bfe22ft9cydbl80kcxdv356jjkuyokdclnu33t7q1zg-5l9rxjpjylprqzhk5oq4165gc",
"stdout_lines": [
"SWMTKN-1-2g5ndm8bfe22ft9cydbl80kcxdv356jjkuyokdclnu33t7q1zg-5l9rxjpjylprqzhk5oq4165gc"
]
}
这是我运行的简短角色。有什么问题。我没有发现错误。
---
- block:
- name: Inspect docker swarm
shell: docker info
register: docker_info
ignore_errors: true
- name: Initialize Docker Swarm
shell: >
docker swarm init
--advertise-addr={{ gluster_ip }}:2377
when: "docker_info.stdout.find('Swarm: active') == -1"
- name: Get the Manager join-token
shell: docker swarm join-token --quiet manager
register: manager_token
- name: Get the worker join-token
shell: docker swarm join-token --quiet worker
register: worker_token
tags:
- createswarm
when: inventory_hostname == swarm_master
- block:
- name: Add Managers to the Swarm
shell: "docker swarm join --token {{ manager_token.stdout }} {{ gluster_ip }}:2377"
#when: "docker_info.stdout.find('Swarm: active') == -1"
tags:
- addtoswarm
when: inventory_hostname != swarm_master
我希望你能帮我找出失败的地方。
伟人pr0
解决方案
有时它比预期的要容易。问题是寄存器变量适用于每个主机。
因为该变量只在 swarm_master 中的主机上执行,所以该变量仅在该主机上可用。
在这种情况下,我必须在访问变量的行中使用 swarm_master 中的主机。因此,该行更改如下。
从:
shell: "docker swarm join --token {{ manager_token.stdout }} {{ gluster_ip }}:2377"
至:
shell: "docker swarm join --token {{ hostvars[swarm_master]['manager_token']['stdout'] }} {{ hostvars[swarm_master]['gluster_ip'] }}:2377"
然后一切顺利。:-)
推荐阅读
- java - Java - 比较特定类型元素的频率
- sql-server - 使用 SQL Server 中的查询从 XML 推断数据
- r - 多个箱线图并排
- javascript - 使用 Node.js 访问数组内的 JSON 数组
- javascript - 无法使用 Flask 应用程序触发 Javascript
- html - 如何更改谷歌图表文本颜色
- python - 使用 cython 库分发 python 代码
- java - 带有 Java 代码的 HTML 中的 IF 条件是跳过所有 HTML 代码并给出 NULL POINTER
- c# - C# 更改背景颜色标题
- jquery - Shopify 使用 api 更新客户标签