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