2016-05-02 19 views
0

私は、ロードバランサ用のnginxテンプレートをAnsibleに書き込もうとしています。私は5つのアプリケーションサーバーを持っている場合は、上流のサーバーの行は次のように1ずつ5回、毎回結合ポート単位を書かなければなりません。可能性のあるカウンタループ

upstream app_servers { 
    server 127.0.0.1:4000 fail_timeout=0; 
    server 127.0.0.1:4001 fail_timeout=0; 
    server 127.0.0.1:4002 fail_timeout=0; 
    server 127.0.0.1:4003 fail_timeout=0; 
    server 127.0.0.1:4004 fail_timeout=0; 
} 

私は、変数などのアプリケーション・サーバーの数を持っています。どのようにして、そのようなループを不可能なテンプレートに書くことができますか?私は "with_indexed_items"が安全なドキュメントであることを発見しましたが、このケースに合っているかどうかはわかりません。

答えて

2

with_indexed_itemsためansibleテンプレートモジュールhttp://docs.ansible.com/ansible/template_module.html

神社のみ有用であろう

は見てみましょう。あなたはおそらく範囲にわたるtemplate taskすることができますループを書かれている単一のファイルでこれを必要とするので:

upstream app_servers { 
{% for number in range(5) %} 
    server 127.0.0.1:400{{ number }} fail_timeout=0; 
{% endfor %} 
} 

私は、変数などのアプリケーション・サーバーの数を持っています。改善なし

あなたは上記の範囲の定義でその変数を使用することができ、range(your_variable)

これは明らかにのみ9まで動作しますか、上記のポートを作成します。

ジンジャーloopsもインデックスのプロパティを持っています(実際には2つ、1つは1から始まります)もしあなたが何らかの理由でアプリケーションサーバをループする必要があれば(例えば、アプリケーションインベントリグループのホストをループする)このインデックスを使用することができます。

upstream app_servers { 
{% for something in whatever %} 
    server 127.0.0.1:400{{ loop.index0 }} fail_timeout=0; 
{% endfor %} 
} 
+0

ありがとう@ udondan!範囲をループすると問題が解決されます。 – raiblue

+0

私のアプリケーションはワーカーとして動作し、バインドする最初のポートのみを定義し、ワーカーはポートに徐々にバインドします。だから、次のようなテンプレートを書くことは私のために働きます: アップストリームアプリ{ {範囲内の数値(app_workers)%} サーバー127.0.0.1:{{app_first_port + number}} fail_timeout = 0; {%endfor%} } – raiblue

0

おそらくユーザーJinja templateを使用して、そこにロジックを追加してサーバーのセットを反復することができます。あなたは5種類のファイルを作成したい場合はループhttp://jinja.pocoo.org/docs/dev/templates/

関連する問題