Во-первых, синтаксис . ./.env_file_name
является синтаксисом shell и не может работать с command
модулем , вам необходимо использовать модуль shell
.
Во-вторых, контекст среды оболочки сбрасывается при каждой задаче, поскольку каждая из них представляет собой команду s sh туда-обратно (так что это новый сеанс оболочки), и загрузка переменных среды в одной задаче не будет сделайте их доступными для следующих задач.
В зависимости от контекста у вас есть несколько вариантов:
1. Переменные среды инвентаризации
Наилучший вариант состоит в том, чтобы окружение на стороне вашего инвентаря находилось в переменной с различным значением для каждой группы / хоста через group_vars
/ host_vars
, а затем использовать для ключевого слова environment
# host_vars/my_host.yml
---
env_vars:
VAR1: key1
VAR2: key2
- hosts: my_host
tasks:
- name: Display environment variables
command: env
environment: "{{ env_vars }}"
Плюсы:
- full ansible решение
- будет работать для среда каждого модуля
Минусы:
- необходимо знать переменные среды на ansible стороне
2. Загрузка переменных среды для каждой задачи
Если все ваши задачи shell
/ command
(что я не советую, так как лучше использовать соответствующий ansible модуль , когда это возможно ), вы можете просто каждый раз загружать файл env с помощью модуля оболочки
- hosts: my_host
tasks:
- name: Display environment variables
shell: |
. ./.env_file_name && env
- name: Do another action
shell: |
. ./.env_file_name && do_something_else
Плюсы:
- нет необходимости знать переменные окружения на ansible стороне
Минусы:
- ограничено задачами с
shell
модулем
3. Загружать переменные окружения из env_file в ansible fact
Этот параметр позволяет раз и навсегда проанализировать файл env и загрузить его в факте ansible для использования с ключевым словом environment
.
- hosts: my_host
tasks:
- name: Get env file content
slurp:
src: ./.env_file_name
register: env_file_content
- name: Parse environment
set_fact:
env_vars: "{{ ('{' + (env_file_content.content | b64decode).split('\n') | select | map('regex_replace', '([^=]*)=(.*)', '\"\\1\": \"\\2\"') | join(',') + '}') | from_json }}"
- name: Display environment variables
command: env
environment: "{{ env_vars }}"
Или, если файл env необходимо выполнить вместо непосредственного анализа:
- hosts: my_host
tasks:
- name: Get env file content
shell: . ./.env_file_name
register: env_file_result
- name: Parse environment
set_fact:
env_vars: "{{ ('{' + env_file_result.stdout_lines | map('regex_replace', '([^=]*)=(.*)', '\"\\1\": \"\\2\"') | join(',') + '}') | from_json }}"
- name: Display environment variables
command: env
environment: "{{ env_vars }}"
Плюсы:
- будут работать для среды каждого модуля
- нет необходимости знать переменные окружения на ansible стороне
Минусы:
- может произойти сбой при неправильном форматировании файла