Ansible 在变量模板中使用 task return 变量
Ansible use task return varible in variable templates
我正在尝试制作一个环境变量列表,以用于可能由于版本差异而在每个主机上具有略微不同路径的任务。
例如,/some/common/path/v_123/rest/of/path
我在通过角色导入的 variables.yml 文件中创建了这些变量的列表。
roles/somerole/varables/main.yml
包含以下内容
somename:
somevar: 'coolvar'
env:
SOME_LIB_PATH: /some/common/path/{{ unique_part.stdout }}/rest/of/path
然后我有一个运行类似这样的任务
- name: Get unique path part
shell: 'ls /some/common/path/'
register: unique_part
tags: workflow
- name: Perform some actions that need some paths
shell: 'binary argument argument'
environment: somename.env
但是我收到一些关于未定义变量的 Ansible 错误。
或者我尝试预定义 unique_part.stdout
希望寄存器覆盖预定义的变量,但后来我遇到了其他错误 - 模板失败。
是否有另一种方法可以根据命令 returns 制作这些变量?
当 Ansible 读取 vars 文件时对其进行评估。您唯一的机会是包含一个占位符,然后您必须自己替换它,如下所示:
somename:
somevar: 'coolvar'
env:
SOME_LIB_PATH: '/some/common/path/[[ unique_part.stdout ]]/rest/of/path'
稍后在您的剧本中您可以替换该占位符:
- name: Perform some actions that need some paths
shell: 'binary argument argument'
environment: '{{ somename.env | replace("[[ unique_part.stdout ]]", unique_part.stdout) }}'
您还可以使用事实:
http://docs.ansible.com/set_fact_module.html
# Prepare unique variables
- hosts: myservers
tasks:
- name: Get unique path part
shell: 'ls /some/common/path/'
register: unique_part
tags: workflow
- name: Add as Fact per for each hosts
set_fact:
library_path: "{{ unique_part.stdout }}"
# launch roles that use those unique variables
- hosts: myservers
roles:
- somerole
这样您就可以在使用主机之前动态地向主机添加变量。
我正在尝试制作一个环境变量列表,以用于可能由于版本差异而在每个主机上具有略微不同路径的任务。
例如,/some/common/path/v_123/rest/of/path
我在通过角色导入的 variables.yml 文件中创建了这些变量的列表。
roles/somerole/varables/main.yml
包含以下内容
somename:
somevar: 'coolvar'
env:
SOME_LIB_PATH: /some/common/path/{{ unique_part.stdout }}/rest/of/path
然后我有一个运行类似这样的任务
- name: Get unique path part
shell: 'ls /some/common/path/'
register: unique_part
tags: workflow
- name: Perform some actions that need some paths
shell: 'binary argument argument'
environment: somename.env
但是我收到一些关于未定义变量的 Ansible 错误。
或者我尝试预定义 unique_part.stdout
希望寄存器覆盖预定义的变量,但后来我遇到了其他错误 - 模板失败。
是否有另一种方法可以根据命令 returns 制作这些变量?
当 Ansible 读取 vars 文件时对其进行评估。您唯一的机会是包含一个占位符,然后您必须自己替换它,如下所示:
somename:
somevar: 'coolvar'
env:
SOME_LIB_PATH: '/some/common/path/[[ unique_part.stdout ]]/rest/of/path'
稍后在您的剧本中您可以替换该占位符:
- name: Perform some actions that need some paths
shell: 'binary argument argument'
environment: '{{ somename.env | replace("[[ unique_part.stdout ]]", unique_part.stdout) }}'
您还可以使用事实: http://docs.ansible.com/set_fact_module.html
# Prepare unique variables
- hosts: myservers
tasks:
- name: Get unique path part
shell: 'ls /some/common/path/'
register: unique_part
tags: workflow
- name: Add as Fact per for each hosts
set_fact:
library_path: "{{ unique_part.stdout }}"
# launch roles that use those unique variables
- hosts: myservers
roles:
- somerole
这样您就可以在使用主机之前动态地向主机添加变量。