Ansible - переменные окружения из файла .env - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь настроить playbook, который будет запускать команду для проверки состояния службы, установленной на целевой машине. Команда будет работать только в том случае, если .env file выполнена. Команда для выполнения .env file - .<space>./.env_file_name, и файл содержит список переменных среды, таких как export JAVA_HOME=/optware/java/jdk/1.2.

. Я попытался выполнить файл среды перед запуском команды с приведенной ниже таблицей воспроизведения, но это не работает.

- hosts: name
  tasks: 
    - name: `execute env file`
      command: . ./.env_file_name
      register: result

Существует ли какая-либо книга воспроизведения для запуска исполняемого файла среды, чтобы установить среды на целевом компьютере, а затем выполнить нашу команду ??

1 Ответ

1 голос
/ 24 февраля 2020

Во-первых, синтаксис . ./.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 стороне

Минусы:

  • может произойти сбой при неправильном форматировании файла
...