Loops 与循环相关的问题

Loops 与循环相关的问题,loops,ansible,Loops,Ansible,我有一个剧本,它有多个角色和系列设置,所以它首先在一台机器上运行,然后在其他机器上运行。在其中一个角色中,我有以下任务: - name: getting dbnodes IP addresses local_action: shell echo "{% for host in groups['dbnodes'] %}{{ hostvars[host]['ansible_eth0']['ipv4']['address'] }},{% endfor %}" run_once: true

我有一个剧本,它有多个角色和系列设置,所以它首先在一台机器上运行,然后在其他机器上运行。在其中一个角色中,我有以下任务:

- name: getting dbnodes IP addresses
  local_action: shell echo  "{% for host in groups['dbnodes'] %}{{ hostvars[host]['ansible_eth0']['ipv4']['address'] }},{% endfor %}"
  run_once: true
  register: IPS
基本上,我想做的是收集所有主机的IP地址,并将其注册到IP以供进一步使用。但是任务失败了,因为串行(我想)错误如下

TASK[dbcluster:获取dbnodes的IP地址]********************************
致命:[162.220.52.190]:失败!=>{“failed”:true,“msg”:"字段“action”有一个无效值,该值似乎包含一个未定义的变量。错误是:“dict object”没有属性“ansible\u eth0”\n\n错误似乎出现在“/root/tenon delivery/ansible/roles/dbcluster/tasks/main.yml”:第52行第3列,但可能\n位于文件的其他位置,具体取决于语法问题\n\n出现问题的行是:\n\n\n-name:getting dbnodes IP地址\n^here\n“}

在运行ansible dbnode-s安装程序时,我可以看到ansible_eth0有一个正确的值。我不明白为什么它说它未定义


您是否知道如何在同时收集所有计算机上的事实,同时仍然可以选择仍在序列化多个任务/处理程序。

ansible\u eth0
在任务运行时,事实可能未知

您可能希望在剧本的最顶端添加事实收集游戏:

- hosts: dbnodes
  gather_facts: yes
  tasks:
    - debug: msg="facts gathering"

- hosts: othernodes
  tasks:
    - name: getting dbnodes IP addresses
      ...

你关于连续剧的言论不会改变任何事情。制作一个单独的剧本来收集所有事实,然后再做其他事情。事实上它确实会改变,因为如果我禁用了连续剧,那么事实收集就会起作用。这种情况下的问题是如何将一个剧本中的可变集使用到另一个剧本中。你不能在另一个剧本中使用一个剧本中的事实。事实只存在于一个剧本中。这就是为什么我告诉你在剧本中单独制作一个剧本,只收集事实,而不收集更多。在剧本中的后续剧本中,你可以以任何方式使用所有这些事实,无论你是否想连续播放。