如何从Ansible Inventory提取变量并通过extra-vars传递?
从Ansible清单提取组变量并通过extra-vars传递的问题解决
问题原因
你当前的写法无效,是因为--extra-vars参数中的Jinja2表达式{{hostvars[ENV]['my_var_1']}}不会被Ansible解析,命令行直接将其作为字面量字符串传递给Playbook,而非解析后的变量值。
解决方案
可以通过以下两种方式在脚本中先获取清单里的变量值,再传递给Playbook:
方法1:利用ansible debug模块+grep提取值
修改myscript.sh内容如下:
ENVIR="${1}" # 从清单中提取目标组的my_var_1值 MY_VAR=$(ansible ${ENVIR} -i inventory/my_inv.yml -m debug -a "var=my_var_1" | grep -oP '(?<=my_var_1: ).*') # 传递变量执行Playbook ansible-playbook -i inventory/my_inv.yml --extra-vars "ENV=$ENVIR MY_VAR=$MY_VAR"
原理:用ansible命令指定目标组,通过debug模块输出变量值,再用grep匹配提取出变量的具体内容。
方法2:利用ansible json输出+jq提取值(更可靠)
如果系统安装了jq工具,推荐这种方式,避免grep解析出错:
ENVIR="${1}" # 以json格式输出变量并提取值 MY_VAR=$(ansible ${ENVIR} -i inventory/my_inv.yml -m debug -a "var=my_var_1" -o | jq -r '.my_var_1') # 传递变量执行Playbook ansible-playbook -i inventory/my_inv.yml --extra-vars "ENV=$ENVIR MY_VAR=$MY_VAR"
原理:通过-o参数让ansible输出单行json格式结果,再用jq精准提取变量值,适合复杂输出场景。
内容的提问来源于stack exchange,提问作者fr0zt
相关产品推荐
相关产品推荐

