首页 > 解决方案 > 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

标签: dockeransible

解决方案


有时它比预期的要容易。问题是寄存器变量适用于每个主机。

因为该变量只在 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"

然后一切顺利。:-)


推荐阅读