play -e jsmith hostname --extra-vars "user=hostname.biz command=hostname"
我正在尝试运行上面的bash脚本,它是ansible-playbook命令的包装器,它也能够运行外部命令来生成动态库存文件(我们没有使用标准的动态库存模块)。但问题似乎来自于bash。这里的剧本是"主机名"我一直存在的错误是"错误! playbook:找不到command = hostname"。这是我正在使用的脚本,我在收到-e选项后尝试将参数存储到脚本中。
编辑1
#!/bin/bash
#
# Description: Abstraction of ansible-playbook with knowledge of environment specific variables.
#
prelude export
export PATH=$PATH:$ANSIBLE_HOME/bin
ANSARGS=""
ENVIRONMENT=$(envname)
while [[ $# -gt 0 ]]; do
case "$1" in
-e)
ENVIRONMENT=$2
shift 2
;;
-p)
PLAYBOOK=$2
shift 2
;;
*)
ANSARGS+="###$1"
shift
;;
esac
done
REPLACE=' '
ANSARGSARR=($ANSARGS)
TO_DISPLAY="${ANSARGS//'###'/$REPLACE}"
echo $TO_DISPLAY
PLAYBOOKFILE=$IR_ANSIBLE_PLAYBOOKS/"$PLAYBOOK".yml
ANSIBLE_OPTS="-M $IR_ANSIBLE_MODULES -i $(dynamicinventory -e $ENVIRONMENT)"
if [ ! -f $PLAYBOOKFILE ]; then
ansible-playbook ${ANSIBLE_OPTS} $*
else
set -x
ansible-playbook ${ANSIBLE_OPTS} $PLAYBOOKFILE ${TO_DISPLAY}
fi
$TO_DISPLAY
显示要传递给ansible-playbook的正确参数,但set-x显示错误的引用,并且使用以下命令调用此脚本时命令失败:
play -e jsmith -p status --extra-vars '"script=start hello=world"'
$TO_DISPLAY
显示--extra-vars "script=start hello=world"
设置-x显示+ ansible-playbook -M ansible-conf/modules -i ansible-conf/custom_inventory/jsmith/inventory ansible-conf/playbooks/status.yml --extra-vars **'"**script=start**'** **'**hello=world**"'**
答案 0 :(得分:0)
首先凝聚并随后驱散所有参数同时希望保留其原始分配是很困难的。更好地将参数存储到单独的数组元素中,从而保持嵌入的空格(如user=hostname.biz command=hostname
中所示)。取代
ANSARGS+="###$1"
与
ANSARGSARR[${#ANSARGSARR[*]}]=$1
并删除
ANSARGSARR=($ANSARGS)
并替换
ansible-playbook ${ANSIBLE_OPTS} $PLAYBOOKFILE ${TO_DISPLAY}
与
ansible-playbook ${ANSIBLE_OPTS} $PLAYBOOKFILE "${ANSARGSARR[@]}"
- 所以你可以调用你的脚本e。 G。使用命令行
play -e jsmith -p hostname --extra-vars "user=hostname.biz command=hostname"