我正在尝试创建一个剧本,以了解正在运行的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
答案 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
(在我们的例子中,它是服务器的名称)。