AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1031041
Accepted
Mike Williams
Mike Williams
Asked: 2020-08-22 14:58:50 +0800 CST2020-08-22 14:58:50 +0800 CST 2020-08-22 14:58:50 +0800 CST

Ansible 检查属性列表中是否存在变量

  • 772

我有一个包含网络上主机详细信息的变量(称为“主机列表”-我相信您将其称为字典,但我不确定术语。该变量在 group_vars/all 的文件中定义,所以它是在所有剧本中都可用(不确定这是否重要)。

我有一个剧本,只有在 hostlist 的主机名列表中找不到 ansible_hostname 时我才想运行它。hostlist 中的主机名是变量的属性之一,但我再次不确定“属性”是否是正确的术语......

主机列表定义为:

hostlist:
  - { name: 'host1', ip_addr: '192.168.2.31', hostgrp: 'physical_workstation' }
  - { name: 'host2', ip_addr: '192.168.2.32', hostgrp: 'physical_workstation' }
  - { name: 'host3', ip_addr: '192.168.2.33', hostgrp: 'virtual_machine' }

我用来尝试使其正常工作的游戏是:

- name: Conditional test
  debug:
    msg: "ansible_hostname not found in hostlist."
  when: ansible_hostname not in hostlist.name

我不确定条件中所需的语法,或者我想要的是否可以通过这种方式实现?

ansible yaml jinja2
  • 3 3 个回答
  • 24189 Views

3 个回答

  • Voted
  1. Best Answer
    Tom
    2020-08-22T15:49:07+08:002020-08-22T15:49:07+08:00

    大概有更优雅的方式来做这件事,但这样的事情对我有用:

    如果您的库存文件如下所示

    host1
    host2
    host3
    host4
    

    然后,只有以下内容的剧本才会被运行,host4因为它在 hostlist var 中不匹配:
    $ cat test.yml

    - hosts: all
      vars:
        hostlist:
          - { name: 'host1', ip_addr: '192.168.2.31', hostgrp: 'physical_workstation' }
          - { name: 'host2', ip_addr: '192.168.2.32', hostgrp: 'physical_workstation' }
          - { name: 'host3', ip_addr: '192.168.2.33', hostgrp: 'virtual_machine' }
      tasks:
    
        - name: Conditional test
          debug:
            msg: "ansible_hostname not found in hostlist."
          when: hostlist|selectattr("name", "equalto", ansible_hostname)|list|length == 0
    

    当这样调用时:

    ansible-playbook test.yml
    

    意味着只有 host4 运行任务块....

    PLAY [all] *************************************************
    
    TASK [Gathering Facts] *************************************
    ok: [host1]
    ok: [host2]
    ok: [host3]
    ok: [host4]
    
    TASK [debug] ***********************************************
    ok: [host4] => {
        "msg": "hostname not in hostlist name list"
    }
    skipping: [host1]
    skipping: [host2]
    skipping: [host3]
    
    • 2
  2. Vladimir Botka
    2020-08-22T22:45:20+08:002020-08-22T22:45:20+08:00

    可选地,此条件更清洁

        when: inventory_hostname not in hostlist|map(attribute="name")|list
    

    如果您想与库存别名列表进行比较,请使用inventory_hostname而不是。ansible_hostname请参阅inventory_hostname 和 ansible_hostname 之间的区别。

    • 2
  3. Tom
    2020-08-22T18:22:08+08:002020-08-22T18:22:08+08:00

    另一种解决方案是(如对问题的评论中所建议的)是将主机列表重构到清单中,如下所示:

    [physical_workstation]
    host1 ansible_host=192.168.2.31
    host2 ansible_host=192.168.2.32
    
    [virtual_machine]
    host3 ansible_host=192.168.2.33
    
    [all]
    host4 ansible_host=192.168.2.34
    

    然后,您可以简化 playbook 以使用特殊组对不属于任何组的主机运行播放,该组从不属于任何其他组的ungrouped主机中选择主机:all

    - hosts: ungrouped
      tasks:
        - name: only ungrouped
          debug:
            msg: "host not found in any other group."
    

    或针对组中的特定主机运行操作...

    - hosts: physical_workstation:virtual_machine
      tasks:
        - name: only in specified groups
          debug:
            msg: |
              This will run on machines that are in groups:
              physical_workstation or virtual_machine
    

    输出

    PLAY [ungrouped] ***********************************************
    
    TASK [only ungrouped] ******************************************
    ok: [host4] => {
        "msg": "host not found in any other group."
    }
    
    PLAY [physical_workstation:virtual_machine] ********************
    
    TASK [only in specified groups] ********************************
    ok: [host1] => {
        "msg": "This will run on machines that are in groups:\nphysical_workstation or virtual_machine"
    }
    ok: [host2] => {
        "msg": "This will run on machines that are in groups:\nphysical_workstation or virtual_machine"
    }
    ok: [host3] => {
        "msg": "This will run on machines that are in groups:\nphysical_workstation or virtual_machine"
    }
    
    • 0

相关问题

  • 重复的 Ansible 任务

  • 无法形成站点中的文件的链接,该链接可用于使用 ansible 在远程服务器中启用的目录站点?

  • 如何执行 ansible 的特定角色?

  • Ansible 和 rbash

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve