我有一本针对我清单中的主机列表的剧本。 大多数任务都针对那些主机。 但是其中之一需要确定从先前命令中检索到的主机的列表。
例如,当我尝试定位docker swarm集群上的所有节点时:
- name: get nodes ip
command: >
NODE_LIST="" && for NODE in $(docker node ls --format '{{.Hostname}}'); do NODE_LIST=$NODE_LIST"$(docker node inspect --format '{{.Status.Addr}}' "${NODE}"),"; done && echo $NODE_LIST
register: nodes_list
failed_when: no
- hosts: nodes_list
tasks:
- copy:
src: data/
dest: "{{ service.data }}"
不幸的是,这样做会导致错误:
在任务中未检测到任何操作。这通常表示拼写错误的模块 名称或错误的模块路径
我想ansible期待着另一个任务,在这里,而不是另一个任务列表。 由于我对ansible相当陌生,所以我不知道该如何执行。
有什么主意吗?
编辑:遵循评论建议,以下是适用于我的解决方案:
- name: get docker version
shell: >
NODE_LIST="" && for NODE in $(docker node ls \-\-format {{ '{{' }}.Hostname{{ '}}' }}); do NODE_LIST=$NODE_LIST"$(docker node inspect \-\-format {{ '{{' }}.Status.Addr{{ '}}' }} "${NODE}"),"; done && echo ${NODE_LIST%?}
register: nodes_list
failed_when: no
- name: Add previously retrieved node list to groups
add_host:
name: '{{ nodes_list.stdout }}'
groups: nodes
- name: copy (for example) some data into each nodes
copy:
src: {{source_folder }}
dest: "{{ deploy.data_path }}"
owner: "{{ user.name }}"
group: "{{ user.group }}"
mode: u=rwx,g=rx,o=r
delegate_to: "{{ item }}"
with_items: "{{ nodes_list.stdout.split(',') }}"