首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从一个组中选择除inventory_hostname之外的所有主机?

如何从一个组中选择除inventory_hostname之外的所有主机?
EN

Server Fault用户
提问于 2018-09-10 15:20:44
回答 3查看 9.8K关注 0票数 5

我有一组两位主持人。我想将一项任务委托给不是当前主机的任务。

下面的内容与任何内容不匹配,只返回我最初的两个主机的列表。

代码语言:javascript
复制
  - debug: msg="{{ groups['web-servers'] | select('match', '^(?!\{\{\ inventory_hostname\ \}\}$).+') | list }}"

我想这就是问题所在,但我想不出答案。

EN

回答 3

Server Fault用户

回答已采纳

发布于 2018-09-10 16:15:57

一个选项是使用差异过滤器。下面是如何使用过滤器的示例

代码语言:javascript
复制
shell> cat test-difference-01.yml
- hosts: localhost
  gather_facts: no
  vars:
    web_servers:
      - web-server-01
      - web-server-02
      - web-server-09
    inventory_hostname:
      - web-server-02
  tasks:
    - set_fact:
        delegate_to_hosts: "{{ web_servers|difference(inventory_hostname) }}"
    - debug:
        msg : "{{ delegate_to_hosts }}"
代码语言:javascript
复制
shell> ansible-playbook test-difference-01.yml | grep -A 3 msg
    "msg": [
        "web-server-01", 
        "web-server-09"
    ]

问:“由两个主机组成的一组.将一项任务委托给不是当前主机的任务”

考虑到库存

代码语言:javascript
复制
shell> cat hosts
[webservers]
web-server-01
web-server-02

剧本

代码语言:javascript
复制
- hosts: webservers
  tasks:
    - debug:
        msg: "{{ inventory_hostname }} {{ item }}"
      loop: "{{ groups.webservers|difference([inventory_hostname]) }}"
      delegate_to: "{{ item }}"

给予(删节)

代码语言:javascript
复制
ok: [web-server-01 -> web-server-02] => (item=web-server-02) => 
  msg: web-server-01 web-server-02
ok: [web-server-02 -> web-server-01] => (item=web-server-01) => 
  msg: web-server-02 web-server-01

代码可以通过在可抗中列出的所有主机上运行来概括。

代码语言:javascript
复制
- hosts: all
  tasks:
    - debug:
        msg: "{{ inventory_hostname }} {{ item }}"
      loop: "{{ ansible_play_hosts_all|difference([inventory_hostname]) }}"
      delegate_to: "{{ item }}"
票数 6
EN

Server Fault用户

发布于 2018-09-10 17:51:51

您不需要指定负前瞻性的正则表达式。相反,使用reject过滤器

此外,使用equalto测试时,不需要将字符串括在^$中:

代码语言:javascript
复制
- debug:
    msg: "{{ groups['web-servers'] | reject('equalto', inventory_hostname) | list }}"
票数 3
EN

Server Fault用户

发布于 2018-09-10 16:02:13

我认为问题在于正则表达式中的变量替换(或缺少替换)。您可以分别定义模式,并将其传递给过滤器(请注意,我确实修改了正则表达式):

代码语言:javascript
复制
- set_fact: pattern="^(?!{{ inventory_hostname }}).+$"
- debug: msg="{{ groups['web-servers'] | select('match', pattern) | list }}"

结果:

代码语言:javascript
复制
TASK [debug : debug] ******************************************
ok: [foo] => {
    "msg": [
        "bar",
        "baz"
    ]
}
ok: [bar] => {
    "msg": [
        "foo",
        "baz"
    ]
}
ok: [baz] => {
    "msg": [
        "foo",
        "bar"
    ]
}
票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/930260

复制
相关文章

相似问题

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