将项目分配给ansible中的var with_items

时间:2018-03-02 05:29:00

标签: ansible

我正在尝试创建一个剧本,以了解正在运行的openstack服务器vm。我在vars中创建了一个openstack服务器列表,并使用delegate_to和with_items迭代直到找到vm。我在命令结束时使用wc -l,1将成功。目的是,一旦找到os-server,将servername存储到var中,这样就可以用于playbook中的其余任务。我无法从列表中获取var中的os服务器名称。我不是安赛的专家。有人可以帮助实现这一目标吗?感谢

- hosts: localhost

  vars:

   openstack:
     - reg1
     - reg2
     - reg3
     - reg4

  tasks:

- name: Command to find os server where vm exists
  shell: somecommand-to-check-if-vm-exist | wc -l
  delegate_to: "{{ item }}"
  with_items: "{{ openstack }}"
  register: found_server
  retries: 1
  delay: 1
  until: found_server.stdout != "1"

- debug: var=found_server

- name: set fact
  set_fact: os-server = "{{ item.item }}"
  when: item.stdout == "1"
  with_items: "{{ found_server.results }}"
  register: var2

- name: debug var
  debug: var=var2

- debug: var=os-server

1 个答案:

答案 0 :(得分:0)

此处不需要retry/until,也不需要第二个循环。

试试这个:

- hosts: localhost
  vars:
    openstack: [reg1, reg2, reg3, reg4]
  tasks:
    - name: Command to find os server where vm exists
      shell: somecommand-to-check-if-vm-exist | wc -l
      delegate_to: "{{ item }}"
      with_items: "{{ openstack }}"
      register: vm_check

    - name: set fact
      set_fact:
        os_server: "{{ (vm_check.results | selectattr('stdout','equalto','1') | list | first).item }}"

    - name: debug var
      debug:
        msg: "{{ os_server }}"

这会将每个服务器的结果注册到vm_check.results,然后只选择stdout设置为1的元素,取其中的第一个元素(我想你总是有一台服务器)使用VM),获取包含原始循环项的此元素的.item(在我们的例子中,它是服务器的名称)。

相关问题