如何使用内置的 vars 插件引用变量?
How to reference a variable using the builtin vars plugin?
是否可以使用内置 vars
插件在任务中引用变量?
当我使用 "{{ variable }}"
语法时,它被视为字符串。
- name: Get the active network interface name
shell: ip route get 1.1.1.1 | grep -Po '(?<=dev\s)\w+' | cut -f1 -d ' '
register: interface_name
## Example: interface_name: enp33s0f0
- name: Update netplan
set_fact:
mydata: "{{ mydata | combine(newdata, recursive=True) }}"
vars:
newdata:
network:
ethernets:
"{{ interface_name.stdout }}":
dhcp4: true
critical: true
nameservers:
addresses:
- 2.2.2.2
search: [test.local]
- name: Write back to a file
copy:
content: "{{ mydata | to_nice_yaml }}"
dest: /etc/netplan/00-installer-config.yaml
register: update
cat 00-installer-config.yaml
network:
ethernets:
'{{ interface_name.stdout }}':
critical: true
dhcp4: true
nameservers:
addresses:
- 2.2.2.2
search:
- test.local
如果这不可能,是否有替代方案?
您可以在 set_fact
任务本身中声明您的变量,以便使 Ansible 模板成为字典键:
- set_fact:
mydata: >-
{{
mydata | default({}) | combine(
{
'network': {
'ethernets': {
interface_name.stdout: {
'dhcp': true,
'critical': true,
'nameservers': {
'addresses': ['2.2.2.2'],
'search': ['test.local']
}
}
}
}
}, recursive=True
)
}}
鉴于剧本:
- hosts: localhost
gather_facts: no
vars:
interface_name:
stdout: enp33s0f0
tasks:
- set_fact:
mydata: >-
{{
mydata | default({}) | combine(
{
'network': {
'ethernets': {
interface_name.stdout: {
'dhcp': true,
'critical': true,
'nameservers': {
'addresses': ['2.2.2.2'],
'search': ['test.local']
}
}
}
}
}, recursive=True
)
}}
- debug:
var: mydata
这产生:
TASK [set_fact] *************************************************************
ok: [localhost]
TASK [debug] ****************************************************************
ok: [localhost] =>
mydata:
network:
ethernets:
enp33s0f0:
critical: true
dhcp: true
nameservers:
addresses:
- 2.2.2.2
search:
- test.local
是否可以使用内置 vars
插件在任务中引用变量?
当我使用 "{{ variable }}"
语法时,它被视为字符串。
- name: Get the active network interface name
shell: ip route get 1.1.1.1 | grep -Po '(?<=dev\s)\w+' | cut -f1 -d ' '
register: interface_name
## Example: interface_name: enp33s0f0
- name: Update netplan
set_fact:
mydata: "{{ mydata | combine(newdata, recursive=True) }}"
vars:
newdata:
network:
ethernets:
"{{ interface_name.stdout }}":
dhcp4: true
critical: true
nameservers:
addresses:
- 2.2.2.2
search: [test.local]
- name: Write back to a file
copy:
content: "{{ mydata | to_nice_yaml }}"
dest: /etc/netplan/00-installer-config.yaml
register: update
cat 00-installer-config.yaml
network:
ethernets:
'{{ interface_name.stdout }}':
critical: true
dhcp4: true
nameservers:
addresses:
- 2.2.2.2
search:
- test.local
如果这不可能,是否有替代方案?
您可以在 set_fact
任务本身中声明您的变量,以便使 Ansible 模板成为字典键:
- set_fact:
mydata: >-
{{
mydata | default({}) | combine(
{
'network': {
'ethernets': {
interface_name.stdout: {
'dhcp': true,
'critical': true,
'nameservers': {
'addresses': ['2.2.2.2'],
'search': ['test.local']
}
}
}
}
}, recursive=True
)
}}
鉴于剧本:
- hosts: localhost
gather_facts: no
vars:
interface_name:
stdout: enp33s0f0
tasks:
- set_fact:
mydata: >-
{{
mydata | default({}) | combine(
{
'network': {
'ethernets': {
interface_name.stdout: {
'dhcp': true,
'critical': true,
'nameservers': {
'addresses': ['2.2.2.2'],
'search': ['test.local']
}
}
}
}
}, recursive=True
)
}}
- debug:
var: mydata
这产生:
TASK [set_fact] *************************************************************
ok: [localhost]
TASK [debug] ****************************************************************
ok: [localhost] =>
mydata:
network:
ethernets:
enp33s0f0:
critical: true
dhcp: true
nameservers:
addresses:
- 2.2.2.2
search:
- test.local