首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果*任何*主机有一个事实,如何运行一个不可用的任务

如果*任何*主机有一个事实,如何运行一个不可用的任务
EN

Stack Overflow用户
提问于 2021-08-17 10:37:19
回答 1查看 236关注 0票数 1

我脑子里有件事可能太复杂了。

我需要检查我的主机是否有ansible_virtualization_type == "openvz"

如果是这样的话,所有主机都应该执行特定的任务。

我现在试图设置一个事实(virt_list),其中包含一个主机列表及其本地主机上的virtualization_type:

代码语言:javascript
复制
- name: Set fuse on virtualization OpenVZ
  set_fact: 
    virt_list:
    host: "{{item}}"
    type: "openvz"
  when: hostvars[item].ansible_virtualization_type == "openvz"
  with_items: "{{ groups['all'] }}"
  delegate_to: localhost
  delegate_facts: true

但这是行不通的(本剧中的两位主持人都是在openvz上):

代码语言:javascript
复制
TASK [roles/testvirt : debug vars ansible_virtualization_type ] ****************************
    ok: [host1] => {
        "ansible_virtualization_type": "openvz"
    }
    ok: [host2] => {
        "ansible_virtualization_type": "openvz"
    }

TASK [roles/testvirt : debug vars virt_list ] **********************************************
    ok: [host1] => {
        "msg": [
            {
                "host": "host1",
                "type": "openvz"
            }
        ]
    }
    ok: [host2] => {
        "msg": [
            {
                "host": "host2",
                "type": "openvz"
            }
        ]
    }

应该有一种更简单的方法,也许可以使用jinjia2直接组合列表。

有人有建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-17 11:58:52

问:“如果我的主机中有ansible_virtualization_type == "openvz”所有主机都应该执行特定的任务。

例如,给出了测试的清单

代码语言:javascript
复制
shell> cat hosts
host1 ansible_virtualization_type=xen
host2 ansible_virtualization_type=xen
host3 ansible_virtualization_type=openvz

提取变量

代码语言:javascript
复制
    - debug:
        msg: "{{ ansible_play_hosts|
                 map('extract', hostvars, 'ansible_virtualization_type')|
                 list }}"
      run_once: true

给出

代码语言:javascript
复制
  msg:
  - xen
  - xen
  - openvz

测试类型是否存在

代码语言:javascript
复制
    - debug:
        msg: OK. ALL hosts should execute a specific task.
      when: "'openvz' in vtypes"
      vars:
        vtypes: "{{ ansible_play_hosts|
                    map('extract', hostvars, 'ansible_virtualization_type')|
                    list }}"
      run_once: true

给出

代码语言:javascript
复制
  msg: OK. ALL hosts should execute a specific task.

如果此操作按预期进行,则对所有主机进行处理。

代码语言:javascript
复制
    - set_fact:
        all_hosts_execute_specific_task: true
      when: "'openvz' in vtypes"
      vars:
        vtypes: "{{ ansible_play_hosts|
                    map('extract', hostvars, 'ansible_virtualization_type')|
                    list }}"
      run_once: true
    - debug:
        msg: Execute a specific task.
      when: all_hosts_execute_specific_task|default(false)

给出

代码语言:javascript
复制
TASK [set_fact] ************************************************************
ok: [host1]

TASK [debug] ***************************************************************
ok: [host1] => 
  msg: Execute a specific task.
ok: [host3] => 
  msg: Execute a specific task.
ok: [host2] => 
  msg: Execute a specific task.

如果类型丢失,任务将被跳过。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68815821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档