如何从ansible中的变量文件调用类似列表的值
我有一个ansible playbook,其中我要传递多个参数,这些参数有时足够长,使播放看起来很肥,因此我正在考虑创建一个变量文件,并在该文件中保留所有可能的值,以便从那里调用它们,使播放变瘦,同时避免对playbook,我们可以调整变量文件,如cloud_vars.yml 下面是我的变量文件: 下面是剧本 下面是一个剧本,它正在为以后在剧本中的使用设置事实,我期待着知道如何从vaiable文件中使用azure_域azure_res_组和azure_位置变量,因为它们在列表中定义,截至目前,我已经硬编码了名称和位置等如何从ansible中的变量文件调用类似列表的值,ansible,ansible-facts,Ansible,Ansible Facts,我有一个ansible playbook,其中我要传递多个参数,这些参数有时足够长,使播放看起来很肥,因此我正在考虑创建一个变量文件,并在该文件中保留所有可能的值,以便从那里调用它们,使播放变瘦,同时避免对playbook,我们可以调整变量文件,如cloud_vars.yml 下面是我的变量文件: 下面是剧本 下面是一个剧本,它正在为以后在剧本中的使用设置事实,我期待着知道如何从vaiable文件中使用azure_域azure_res_组和azure_位置变量,因为它们在列表中定义,截至目前,我
$ cat new_vm_Creation.yml
---
- name: create azure vm
hosts: localhost
connection: local
tasks:
- include_vars: azure_vars.yml
- set_fact:
host: "{{ azure_vm_name.split('.') }}"
- set_fact:
azure_domain: "{{ host.1 }}.{{ host.2 }}"
- name: azure_domain
debug:
msg: "{{ azure_domain }}"
- set_fact:
azure_location: "westus2"
when: azure_domain == "us-sea01"
- set_fact:
azure_location: "westeurope"
when: azure_domain == "eu-azrc1"
- set_fact:
azure_location: "southcentralus"
when: azure_domain == "us-azrc2"
- name: azure_location
debug:
msg: "{{ azure_location }}"
- set_fact:
res_group: "rg001"
when: azure_domain == "us-sea01"
- set_fact:
res_group: "rg002"
when: azure_domain == "eu-azrc1"
- set_fact:
res_group: "rg003"
when: azure_domain == "us-azrc2"
- name: Resource Group
debug:
msg: "{{ res_group }}"
- set_fact:
vnet: "{{ azure_nprod_vnet }}"
when: azure_domain == "us-sea01"
- set_fact:
vnet: "{{ azure_prod03_vnet }}"
when: azure_domain == "eu-azrc1"
- set_fact:
vnet: "{{ azure_prod02_vnet }}"
when: azure_domain == "us-azrc2"
- name: Vnet
debug:
msg: "{{ vnet }}"
- name: create network security group that allows ssh
azure_rm_securitygroup:
resource_group: "{{ res_group }}"
location: "{{ location }}"
name: "{{ azure_vm_name }}-nsg"
rules:
- name: ssh
protocol: Tcp
destination_port_range: 22
access: Allow
priority: 100
direction: Inbound
- name: create virtual network interface card
azure_rm_networkinterface:
resource_group: "{{ res_group }}"
location: "{{ location }}"
name: "{{ azure_vm_name }}-nic1"
subnet: "{{ azure_subnet_name }}"
virtual_network: "{{ vnet }}"
security_group: "{{ azure_vm_name }}-nsg"
enable_accelerated_networking: true
public_ip: no
state: present
- name: create vm
azure_rm_virtualmachine:
resource_group: "{{ res_group }}"
location: "{{ location }}"
name: "{{ azure_vm_name }}"
vm_size: Standard_D4s_v3
admin_username: some_id
ssh_password_enabled: false
ssh_public_keys:
- path: /home/some_id/.ssh/authorized_keys
key_data: "{{ public_key }}"
network_interfaces: "{{ azure_vm_name }}-nic1"
os_disk_name: "{{ azure_vm_name }}-osdisk"
managed_disk_type: "{{ azure_os_disk_type }}"
os_disk_caching: ReadWrite
os_type: Linux
image:
id: "{{ azure_image_id }}"
publisher: redhat
plan:
name: rhel-lvm78
product: rhel-byos
publisher: redhat
...
您可以在azure_vars.yml文件中定义这些结构,包括jinja2模板,但只需知道将它们放在vars文件中并不能解决它们-jinja2模板评估在ansible中是递归的,因此当您第一次看到成功或可怕的变量时,它们就没有定义 给定的azure_vars.yml azure_nprod_vnet:/subscriptions/alpha nprod/resourceGroups/rg001/providers/Microsoft.Network/virtualNetworks/vnet azure_prod03_vnet:/subscriptions/beta-prod03/resourceGroups/rg002/providers/Microsoft.Network/virtualNetworks/vnet azure_prod02_vnet:/subscriptions/charlie-prod02/resourceGroups/rg003/providers/Microsoft.Network/virtualNetworks/vnet 按\u azure\u域列出的内容: us-sea01: azure_位置:westus2 研究小组:rg001 vnet:{{azure\u nprod\u vnet} eu-azrc1: 地点:西欧 资源组:rg002 vnet:{{azure_prod03_vnet} us-azrc2: azure_位置:southcentralus 资源组:rg003 vnet:{{azure_prod02_vnet} vnet:{{things\u by_azure\u domain[azure\u domain].vnet} 然后,将azure_域放入作用域后,{{vnet}的使用将递归地计算该表达式: 任务: 注意,即使“azure_域”尚未定义,我们也可以将其包括在内 因为'include_vars'不计算那些jinja2表达式 -包含变量:azure\u vars.yml -设定事实: azure_域:us-azrc2 -调试: 变量:vnet 屈服
ok: [localhost] => {
"vnet": "/subscriptions/charlie-prod02/resourceGroups/rg003/providers/Microsoft.Network/virtualNetworks/vnet"
但是,正如我所说,你需要小心谨慎,因为胖手指不会有好下场:
任务:
-包含变量:azure\u vars.yml
-设定事实:
azure_域名:美国洋基涂鸦
-调试:
变量:vnet
屈服
ok: [localhost] => {
"vnet": "VARIABLE IS NOT DEFINED!"
}
但至少在我的ansible 2.9.13中,以更高的详细度运行确实揭示了根本原因:
ok: [localhost] => {
"vnet": "VARIABLE IS NOT DEFINED!: 'dict object' has no attribute 'us-yankee-doodle'"
}
您可以在azure_vars.yml文件中定义这些结构,包括jinja2模板,但只需知道将它们放在vars文件中并不能解决它们-jinja2模板评估在ansible中是递归的,因此当您第一次看到成功或可怕的变量时,它们就没有定义 给定的azure_vars.yml azure_nprod_vnet:/subscriptions/alpha nprod/resourceGroups/rg001/providers/Microsoft.Network/virtualNetworks/vnet azure_prod03_vnet:/subscriptions/beta-prod03/resourceGroups/rg002/providers/Microsoft.Network/virtualNetworks/vnet azure_prod02_vnet:/subscriptions/charlie-prod02/resourceGroups/rg003/providers/Microsoft.Network/virtualNetworks/vnet 按\u azure\u域列出的内容: us-sea01: azure_位置:westus2 研究小组:rg001 vnet:{{azure\u nprod\u vnet} eu-azrc1: 地点:西欧 资源组:rg002 vnet:{{azure_prod03_vnet} us-azrc2: azure_位置:southcentralus 资源组:rg003 vnet:{{azure_prod02_vnet} vnet:{{things\u by_azure\u domain[azure\u domain].vnet} 然后,将azure_域放入作用域后,{{vnet}的使用将递归地计算该表达式: 任务: 注意,即使“azure_域”尚未定义,我们也可以将其包括在内 因为'include_vars'不计算那些jinja2表达式 -包含变量:azure\u vars.yml -设定事实: azure_域:us-azrc2 -调试: 变量:vnet 屈服
ok: [localhost] => {
"vnet": "/subscriptions/charlie-prod02/resourceGroups/rg003/providers/Microsoft.Network/virtualNetworks/vnet"
但是,正如我所说,你需要小心谨慎,因为胖手指不会有好下场:
任务:
-包含变量:azure\u vars.yml
-设定事实:
azure_域名:美国洋基涂鸦
-调试:
变量:vnet
屈服
ok: [localhost] => {
"vnet": "VARIABLE IS NOT DEFINED!"
}
但至少在我的ansible 2.9.13中,以更高的详细度运行确实揭示了根本原因:
ok: [localhost] => {
"vnet": "VARIABLE IS NOT DEFINED!: 'dict object' has no attribute 'us-yankee-doodle'"
}
我喜欢@mdaniel的想法,但我不知道以后谁会把它们放在你的剧本中,用于不同的任务:
根据你的帖子,你可以稍微调整一下你的azure_vars.yml,以便让它们按相同的顺序排列,这将有助于在以后的游戏中轻松调用它们
因此,我在过去的十年中首先与美国地区结盟,紧随欧洲之后
Var文件:
播放:
现在,您可以稍微精简您的剧本,这将帮助您只修改azure_vars.yml,而不是在剧本中
---
- name: create azure vm
hosts: localhost
connection: local
tasks:
- include_vars: azure_vars.yml
- set_fact:
host: "{{ azure_vm_name.split('.') }}"
- set_fact:
domain: "{{ host.1 }}.{{ host.2 }}"
- name: Domain
debug:
msg: "{{ domain }}"
- set_fact:
location: "{{ azure_location[0] }}"
when: 'domain == azure_domain[0]'
- set_fact:
location: "{{ azure_location[1] }}"
when: 'domain == azure_domain[1]'
- set_fact:
location: "{{ azure_location[2] }}"
when: 'domain == azure_domain[2]'
- name: Location
debug:
msg: "{{ location }}"
- set_fact:
res_group: "{{ azure_res_group[0] }}"
when: 'domain == azure_domain[0]'
- set_fact:
res_group: "{{ azure_res_group[1] }}"
when: 'domain == azure_domain[1]'
- set_fact:
res_group: "{{ azure_res_group[2] }}"
when: 'domain == azure_domain[2]'
- name: Resource Group
debug:
msg: "{{ res_group }}"
- set_fact:
vnet: "{{ azure_nprod_vnet }}"
when: 'domain == azure_domain[0]'
- set_fact:
vnet: "{{ azure_prod03_vnet }}"
when: 'domain == azure_domain[2]'
- set_fact:
vnet: "{{ azure_prod02_vnet }}"
when: 'domain == azure_domain[1]'
- name: Vnet
debug:
msg: "{{ vnet }}"
我喜欢@m的想法
daniel但我不知道以后谁会把它们放在你的剧本中,用于不同的任务:
根据你的帖子,你可以稍微调整一下你的azure_vars.yml,以便让它们按相同的顺序排列,这将有助于在以后的游戏中轻松调用它们
因此,我在过去的十年中首先与美国地区结盟,紧随欧洲之后
Var文件:
播放:
现在,您可以稍微精简您的剧本,这将帮助您只修改azure_vars.yml,而不是在剧本中
---
- name: create azure vm
hosts: localhost
connection: local
tasks:
- include_vars: azure_vars.yml
- set_fact:
host: "{{ azure_vm_name.split('.') }}"
- set_fact:
domain: "{{ host.1 }}.{{ host.2 }}"
- name: Domain
debug:
msg: "{{ domain }}"
- set_fact:
location: "{{ azure_location[0] }}"
when: 'domain == azure_domain[0]'
- set_fact:
location: "{{ azure_location[1] }}"
when: 'domain == azure_domain[1]'
- set_fact:
location: "{{ azure_location[2] }}"
when: 'domain == azure_domain[2]'
- name: Location
debug:
msg: "{{ location }}"
- set_fact:
res_group: "{{ azure_res_group[0] }}"
when: 'domain == azure_domain[0]'
- set_fact:
res_group: "{{ azure_res_group[1] }}"
when: 'domain == azure_domain[1]'
- set_fact:
res_group: "{{ azure_res_group[2] }}"
when: 'domain == azure_domain[2]'
- name: Resource Group
debug:
msg: "{{ res_group }}"
- set_fact:
vnet: "{{ azure_nprod_vnet }}"
when: 'domain == azure_domain[0]'
- set_fact:
vnet: "{{ azure_prod03_vnet }}"
when: 'domain == azure_domain[2]'
- set_fact:
vnet: "{{ azure_prod02_vnet }}"
when: 'domain == azure_domain[1]'
- name: Vnet
debug:
msg: "{{ vnet }}"
非常感谢您的详细解释,这很有帮助。不过,我想知道我能不能把它融入我之前更新过的剧本中。非常感谢你的详细解释,这很有帮助。但是,我想知道我是否可以将这一点融入我不久前更新的剧本中。非常感谢@Karn,这很有帮助。非常感谢@Karn,这很有帮助。记录在案,这里是交叉提问:记录在案,这里是交叉提问: