У меня нет "ansibles" или "хранилищ" , так что это полностью не проверено, но может приблизить вас:
doit(){
host="$1"
SECRET=$(/opt/vault/bin/get-admin-credential --tag=$host)
HOST=$(echo $SECRET | cut -d ';' -f1)
LOGIN=$(echo $SECRET | cut -d ';' -f2)
DOMAIN=$(echo $SECRET | cut -d ';' -f3)
PWD=$(echo $SECRET | cut -d ';' -f4)
if [ -z "$DOMAIN" ]; then
ansible-playbook -i ~/.ansible/hosts ~/.ansible/windows.yml -e "ansible_host=$HOST ansible_user=$LOGIN ansible_password=$PWD" --limit $host
else
ansible-playbook -i ~/.ansible/hosts ~/.ansible/windows.yml -e "ansible_host=$HOST ansible_user=$LOGIN@$DOMAIN ansible_password=$PWD" --limit $host
fi
}
# Export doit function to subshells created by GNU Parallel
export -f doit
parallel -a ~/.ansible/hosts doit
Стилистически Есть несколько улучшений. Во-первых, переменные оболочки, состоящие из букв верхнего регистра, зарезервированы, поэтому вам не следует использовать HOST
, DOMAIN
et c. Кроме того, вы, вероятно, можете упростить все эти неприглядные сокращения и эхо, чтобы извлечь переменные из СЕКРЕТА, используя IFS=';'
и read
, например:
SECRET=$(/opt/vault/bin/get-admin-credential --tag=$host)
IFS=';' read host login domain pwd <<< "$SECRET"
Итак, мой лучший и окончательный ответ: :
doit(){
host="$1"
secret=$(/opt/vault/bin/get-admin-credential --tag=$host)
IFS=';' read host login domain pwd <<< "$secret"
if [ -z "$domain" ]; then
ansible-playbook -i ~/.ansible/hosts ~/.ansible/windows.yml -e "ansible_host=$host ansible_user=$login ansible_password=$pwd" --limit $host
else
ansible-playbook -i ~/.ansible/hosts ~/.ansible/windows.yml -e "ansible_host=$host ansible_user=$login@$domain ansible_password=$pwd" --limit $host
fi
}
# Export doit function to subshells created by GNU Parallel
export -f doit
parallel -a ~/.ansible/hosts doit