我正在尝试从bash脚本运行此命令,并从bash参数传递extra-vars。
#!/bin/bash
ansible-playbook /path/to/playbook.yml --extra-vars "var1=1 $@" > /path/to/log/file
我运行如下脚本并收到此错误:
> ./test.bs var2=2 var3=3
ERROR! the playbook: var3=3 could not be found
我甚至试图逃避报价,但它没有用。 我怎么能让它运行?
答案 0 :(得分:1)
或者,您可以将脚本更改为使用$ *:
#!/bin/bash
ansible-playbook /path/to/playbook.yml --extra-vars "var1=1 $*" > /path/to/log/file
答案 1 :(得分:1)
只要您使用Ansible 1.2或更新版本,最强大的工作就是使用jq
生成JSON。以下内容将针对任意数量的key = value参数执行此操作:
#!/bin/bash
jq_args=( )
jq_text='{}'
i=0
for arg in var1=1 "$@"; do
[[ $arg = *=* ]] || continue # require arguments to be in key=value form
key=${arg%%=*}
value=${arg#*=}
jq_args+=( --arg "key$i" "$key" --arg "value$i" "$value" )
jq_text+=" | .[\$key$i]=\$value$i"
((i++))
done
json_final=$(jq "${jq_args[@]}" "$jq_text" <<<"$json") # || exit
ansible-playbook /path/to/playbook.yml --extra-vars "$json_final"
答案 2 :(得分:0)
您将一个长参数传递给--extra-vars
,因为它们都在同一个"
标记内。您正在构建一个var1=1 arg1 arg2 arg3
的单个字符串。
您的意图可能是传递三个参数,每个参数都是一个看起来像var1=1
var2=2
var3=3
话虽如此,试试这个。
ansible-playbook /path/to/playbook.yml --extra-vars "var1=1" "$@" > /path/to/log/file
通过这种方式,您将第一个arg作为字符串"var1=1"
传递,然后bash将"$@"
扩展为您传递给程序的各个参数。
因此,上面的代码段./test.bs var2=2 var3=3
将正确执行。尽管在"
包裹你的args是一种很好的做法,但是为了理智,尽管在这种情况下没有必要。养成这种习惯很有好处,因为有一天你会跑./test.bs var2=*
并得到一些疯狂的输出。所以,最后,最理智的呼吁将是......
./test.bs "var2=2" "var3=3"
答案 3 :(得分:0)
像这样运行:
> ./test.bs 'var2=2 var3=3'
答案 4 :(得分:-1)
这似乎是正确的,应该可行。
引用而不引用var1=1 $@
只会对传递参数的方式产生影响。不引用它将允许引用参数(即"var2=2 var3=3"
)或不引用(即{{{} 1}})因为它会将空格分隔的参数扩展为单独的参数。如果引用var2=2 var3=3
,则必须传递参数而不引用或单独引用(即$@
),以便将它们作为单独的参数接受。
一个可行的选项是使用"var2=2" "var3=3"
,但通常可以避免,因为它允许传递不安全的数据。基本上只需将eval
放在命令之前:
eval
它将通过命令,解析它并删除所有第一级引号,发出命令eval ansible-playbook /path/to/playbook.yml --extra-vars "var1=1 $@" \
> /path/to/log/file
。