2016-05-06 2 views
0
play -e jsmith hostname --extra-vars "user=hostname.biz command=hostname" 

Я пытаюсь запустить выше Баш скрипт, который является оберткой анзибля-Playbook команды, которая также способно выполнить внешнюю команду для создания динамических файлов инвентаризация (мы не используем стандартный динамический модуль инвентаризации). Проблема, похоже, исходит от bash. Плей-лист здесь - «имя хоста», а ошибка, которую я сохраняю, - «ОШИБКА! Playbook: command = hostname не удалось найти». Вот сценарий, который я использую, где я пытаюсь сохранить аргументы скрипту после получения опции -e.Bash скрипт не передавая правильные параметры анзибля-сборник пьес

EDIT 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 показывает правильный параметр, который будет передан анзибль-сборник пьес, но набор-х отображает неправильное цитирование и команда не выполняется, когда этот сценарий вызывается с помощью следующих действий:

play -e jsmith -p status --extra-vars '"script=start hello=world"' 

$TO_DISPLAY показывая --extra-vars "script=start hello=world"

сек et -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**"'**

+2

Попробуйте положить 'set -x' перед вызовом' ansible-playbook', поэтому Bash распечатает точный вызов, который он делает. ('set + x' для отмены) – dg99

+0

@EtanReisner im не заставляет людей делать что-либо, что является законным синтаксисом синтаксиса. – Zee

+1

Когда вы переводите' user = hostname.biz command = hostname' в 'ANSARGS', а затем разделяете это на пробелы - это * два аргумента. Поэтому '$ {ANSARGS [@]: 1}' расширяет на * три слова: '--extra-vars',' user = hostname.biz' и 'command = hostname'. Я предполагаю, что это не то, что вы на самом деле хотите. –

ответ

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. г. с командной строкой

play -e jsmith -p hostname --extra-vars "user=hostname.biz command=hostname"