如何向导入的Ansible Playbook传递额外的环境变量

3

我有一个名为main_play.yml的Ansible playbook,其中我正在导入一个可重复使用的playbooka.yml

main_play.yml

- import_playbook: "reusable_playbooks/a.yml"

a.yml

---
- name: my_playbook
  hosts: "{{ HOSTS }}"
  force_handlers: true
  gather_facts: false

  environment:
    APP_DEFAULT_PORT: "{{ APP_DEFAULT_PORT }}"
 
  tasks:
    - name: Print Msg
      debug:
        msg: "hello"

我的问题是:如何将额外的环境变量从我的 main_playbook.yml playbook传递到可重复使用的playbook a.yml(如果需要),以便环境变量变得像
environment:
    APP_DEFAULT_PORT: "{{ APP_DEFAULT_PORT }}"
    SPRING_PROFILE: "{{ SPRING_PROFILE }}"

是的,从技术上讲不会打印,但你可以看到我的键和值都有相同的名称,所以它会打印出该值。例如,如果说 environment: APP_DEFAULT_PORT: "{{ APP_DEFAULT_PORT_VAL }}" & msg: "Port: {{ APP_DEFAULT_PORT_VAL }}" 这里将失败。 - Sanjesh M
无论如何,这不是我们关心的问题,我们可以忽略“打印消息”任务。 - Sanjesh M
我已经编辑了打印消息,因为它会误导主要的请求。 - Sanjesh M
1个回答

0

import_playbook并不是一个模块,而是一个核心功能。它不允许传递任何参数到导入的playbook中。你可以将这个关键字看作是一个简单的工具,以便像在同一个文件中定义一样顺序地运行多个playbooks。

所以你的问题归结为:

如何向play传递额外的环境变量?

下面是一个解决方案,带有说明如何使用extra_vars或从前一个play中设置一个fact。这远非详尽无遗,但我希望它能指引你找到最佳解决方案。

为了方便阅读:

  • 我在下面的示例中为所有环境变量使用了APP_前缀,并仅对结果进行了过滤。
  • 我截断了playbook输出,只保留了相关的debug任务。

我们可以定义以下reusable.yml playbook,其中包含一个单独的play

 ---
 - hosts: localhost
   gather_facts: false
 
   vars:
     default_env:
       APP_DEFAULT_PORT: "{{ APP_DEFAULT_PORT | d(8080) }}"
 
   environment: "{{ default_env | combine(additionnal_env | d({})) }}"
 
   tasks:
     - name: get the output on env for APP_* vars
       shell: env | grep -i app_
       register: env_cmd
       changed_when: false
 
     - name: debug the output of env
       debug:
         var: env_cmd.stdout_lines

我们可以直接运行这个playbook,它会给出

$ ansible-playbook reusable.yml
[... truncated ...]
TASK [debug the output of env] ************************************************************************************************************************************************************************************
ok: [localhost] => {
    "env_cmd.stdout_lines": [
        "APP_DEFAULT_PORT=8080"
    ]
}

我们可以使用以下方法覆盖默认端口

$ ansible-playbook reusable.yml -e APP_DEFAULT_PORT=1234
[... truncated ...]
TASK [debug the output of env] ************************************************************************************************************************************************************************************
ok: [localhost] => {
    "env_cmd.stdout_lines": [
        "APP_DEFAULT_PORT=1234"
    ]
}

我们可以使用以下方式传递额外的环境变量:
$ ansible-playbook reusable.yml -e '{"additionnal_env":{"APP_SPRING_PROFILE": "/toto/pipo"}}'
[... truncated ...]
TASK [debug the output of env] ************************************************************************************************************************************************************************************
ok: [localhost] => {
    "env_cmd.stdout_lines": [
        "APP_SPRING_PROFILE=/toto/pipo",
        "APP_DEFAULT_PORT=8080"
    ]
}

如果我们想从父级playbook执行此操作,我们可以在先前的play中为指定的主机设置所需变量。我们可以定义一个名为parent.yml的playbook:

 ---
 - hosts: localhost
   gather_facts: false
 
   tasks:
     - name: define additionnal env vars for this host to be used in next play(s)
       set_fact:
         additionnal_env:
           APP_WHATEVER: some_value
           APP_VERY_IMPORTANT: "ho yes!"
 
 - import_playbook: reusable.yml

这将会给出:

$ ansible-playbook parent.yml 
[... truncated ...]
TASK [define additionnal env vars for this host to be used in next play(s)] ************************************************************************************************************************
ok: [localhost]
[... truncated ...]
TASK [debug the output of env] ************************************************************************************************************************************************************************************
ok: [localhost] => {
    "env_cmd.stdout_lines": [
        "APP_WHATEVER=some_value",
        "APP_VERY_IMPORTANT=ho yes!",
        "APP_DEFAULT_PORT=8080"
    ]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接