ansible объект dict не имеет атрибута - PullRequest
0 голосов
/ 05 мая 2020

Я здесь впервые и впервые в ansible. Я знаю, что есть несколько сценариев того, что я делаю, но поэтому я лучше усваиваю.

Я пытаюсь создать рой docker через ansible. Моя проблема в том, что я получаю следующую ошибку:

fatal: [dn12]: FAILED! => {
"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'stdout'

Я не понимаю, почему я получаю эту ошибку. Это результат, в котором я получаю переменную с токеном соединения.

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

Надеюсь, вы поможете мне найти неисправность.

Greats pr0

1 Ответ

0 голосов
/ 06 мая 2020

Иногда бывает проще, чем ожидалось. Проблема в том, что регистровая переменная применяется к каждому хосту.

Поскольку переменная выполняется только на хосте, который находится в 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"

Затем все идет. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...