Это моя сборная пьеса, задачи скопированы из документации модуля 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\")"}
, если я помещу «{{}}» вокруг «rezult.swarm_facts.JoinTokens.Worker» после join_token, я получаю это:
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 на сервереЯ хочу объединить с менеджером это работает. Таким образом, переменная имеет правильное значение, и связь между узлами работает. Но я просто не могу заставить join_token работать. Я использую ANSI 2.8.5 с Python 2.7.5.
Я знаю, что могу использовать модуль оболочки, но я не хочу этого делать.