如何将额外的环境变量传递给导入的ansible playbook

问题描述 投票:0回答:1

我有一个

main_play.yml
Ansible 剧本,我正在其中导入一个可重复使用的剧本
a.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
剧本传递到我的可重复使用的剧本
a.yml
(如果需要),以便环境变量变得像

environment:
    APP_DEFAULT_PORT: "{{ APP_DEFAULT_PORT }}"
    SPRING_PROFILE: "{{ SPRING_PROFILE }}"
ansible ansible-inventory ansible-facts
1个回答
0
投票

import_playbook
不是真正的模块,而是核心功能。它不允许将任何参数传递给导入的剧本。您可以将此关键字视为一种简单的商品,以方便连续播放多个剧本,就像它们在同一文件中定义一样。

所以你的问题归结为:

如何将额外的环境变量传递给游戏?

这是一个带有插图的解决方案,可以将其与

extra_vars
一起使用,或者设置以前戏剧中的事实。这远非详尽无遗,但我希望它能指导您找到自己的最佳解决方案。

为了便于阅读:

  • 我在下面的示例中为所有环境变量使用了
    APP_
    前缀,并仅对结果进行过滤。
  • 我将剧本输出截断为唯一相关的调试任务

我们可以定义如下

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

我们可以直接按原样运行这个剧本,这将给出

$ 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"
    ]
}

现在,如果我们想从父剧本执行此操作,我们可以在之前的剧本中为给定主机设置所需的变量。我们可以定义一个

parent.yml
剧本:

 ---
 - 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"
    ]
}
© www.soinside.com 2019 - 2024. All rights reserved.