我有以下主要剧本
- hosts: localhost
vars_files:
- ../vars/environment-mapping.yml
tasks:
- name: echo and register controller's ip
ansible.builtin.shell:
cmd: |
echo "$(hostname -I)" | sed 's/\s*$//'
register: bash_echoed__controller_ip
- name: set controller_ip_stringified
set_fact:
controller_ip: "{{ bash_echoed__controller_ip.stdout }}"
- name: set environment
set_fact:
environment: "{{ controller_ip_environment_map[controller_ip] | default('unknown') }}"
- name: show debug
debug:
msg:
- "controller_ip_environment_map: {{ controller_ip_environment_map }}"
- "controller_ip: {{ controller_ip }}"
- "environment: {{ environment }}"
和 vars_file
../vars/environment-mapping.yml
---
controller_ip_environment_map: {
"XX.XXX.X.Y": "DEV",
"XX.XXX.X.W": "TEST",
"XX.XXX.X.Z": "PROD",
}
当我运行剧本时,我得到
- localhost on hosts: localhost -
Gathering Facts...
localhost ok
echo and register controller's ip...
localhost done | stdout: XX.XXX.X.Y
set controller_ip_stringified...
localhost ok
set environment...
localhost ok
show debug...
localhost ok: {
"changed": false,
"msg": [
"controller_ip: XX.XXX.X.Y",
"controller_ip_environment_map: {'XX.XXX.X.Y': 'DEV', 'XX.XXX.X.W': 'TEST', 'XX.XXX.X.Z': 'PROD'}",
"environment: []",
]
}
但是由于
XX.XXX.X.Y
是controller_ip_environment_map
的键,我期望环境获得值DEV
,而它获得空列表的值。
为什么会这样?
重命名变量
environment
(例如重命名为 machines_envronment
)解决了问题。
很可能
environment
是某个 ansible 配置中已定义的变量。
- hosts: localhost
vars_files:
- ../vars/environment-mapping.yml
tasks:
- name: echo and register controller's ip
ansible.builtin.shell:
cmd: |
echo "$(hostname -I)" | sed 's/\s*$//'
register: bash_echoed__controller_ip
- name: set controller_ip_stringified
set_fact:
controller_ip: "{{ bash_echoed__controller_ip.stdout }}"
- name: set machines_environment
set_fact:
machines_environment: "{{ controller_ip_environment_map[controller_ip] | default('unknown') }}"
- name: show debug
debug:
msg:
- "controller_ip_environment_map: {{ controller_ip_environment_map }}"
- "controller_ip: {{ controller_ip }}"
- "machines_environment: {{ machines_environment }}"
- localhost on hosts: localhost -
Gathering Facts...
localhost ok
echo and register controller's ip...
localhost done | stdout: XX.XXX.X.Y
set controller_ip_stringified...
localhost ok
set environment...
localhost ok
show debug...
localhost ok: {
"changed": false,
"msg": [
"controller_ip: XX.XXX.X.Y",
"controller_ip_environment_map: {'XX.XXX.X.Y': 'DEV', 'XX.XXX.X.W': 'TEST', 'XX.XXX.X.Z': 'PROD'}",
"environment: DEV",
]
}