Динамически загружать переменные среды из файла конфигурации в Ansible

У меня есть следующая (упрощенная) игра:

- hosts: testing

  roles:
     - nginx
  vars_files:
     - config.yml
  environment:
    http_proxy: http://proxy.example.com:8080

Теперь, когда я запускаю свой код, я могу читать process.env.http_proxy. Однако я хотел бы иметь возможность динамически устанавливать другие переменные среды в environment. Например, в моем config.yml у меня есть следующее:

application_variables:
  - key: "NODE_ENV"
    value: "production"
  - key: "PORT"
    value: "3000"

Как мне добиться, чтобы значения из application_variables динамически создавались в среде? Я попробовал несколько разных решений, но безрезультатно.

Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
1
0
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете передать параметр environment из шаблонного выражения Jinja, в вашем случае:

environment: "{{ application_variables | items2dict }}"

Тогда у вас есть выбор:

  • либо добавьте переменную HTTP-прокси в свой список application_variables:
    application_variables:
      - key: http_proxy
        value: http://proxy.example.com:8080
      - key: NODE_ENV
        value: production
      - key: PORT
        value: 3000
    
  • или combine словарь, созданный из application_variables с переменной, определенной в вашей книге игр:
    - hosts: testing
    
      environment: >-
        {{ 
          default_env | combine(
            application_variables | items2dict
          )
        }}
      vars:
        default_env:
          http_proxy: http://proxy.example.com:8080
    

В качестве примера пьеса:

- hosts: localhost
  gather_facts: true

  environment: >-
    {{ 
      default_env | combine(
        application_variables | items2dict
      ) 
    }}
  vars_files: config.yml
  vars:
    default_env:
      http_proxy: http://proxy.example.com:8080

  tasks:
    - debug:
        msg:
          http_proxy: "{{ ansible_facts.env.http_proxy }}"
          NODE_ENV: "{{ ansible_facts.env.NODE_ENV }}"

Дал бы вам:

ok: [localhost] => 
  msg:
    NODE_ENV: production
    http_proxy: http://proxy.example.com:8080

Объедините окружающую среду

  env_static:
    http_proxy: http://proxy.example.com:8080
  env_dynamic: "{{ application_variables | items2dict }}"
  env: "{{ env_static | combine(env_dynamic) }}"

дает

  env:
    NODE_ENV: production
    PORT: '3000'
    http_proxy: http://proxy.example.com:8080

Импортировать роль

    - import_role:
        name: nginx
      environment: "{{ env }}"

Например, учитывая упрощенную роль

shell> cat roles/nginx/tasks/main.yml 
- command: echo $NODE_ENV $PORT $http_proxy
  register: out
- debug:
    var: out.stdout

дает

  out.stdout: production 3000 http://proxy.example.com:8080

Example of a complete playbook for testing

- hosts: test

  vars_files:
    - config.yml

  vars:

    env_static:
      http_proxy: http://proxy.example.com:8080
    env_dynamic: "{{ application_variables | items2dict }}"
    env: "{{ env_static | combine(env_dynamic) }}"

  tasks:

    - debug:
        var: env

    - import_role:
        name: nginx
      environment: "{{ env }}"

Другие вопросы по теме