2017-04-21 14 views
0

私はいくつかのより高度なアノニムのプレイブックを使い、壁に衝突しようとしています。私はこの/ bin/bash 'for'ループが何をするのかをAnsibleに教えようとしています。不可能なシェルコマンドをループする

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 

ノート私は明示的にbash-ismsがうまくいくことを確認しますexecutableを設定しています。

ちょうどenvvarを使用しました。、利用可能な任意の環境変数です。

あなたが特定のenv変数を渡す必要がある場合、あなたはを参照して、shellモジュールへのコールのenvironment句を使用する必要があります。echo "myvar: {{myvar}}"

:あなただけのシェルでその値を使用することができ、単純な変数ではhttp://docs.ansible.com/ansible/playbooks_environment.html

もしあなたが潜在的なリスト/タプル変数をbashコードの中で使いたいならば、最初にbash変数にすることができます。例えばmylistにリストがある場合は、展開してbash配列に代入して反復処理を行うことができます。 shellへのコールのシェルコードは次のようになります

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

別のアプローチは、文字列のenv変数として渡し、そしてコードの後半の配列に変換することであろう。

注:もちろん このすべては、私はベストプラクティスのために、ジェレミー・ヒューイ@アイテム

+0

を含む空間で配列を渡すために持っていたことがありませんのみSPACELESS値 で正しく動作しますが、 'shellcheck'を使用してください。スクリプトレットをファイルに書き込んで、次のコマンドを実行します。 'shellcheck myfile.sh' これは、何をすべきかに関する様々な警告を表示します。 https://github.com/koalaman/shellcheck –

+0

それで、 '$ {envvar} 'は../var dirのリストになり、該当する安全な役割がありますか? –

+0

@JeremyHuey私はちょうど例として、いくつかの環境変数を利用しました。特定のenv変数を渡す必要がある場合は、 'shell'モジュールへの呼び出しの' environment'節を使用する必要があります。http://docs.ansible.com/ansible/playbooks_environment.html –

関連する問題