这是我的烦人的剧本,任务是从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” --extra-var初始化一个集群管理器。
但是它在“添加节点任务”中失败,并显示以下错误:
fatal: [vm2]: FAILED! => {"changed": false, "msg": "Can not join the Swarm Cluster: 500 Server Error: Internal Server Error (\"invalid join token\")"}

如果我在join_token之后在“rezult.swarm_facts.JoinTokens.Worker”周围加上“'{{}}'”,我会得到:
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,则会得到正确的 token :
ok: [opensuse1] => {
    "msg": "SWMTKN-1-5p7brhxxz4gzu716t78tt5woj7h6aflq0kdwvzwlbbe7ct0ba7-e59bg0t79q67ogd61ydwxc5yq"
}

如果我在服务器上通过docker swarm join命令手动使用该 token ,则希望与管理器合并。因此,该变量具有正确的值,并且节点之间的连接有效。但我只是无法让join_token工作。我正在使用python 2.7.5运行ansible 2.8.5。

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

最佳答案

我认为抱负是正确的,问题是OP变量rezult.swarm_facts.JoinTokens.Worker没有得到评估,而是作为某种对象提供。
rezult.swarm_facts.JoinTokens.Worker替换"{{ rezult.swarm_facts.JoinTokens.Worker }}",它应该可以工作。
我意识到OP可能已经在发展,但是我花了很长时间试图找出一个非常相似的问题,这似乎为我解决了这个问题。

08-28 15:32