问:“设置环境并注册环境变量,以便在 environment 关键字中使用它们来运行其他命令。”
A:shell命令中设置的环境变量不能持久化。执行命令后,shell 进程将终止。例如
- shell: |
cat ./.env337
. ./.env337
echo "AB_HOME = $AB_HOME"
echo "PATH = $PATH"
exit 0
register: result
- debug:
var: result.stdout_lines
- shell: |
echo "AB_HOME = $AB_HOME"
echo "PATH = $PATH"
exit 0
register: result
- debug:
var: result.stdout_lines
给
"result.stdout_lines": [
"export AB_HOME=/tl/dev/abinitio/abinitio-V3 #/gcc3p32 # for 32-bit",
"export PATH=${AB_HOME}/bin:${PATH}",
"",
"AB_HOME = /tl/dev/abinitio/abinitio-V3",
"PATH = /tl/dev/abinitio/abinitio-V3/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/home/admin/bin"
]
"result.stdout_lines": [
"AB_HOME = ",
"PATH = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/home/admin/bin"
]
正如预期的那样,第二个shell 任务中缺少变量。
问:“如果我不知道 env 文件中存在的所有变量是什么。有没有其他方法可以打印所有变量而不是使用 echo。”
答:简短回答:使用环境变量创建字典 env_dict_add。在shell模块中使用它来创建环境environment: "{{ env_dict_add }}"。
详情
1) 创建一个未知变量列表。例如
- shell: cat ./.env337
register: result
- set_fact:
env_list: "{{ env_list|default([]) +
[item.split('=').0.split(' ').1|trim] }}"
loop: "{{ result.stdout_lines }}"
- debug:
var: env_list
给予
"env_list": [
"AB_HOME",
"PATH"
]
2) 使用环境创建字典。例如
- shell: |
. ./.env337
set
register: result
- set_fact:
env_dict: "{{ env_dict|default({})|
combine({my_key: my_value}) }}"
vars:
my_key: "{{ item.split('=').0 }}"
my_value: "{{ item.split('=').1|default('') }}"
loop: "{{ result.stdout_lines }}"
3) 使用字典中的任何环境变量。例如,打印通过获取文件.env337 导出的任何变量
- debug:
msg: "var: {{ item }} value: {{ env_dict[item] }}"
loop: "{{ env_list }}"
给予
"msg": "var: AB_HOME value: /tl/dev/abinitio/abinitio-V3"
"msg": "var: PATH value: /tl/dev/abinitio/abinitio-V3/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/home/admin/bin"
4) 仅使用附加环境变量创建字典。例如
- set_fact:
env_dict_add: "{{ env_dict_add|default({})|
combine({item: env_dict[item]}) }}"
loop: "{{ env_list }}"
- debug:
var: env_dict_add
给予
"env_dict_add": {
"AB_HOME": "/tl/dev/abinitio/abinitio-V3",
"PATH": "/tl/dev/abinitio/abinitio-V3/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/home/admin/bin"
}
5) 使用字典env_dict_add 在shell 命令中创建环境变量。例如
- shell: echo ${{ item }}
loop: "{{ env_list }}"
register: result
environment: "{{ env_dict_add }}"
- debug:
msg: "{{ dict(result.results|json_query('[].[item, stdout]')) }}"
给
"msg": {
"AB_HOME": "/tl/dev/abinitio/abinitio-V3",
"PATH": "/tl/dev/abinitio/abinitio-V3/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/home/admin/bin"
}