Docker_swarm模块-ansible的join_令牌参数不工作

Docker_swarm模块-ansible的join_令牌参数不工作,docker,module,ansible,swarm,Docker,Module,Ansible,Swarm,这是我的ansible playbook,任务是从docker_swarm模块文档中复制的,因此它应该可以工作: - name: Init a new swarm with default parameters docker_swarm: state: present advertise_addr: "{{ manager_ip }}:2377" register: rezult when: "ansible_default_ipv4.addr

这是我的ansible playbook,任务是从docker_swarm模块文档中复制的,因此它应该可以工作:

  - name: Init a new swarm with default parameters
    docker_swarm:
      state: present
      advertise_addr: "{{ manager_ip }}:2377"
    register: rezult
    when: "ansible_default_ipv4.address == '{{ manager_ip }}'"


  - name: Add nodes
    docker_swarm:
      state: join
      advertise_addr: "{{ manager_ip }}"
      join_token: rezult.swarm_facts.JoinTokens.Worker
      remote_addrs: "{{ manager_ip }}:2377"
    when: "ansible_default_ipv4.address != '{{ manager_ip }}'"
它初始化了一个带有“manager_ip”的swarm管理器——额外的变量 但在“添加节点任务”中失败,出现以下错误:

fatal: [vm2]: FAILED! => {"changed": false, "msg": "Can not join the Swarm Cluster: 500 Server Error: Internal Server Error (\"invalid join token\")"}
如果我把“{}}”放在“rezult.swarm\u facts.JoinTokens.Worker”的后面,在join\u标记之后,我会得到:

fatal: [vm2]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'swarm_facts'\n\nThe error appears to be in '/home/ansible/docker-ansible/docker.yml': line 47, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n  - name: Add nodes\n    ^ here\n"}
如果我为rezult.swarm_facts.JoinTokens.Worker添加调试消息,我会得到正确的令牌:

ok: [opensuse1] => {
    "msg": "SWMTKN-1-5p7brhxxz4gzu716t78tt5woj7h6aflq0kdwvzwlbbe7ct0ba7-e59bg0t79q67ogd61ydwxc5yq"
}
如果我在服务器上使用docker swarm join命令手动使用该令牌,我希望与manager合并,它可以工作。因此,变量具有正确的值,节点之间的连接起作用。但我就是不能让join_token工作。我正在用python 2.7.5运行ansible 2.8.5


我知道我可以使用shell模块,但我不想这样做。

我认为这里的问题来自
rezult.swarm\u facts.JoinTokens.Worker
。在调试信息中,它显示为
“msg”:“SWMTKN-1-5p7…”
,但是Ansible配置中的
加入令牌:
选项希望它只是普通令牌,没有额外的包装,如
“msg”:
等等。

我认为achempion是正确的,问题是OPs变量
rezult.swarm\u facts.JoinTokens.Worker
没有被评估,而是作为排序对象提供

rezult.swarm\u facts.JoinTokens.Worker
替换为
“{rezult.swarm\u facts.JoinTokens.Worker}”
,它应该可以工作


我意识到OP可能已经走了,但我花了很长时间试图找出一个非常类似的问题,这似乎为我解决了这个问题。

类似的东西对我很有用:

---
- name: Init swarm on the first node
  community.general.docker_swarm:
    state: present
    advertise_addr: "{{ ansible_host }}"
  register: result
  when: inventory_hostname == groups['swarm_managers'][0]

- name: Get join-token for manager nodes
  set_fact:
    join_token_manager: "{{ hostvars[groups['swarm_managers'][0]].result.swarm_facts.JoinTokens.Manager }}"

- name: Get join-token for worker nodes
  set_fact:
    join_token_worker: "{{ hostvars[groups['swarm_managers'][0]].result.swarm_facts.JoinTokens.Worker }}"

- name: Join other managers
  community.general.docker_swarm:
    state: join
    join_token: "{{ join_token_manager }}"
    advertise_addr: "{{ ansible_host }}"
    remote_addrs: "{{ hostvars[groups['swarm_managers'][0]].ansible_host }}"
  when:
    - inventory_hostname in groups['swarm_managers']
    - inventory_hostname != groups['swarm_managers'][0]

- name: Join workers
  community.general.docker_swarm:
    state: join
    join_token: "{{ join_token_worker }}"
    advertise_addr: "{{ ansible_host }}"
    remote_addrs: "{{ hostvars[groups['swarm_managers'][0]].ansible_host }}"
  when:
    - inventory_hostname not in groups['swarm_managers']

swarm\u managers
组中,有管理者,此资源清册中的所有其他主机都是工作人员。

此外,在使用shell模块时,我还遇到了相同的第二个错误。我认为ansible只是忘记了在服务器上运行时“rezult”中的内容,它“!={{manager\u ip}”。这是令人沮丧的。我不认为“msg”是这里的问题,这在任何调试消息中都存在。你找到答案了吗?我也有同样的问题。