Ansible - настройка переменных среды - PullRequest
0 голосов
/ 18 февраля 2020

Мне нужно установить среду на целевой машине. Переменные среды присутствуют в файле с именем .env337. Внутри этого файла есть несколько переменных, таких как

export AB_HOME=/tl/dev/abinitio/abinitio-V3  #/gcc3p32   # for 32-bit
export PATH=${AB_HOME}/bin:${PATH}

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

- hosts: dev
  gather_facts: false
  tasks:
    - name: To set the environment
      shell: . ./.env337
      register: output

Есть ли другой способ решить эту проблему.

1 Ответ

0 голосов
/ 18 февраля 2020

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"
    }
...