You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible跨剧本传参问题:从inventory1传递varx至playbook2

解决方案:从inventory1传递varx到playbook2的正确实现

问题分析

你的核心问题出在两个地方:

  1. Role1传递参数的写法错误:后来修改的arguments参数用法不对,command模块的arguments是用来配置命令执行的选项(如工作目录),不是传递命令的位置参数。
  2. Script.sh的语法错误:在bash脚本里使用了Ansible的Jinja2模板语法({ 'varx='~varx if varx is defined else '' }}),bash无法解析;同时变量赋值时等号后多了空格,会导致参数拼接失败。

步骤1:修复Role1中传递变量到script.sh的逻辑

在role1的main.yml中,直接在command里正确拼接参数即可,无需用arguments字段。如果担心变量中有空格,用双引号包裹整个命令:

---
- name: 执行script.sh并传递env和varx参数
  command: "bash script.sh {{ env }} {{ 'varx=' ~ varx if varx is defined else '' }}"
  args:
    chdir: "{{ playbook_dir }}/scripts"  # 替换为script.sh实际所在目录,可选但推荐

步骤2:修复script.sh的参数处理逻辑

修改script.sh,去掉无效的Jinja语法,正确处理传入的参数,并拼接成playbook2需要的extra-vars:

#!/bin/bash
# 读取传入的参数,$1是env,$2是varx=xxx(如果存在)
ENV="$1"
VARX_PARAM="$2"

do_stuff() {
    # 初始化extra-vars参数,先加入env
    local extra_vars="env=$ENV"
    
    # 如果VARX_PARAM不为空,说明inventory1中有varx,追加到参数中
    if [ -n "$VARX_PARAM" ]; then
        extra_vars="$extra_vars $VARX_PARAM"
    fi
    
    # 调用playbook2,传递拼接好的参数
    ansible-playbook -i inventory/inventory2.yml playbook2.yml --extra-vars "$extra_vars"
}

do_stuff

逻辑验证

  • 当运行ansible-playbook -i inventory/inventory1.yml playbooks/playbook1.yml --extra-vars "env=env2"时:
    inventory1的env2组有varx,role1会传递env2 varx=valuex给script.sh,script.sh将env=env2 varx=valuex作为extra-vars传给playbook2。由于Ansible的extra-vars优先级高于inventory变量,playbook2会使用这个传递过来的varx,而非inventory2中的值。
  • 当运行ansible-playbook -i inventory/inventory1.yml playbooks/playbook1.yml --extra-vars "env=env1"时:
    inventory1的env1组无varx,role1只传递env1给script.sh,script.sh仅传递env=env1给playbook2,此时playbook2会使用inventory2.yml中定义的varx。

额外提示

如果varx的值包含空格或特殊字符,建议在role1中用quote过滤器处理,避免bash解析错误:

command: "bash script.sh {{ env }} {{ ('varx=' ~ varx)|quote if varx is defined else '' }}"

内容的提问来源于stack exchange,提问作者fr0zt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:01:19