Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在shell脚本中使用多行变量进行Ansible_Linux_Bash_Shell_Ansible_Devops - Fatal编程技术网

Linux 在shell脚本中使用多行变量进行Ansible

Linux 在shell脚本中使用多行变量进行Ansible,linux,bash,shell,ansible,devops,Linux,Bash,Shell,Ansible,Devops,这可能看起来很奇怪,但我正在尝试创建两个shell脚本,一个带有我可以获取的变量,另一个带有要运行的函数 core.vars #/bin/bash # list of playbooks to source # Core db initialization playbooks core_db_init_play_books=$(cat <<EOL ../ansible/test.yaml -e "val1=hi val2=by" ../ansible/provision.yml

这可能看起来很奇怪,但我正在尝试创建两个shell脚本,一个带有我可以获取的变量,另一个带有要运行的函数

core.vars

#/bin/bash
# list of playbooks to source

# Core db initialization playbooks

core_db_init_play_books=$(cat <<EOL
../ansible/test.yaml -e "val1=hi val2=by"
../ansible/provision.yml --skip-tags "postgresql-slave,log-es"
../ansible/postgresql-data-update.yml
../ansible/es-mapping.yml --extra-vars "indices_name=all ansible_tag=run_all_index_and_mapping"
../ansible/cassandra-deploy.yml -e "cassandra_jar_path=$ansible_path/ansible cassandra_deploy_path=/home/{{ansible_ssh_user}}" -v
EOL
)
但是当您执行安装脚本时,ansible会抱怨文件中有额外的参数

playbook未找到../ansible/provision.yml--跳过标记“postgresql从站,日志es”

想想看,这和我传递文件的方式有关。但是我想不出来。
伟大的人物请……:)

请尝试以下方法:

安装脚本.sh

#!/bin/bash

## Ansible Runner
function ansible_runner() {
    playbooks=$1
    local IFS=$'\n' # seperate playbooks by newline
    for playbook in ${playbooks}; do
        ansible-playbook -i ../ansible/inventory/env ${playbook}
    done
}
source core.vars
ansible_runner core_db_init_play_books
#!/bin/bash

## Ansible Runner
ansible_runner() {
    while IFS= read -r line; do
        declare -a playbook="($line)"   # split $line into tokens
        ansible-playbook -i ../ansible/inventory/env "${playbook[@]}"
    done <<< "$1"
}
source core.vars
ansible_runner "$core_db_init_play_books"
#/bin/bash
##可移动的跑步者
ansible_runner(){
当IFS=读取-r行时;执行
declare-a playbook=“($line)”#将$line拆分为令牌
ansible剧本-i../ansible/inventory/env“${playbook[@]}”

完成问题在于
IFS
。如果不想
。/ansible/provision.yml--请跳过标记“postgresql slave,log es”
,将其作为一个长文件名。
使用
for循环

试试这个:

function ansible_runner() {
    while IFS= read -r playbook; do
        echo ansible-playbook -i ../ansible/inventory/env ${playbook}
    done <<< "$1"
}
ansible_runner "${core_db_init_play_books}"
函数ansible\u runner(){
当IFS=read-r剧本时;执行
echo ansible剧本-i../ansible/inventory/env${playbook}

完成,谢谢你的评论。但即使这样也不能解决问题。现在每个单词(考虑空格)都是一个条目(带引号的字符串都是一个).但是我们如何将整行内容传递给ansible?@RajeshRajendran感谢您的及时反馈。很抱歉我的回答不完整。现在我希望我已经正确理解了要求。请尝试我的更新答案好吗?BR.嗨,再次感谢您的更新。不过有点小问题,
+ansible playbook-I../ansible/inventory/env../ansible/test.yaml-e'“val1=hi”“val2=by”“
。正因为如此,现在将得到未定义的变量。很抱歉给您带来不便。我已通过删除周围的引号更新了
core.vars
。请您再试一次好吗?感谢您的帮助。但我们的想法是将语法与ansible保持内联,以便任何人都可以附加一个包含大量变量的剧本,并且应该ld工作。因此,我认为过度定制会带来更大的危害。最后一行缺少一个
$
。我认为这是一个打字错误,因为您确实收到了一条包含变量数据的错误消息。