У меня есть следующая (упрощенная) игра:
- 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
динамически создавались в среде? Я попробовал несколько разных решений, но безрезультатно.
Вы можете передать параметр environment
из шаблонного выражения Jinja, в вашем случае:
environment: "{{ application_variables | items2dict }}"
Тогда у вас есть выбор:
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 }}"