Q: "Установите среду и зарегистрируйте переменные среды, чтобы использовать их в ключевом слове среды для запуска других команд."
A: Переменные среды, заданные в команде 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
задании.
Q: "что, если я не знаю, какие все переменные присутствуют в файле env. Есть ли другой способ напечатать все переменные вместо использования echo."
A: Краткий ответ: создайте словарь 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: 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"
}