在我的行动手册中,我使用以下任务来初始化群集并将次要群集添加到主要群集:
- name: Initialize replica set
run_once: true
delegate_to: host1
shell: >
mongo --eval 'printjson(rs.initiate())'
- name: Format secondaries
run_once: true
local_action:
module: debug
msg: '"{{ item }}:27017"'
with_items: ['host2', 'host3']
register: secondaries
- name: Add secondaries
run_once: true
delegate_to: host1
shell: >
/usr/bin/mongo --eval 'printjson(rs.add({{ item.msg }}))'
with_items: secondaries.results我得到了下面的错误:
TASK [mongodb-setup : Add secondaries] *******************************
fatal: [host1]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'msg'\n\nThe error appears to have been in '/var/lib/awx/projects/_dev/roles/mongodb-setup/tasks/users.yml': line 15, column 3, 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 secondaries\n ^ here\n"}感谢你的回复,我已经修改了我的代码如下
- name: Add secondaries
run_once: true
delegate_to: host-1
shell: >
/usr/bin/mongo --eval 'printjson(rs.add({{ item }}:27017))'
with_items:
- host2
- host3但是得到下面的错误
failed: [host-2 -> host-1] (item=host-2) => {"changed": true, "cmd": "/usr/bin/mongo --eval 'printjson(rs.add(host-2:27017))'", "delta": "0:00:00.173077", "end": "2019-08-06 13:29:09.422560", "item": "host-2", "msg": "non-zero return code", "rc": 252, "start": "2019-08-06 13:29:09.249483", "stderr": "", "stderr_lines": [], "stdout": "MongoDB shell version: 3.2.22\nconnecting to: test\n2019-08-06T13:29:09.419-0500 E QUERY [thread1] SyntaxError: missing ) after argument list @(shell eval):1:37", "stdout_lines": ["MongoDB shell version: 3.2.22", "connecting to: test", "2019-08-06T13:29:09.419-0500 E QUERY [thread1] SyntaxError: missing ) after argument list @(shell eval):1:37"]}
发布于 2019-08-07 01:39:40
你的问题不是rs.add(),而是你循环的数据。在您的上一个任务中,您的项目列表是单个字符串。
# Wrong #
with_items: secondaries.results您希望从先前注册的结果中传递一个实际的列表:
with_items: "{{ secondaries.results }}"也就是说,注册调试任务的结果是相当奇怪的。您应该使用set_fact在var中注册所需的内容,或者更好地直接在任务中循环其他主机列表。它看起来也很像rs.add funcion is exepecting a string,所以你应该在你的评估中引用参数。类似于:
- name: Add secondaries
shell: >
/usr/bin/mongo --eval 'printjson(rs.add("{{ item }}:27017"))'
with_items:
- host2
- host3在这种情况下,你使用委托的方式对我来说似乎相当奇怪,但如果没有一个完整的剧本示例来说明你想要做什么,就很难给出任何有效的线索(如果需要的话,你可能会提出一个新的问题)。
https://stackoverflow.com/questions/57379695
复制相似问题