Ansible如何仅在变量存在时传递该变量至子Playbook?
问题描述
我运行以下Ansible Playbook命令:
ansible-playbook -i inventory/inventory1.yml playbooks/playbook1.yml --extra-vars "environment=my_env var=my_var"
inventory1.yml配置片段:
... children: env1: hosts: env1.domain.com: vars: port: '8000' name: name1 parameter: 'parameter1' env2: hosts: env2.domain.com: vars: port: '8000' name: name2 env3: hosts: env3.domain.com: vars: port: '8000' name: name3 parameter: 'parameter1'
注:仅env1和env3环境存在parameter变量。
playbook1.yml内容:
--- - hosts: "{{ environment }}" roles: - my_role
my_role的main.yml当前内容:
- name: My_role command: ansible-playbook -i inventory/inventory2.yml playbook2.yml --extra-vars=" environment={{ environment }} parameter={{ parameter }} "
需求:通过playbook1.yml调用playbook2.yml时,仅当parameter变量存在时,才将其通过--extra-vars传递给playbook2.yml;变量不存在则不传递该参数。
解决方案
方法1:直接在command中使用Jinja2条件判断
直接修改my_role/main.yml,利用Jinja2的条件语句判断parameter是否存在,仅存在时才添加该参数:
- name: 调用playbook2.yml command: > ansible-playbook -i inventory/inventory2.yml playbook2.yml --extra-vars=" environment={{ environment }} {% if parameter is defined %} parameter={{ parameter }} {% endif %} "
解释:
{% if parameter is defined %}会检查当前上下文是否存在parameter变量,存在则渲染parameter={{ parameter }}这行内容,否则跳过,避免因变量未定义导致的报错。
方法2:先构建变量字典再转JSON传递(更推荐)
这种方式更清晰,尤其适合变量较多的场景,避免字符串拼接的混乱:
- name: 构建额外变量字典 set_fact: extra_vars: environment: "{{ environment }}" {% if parameter is defined %} parameter: "{{ parameter }}" {% endif %} - name: 调用playbook2.yml command: > ansible-playbook -i inventory/inventory2.yml playbook2.yml --extra-vars="{{ extra_vars | to_json }}"
解释:先通过
set_fact动态生成包含需要传递的变量的字典,再用to_json过滤器将字典转为JSON格式传递给--extra-vars,Ansible会自动解析JSON格式的变量参数。
方法3:拆分任务(适用于复杂逻辑)
如果后续有更多条件判断需求,可以拆分任务,分别处理存在/不存在parameter的情况:
- name: 调用playbook2.yml(含parameter参数) command: > ansible-playbook -i inventory/inventory2.yml playbook2.yml --extra-vars="environment={{ environment }} parameter={{ parameter }}" when: parameter is defined - name: 调用playbook2.yml(不含parameter参数) command: > ansible-playbook -i inventory/inventory2.yml playbook2.yml --extra-vars="environment={{ environment }}" when: parameter is not defined
解释:通过
when条件分别执行两个任务,根据parameter是否存在选择对应的命令,逻辑直观易懂。
内容的提问来源于stack exchange,提问作者fr0zt
相关产品推荐
相关产品推荐

