Ansible跨剧本传参问题:从inventory1传递varx至playbook2
解决方案:从inventory1传递varx到playbook2的正确实现
问题分析
你的核心问题出在两个地方:
- Role1传递参数的写法错误:后来修改的
arguments参数用法不对,command模块的arguments是用来配置命令执行的选项(如工作目录),不是传递命令的位置参数。 - 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
相关产品推荐
相关产品推荐

