我遇到了这个问题(特写?)用Ansible group vars priority描述,大概是因为我的库存结构不正确。
这个想法是有两个任务,适用于库存中定义的所有“路由器”或“防火墙”。这一部分工作得很好--正确地分析了库存,并对两者进行了区分.
problem是,由于分析库存的方式,它对每个客户群体使用相同的ansible_user和ansible_password。基于这些文件,这显然是有意义的:
当合并相同父/子级别的组时,按字母顺序完成,最后加载的组覆盖前面的组。例如,a_group将与b_group合并,匹配的b_group vars将覆盖a_group中的vars。
如果我将“路由器”和“防火墙”子组更改为唯一的(例如,、custB_routers ),那么它的行为就像预期的那样,任何人都能建议我如何纠正吗?然而,我认为我必须编写每个子组范围内的任务。注意,所有主机都是唯一的IP地址。
剧本:
---
- name: Check routers
hosts: routers
tasks:
- name: Do stuff.
<commands>
- name: Check firewalls
hosts: firewalls
tasks:
- name: Do stuff.
<commands>
盘存:
all:
vars:
ansible_connection: network_cli
ansible_network_os: ios
children:
customerOne:
vars:
ansible_user: userOne
ansible_password: <vaulted pass>
children:
routers:
hosts:
x.x.x.x
y.y.y.y
firewalls:
vars:
ansible_network_os: asa
hosts:
z.z.z.z
customerTwo:
vars:
ansible_user: userTwo
ansible_password: <vaulted pass>
children:
routers:
hosts:
x.x.x.x
y.y.y.y
firewalls:
vars:
ansible_network_os: asa
hosts:
z.z.z.z
发布于 2020-01-23 01:01:45
简化库存是可能的
all:
vars:
ansible_connection: network_cli
ansible_network_os: ios
children:
routers:
hosts:
x.x.x.x
y.y.y.y
firewalls:
vars:
ansible_network_os: asa
hosts:
z.z.z.z
并将身份验证数据放入一个单独的变量中。把它放在最合适的地方。这可能是目录中的'all: vars:‘节,'vars:’剧本中的'group_vars/all‘目录.
auth:
customerOne:
ansible_user: userOne
ansible_password: <vaulted pass>
customerTwo:
ansible_user: userTwo
ansible_password: <vaulted pass>
在剧本的顶部添加一个剧本,并根据外部变量customer
分配变量
- name: Read variables
gather_facts: false
hosts: routers
tasks:
- set_fact:
ansible_user: "{{ auth[customer].ansible_user }}"
ansible_password: "{{ auth[customer].ansible_password }}"
run_once: true
- name: Check routers
hosts: routers
tasks:
- name: Do stuff.
<commands>
运行剧本并指定客户
ansible-playbook playbook.yml -e "customer=customerTwo"
https://stackoverflow.com/questions/59870905
复制