gpt4 book ai didi

Ansible - 如何循环多个主机并在找到正确答案时停止?

转载 作者:行者123 更新时间:2023-12-02 02:19:29 27 4
gpt4 key购买 nike

我想使用 uri 模块循环一组主机(它们在库存中),直到状态代码为 200,并将该主机名保存到一个变量。

下面写的完全错误,只是表达我的需求。
(注意:我在 all_uri_group 中有 4 个主机,我知道第二个和第三个主机的状态代码为 200,我想停止第二个主机中的循环,并注册valid_host 为第二个主机名的值。

- name: Looking for valid host
hosts: all_uri_group
uri:
url: https://{{ fa_url }}/api/{{ api_version }}/volume
method: POST
validate_certs: no
return_content: yes
status_code: 200
register: reply
until: status_code == 200
retries: 0
delay: 0

但我不知道如何在 Ansible 中正确编写它。

最佳答案

由于根据前一个主机的返回值跳过主机的执行非常棘手但是根据先前的返回值跳过循环非常容易,因此您可以使用所有内容创建一个循环主机在玩 special variable ansible_play_batch,然后 delegate the task根据循环item

这是我设置 3 个节点的示例。
请注意,根据您的要求,我故意使第一个节点无法看到它的 react 。

鉴于剧本:

- hosts: all
gather_facts: no

tasks:
- uri:
url: "http://example.{{ 'invalid' if item == 'node1' else 'com' }}"
status_code: 200
delegate_to: "{{ item }}"
register: reply
loop: "{{ ansible_play_hosts }}"
when: "reply.status | default(0) != 200"
run_once: true
ignore_errors: yes

- set_fact:
selected_host: "{{ item.item }}"
loop: "{{ reply.results }}"
when: item is not skipped and item.status == 200
run_once: true
loop_control:
label: "{{ item.item }}"

- debug:
var: selected_host
run_once: true

这让我回顾一下:

PLAY [all] ********************************************************************************************************

TASK [uri] ********************************************************************************************************
failed: [node1 -> node1] (item=node1) => changed=false
ansible_loop_var: item
elapsed: 0
item: node1
msg: 'Status code was -1 and not [200]: Request failed: <urlopen error [Errno -2] Name does not resolve>'
redirected: false
status: -1
url: http://example.invalid
ok: [node1 -> node2] => (item=node2)
skipping: [node1] => (item=node3)
...ignoring

TASK [set_fact] ***************************************************************************************************
skipping: [node1] => (item=node1)
ok: [node1] => (item=node2)
skipping: [node1] => (item=node3)

TASK [debug] ******************************************************************************************************
ok: [node1] =>
selected_host: node2

PLAY RECAP ********************************************************************************************************
node1 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1

关于Ansible - 如何循环多个主机并在找到正确答案时停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66641976/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com