0
votes

I am trying to create a playbook to find out on which openstack server vm is running on. I have created a list of openstack servers in vars and used delegate_to with with_items to iterate through until find vm. I am using wc -l at the end of command and 1 will be success. The aim is, once os-server is found, store servername into a var so this can be used for rest of tasks in playbook. I am unable to get the os server name in a var from the list. I am not an ansible expert. Can anyone help to achieve this? Thanks


- 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

1 Answers

1
votes

There's no need to retry/until here and for the second loop as well.

Try this:

- 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 }}"

This will register results from every server into vm_check.results, and then just select elements with stdout set to 1, take first element of it it (I suppose you always have one server with VM), and get .item of this element which contains the item of original loop (in our case it is server's name).