将项目分配给ansible中的var with_items

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将项目分配给ansible中的var with_items相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个剧本,以找出正在运行的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
答案

这里不需要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,其中包含原始循环(在我们的例子中,它是服务器的名称)。

以上是关于将项目分配给ansible中的var with_items的主要内容,如果未能解决你的问题,请参考以下文章

在ansible中动态地将哈希类型分配给password_hash()

有没有办法使用ansible将活动目录中的用户分配给多个组?

Ansible'with_items'不会传递给Ansible角色

如何使用for循环将返回值分配给变量

为啥直接将 Arrays.asList() 分配给 var 时会出现 AssertionError?

为啥不能将匿名方法分配给 var?