将bash脚本参数传递给脚本中的ansible命令

时间:2017-05-23 14:59:02

标签: linux bash ubuntu ansible

我正在尝试从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

我甚至试图逃避报价,但它没有用。 我怎么能让它运行?

5 个答案:

答案 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