首页 > 解决方案 > 如何从ansible库存文件中跳过主机名?

问题描述

我的 ansible 库存文件有以下条目

[non_prod_servers]
oracle[1:13]

如何从上述规范中消除主机“oracle7”和“oracle10”,而无需创建以下条目?

[non_prod_servers]
oracle[1:6]
oracle[8:9]
oracle[11:13]

本质上,寻找一个比我想出的更优雅的解决方案。

提前致谢。

FR

标签: ansiblerangeinventory

解决方案


恕我直言,您正在寻找的功能不可用。您可以在清单中使用 Python 切片。清单模式不适用于清单文件中。

如果您需要它来实现自动化,即您想通过几个变量来控制流程,下面的库存和剧本会动态创建组

shell> cat hosts
[non_prod_servers]
localhost
[non_prod_servers:vars]
_name=oracle
_from=1
_to=13
_deny=[7,10]
shell> cat playbook.yml
---
- hosts: non_prod_servers
  gather_facts: false
  tasks:
    - add_host:
        hostname: "{{ _name }}{{ item }}"
        groups: non_prod_servers_dyn
      loop: "{{ range(_from, _to + 1)|difference(_deny) }}"

- hosts: non_prod_servers_dyn
  gather_facts: false
  tasks:
    - debug:
        var: ansible_play_hosts_all
      run_once: true

shell> ansible-playbook -i hosts playbook.yml

PLAY [non_prod_servers] *************************************************

TASK [add_host] *********************************************************
ok: [localhost] => (item=1)
ok: [localhost] => (item=2)
ok: [localhost] => (item=3)
ok: [localhost] => (item=4)
ok: [localhost] => (item=5)
ok: [localhost] => (item=6)
ok: [localhost] => (item=8)
ok: [localhost] => (item=9)
ok: [localhost] => (item=11)
ok: [localhost] => (item=12)
ok: [localhost] => (item=13)

PLAY [non_prod_servers_dyn] **********************************************

TASK [debug] *************************************************************
ok: [oracle1] => 
  ansible_play_hosts_all:
  - oracle1
  - oracle2
  - oracle3
  - oracle4
  - oracle5
  - oracle6
  - oracle8
  - oracle9
  - oracle11
  - oracle12
  - oracle13

推荐阅读