2017-04-21 96 views
0

我試圖去與一些更先進的Ansible的劇本,並打了一堵牆。我試圖讓Ansible去做這個/ bin/bash'for'循環。循環一個shell命令insible

for i in $(</filename.txt);do '/some/command options=1 user=usera server=$i';done 

filesnames.txt包含50-100個主機名。

我不能使用jinja模板作爲命令必須運行,而不僅僅是配置文件更新。

任何幫助將不勝感激。

由於提前, 傑里米

回答

2
  1. 可以使用神社模板,但不同
  2. 您的特定代碼沒有做的事情是最明智的
  3. 多行代碼,你應該使用shell模塊。多碼片呼叫的

例如:

- name: run multiline stuff 
    shell: | 
    for x in "${envvar}"; do 
     echo "${x}" 
    done 
    args: 
    executable: /bin/bash 

注意到我明確設置executable,這將確保bash-isms會工作。

我剛剛使用envvar作爲例子,可用的任意環境變量。

,如果你需要通過特定的ENV變量,你應該使用通話environment子句shell模塊,請參閱:http://docs.ansible.com/ansible/playbooks_environment.html

對於簡單的變量,你可以使用在外殼的價值:echo "myvar: {{myvar}}"

如果你想在bash代碼中使用一個安全的列表/元組變量,你可以先將它變成bash變量。例如如果你有一個mylist中的東西列表,你可以展開它並分配給一個bash數組,然後遍歷它。呼叫的到shell shell代碼將是:

mylist_for_bash=({{mylist|join(" ")}}) 
    for myitem in "${mylist_for_bash[@]}"; do 
     echo "my current item: ${myitem}" 
    done 

另一種方法是把它作爲字符串環境變量,它在代碼轉換成一個陣列後面。

注: 當然這一切工作正常只SPACELESS值 我從來沒有通過陣列容納空間項目

+0

@傑里米 - 休伊,最佳實踐,使用'shellcheck',例如把你的scriptlet寫入一個文件,然後運行:'shellcheck myfile.sh' 這會打印出各種警告信息。 https://github.com/koalaman/shellcheck –

+0

那麼,'$ {envvar}'是適用於Ansible角色的../var目錄中的一個列表嗎? –

+0

@JeremyHuey我剛剛用它作爲示例,提供了一些可用的環境變量。如果您需要傳遞特定的env變量,則應該使用'shell'模塊調用的'environment'子句,請參閱:http://docs.ansible.com/ansible/playbooks_environment.html –