2017-09-07 11 views
0

ロードバランスのために、デフォルトのnginx設定に行を追加する必要があります。私は、AWSに3台のサーバを持っていると私は、この設定を作りたい:。正規表現の後に新しい行を追加するには?

http { 
    upstream myapp1 { 
     #sting "server dns_server1_name.com;" there. 
     #string "server dns_server2_name.com;" there. 
     #string "server dns_server3_name.com;" there. 
     .... 
     .... 
     #sting "server dns_serverN_name.com;" there. 
    } 

    server { 
     listen 80; 

     location/{ 
      proxy_pass http://myapp1; 
     } 
    } 

私は{{ec2_public_dns_name}}を使用する必要があります知っているが、どのように私はデフォルトの設定で行を挿入することができますか?私は動的にファイルに行を追加して、私は作戦を開始したい。

+0

これは冪等ではないため、線を徐々に追加しないでください。あなたはファイルにどの行を入れるべきかを定義し、すべての行が存在するように注意します。 – ceving

答えて

1

ウラジミール・fomin @、私は強くlineinfileモジュールを使用してからあなたを落胆しています:それは非常に壊れやすいです。

{% for ... %}ループを利用すると、templateを使用する方が良いでしょう。 、

  1. 冪等(tm)の出荷デフォルトで
  2. 変更は、彼らは通常、すでにアプリの特定のconfigsを含めることができるように:

    は、コンフィギュレーションは、ターゲット・ホスト上のロケット科学置かれていない、と心配していませんORは、自動化できる非常に最小限の下流パッチを必要とします。

  3. あなたは、私は通常、例えば、ここでは、役割のtemplatesフォルダの下に同一の相対パスでテンプレートファイルを入れています

を入れているコンテンツの管理/安定性を失います自分の役割のテンプレートフォルダの下に、下のテンプレートを置く:あなたはあなたの中に対応する詳細とapp変数を持つことになります推測したよう

upstream {{app.name}} { 
{% for alias in app.aliases %} 
     #server {{alias}}.{{app.domain}}; there. 

{% endfor %} 
    } 

    server { 
     listen 80; 

     location/{ 
      proxy_pass http://{{app.name}}; 
     } 
    } 

:それではetc/nginx/conf.d/myapp.conf.j2

のように、あなたの設定を置きます。

これは、まるで同じように動作します。 このテンプレートそうのようにレンダリングすることができます:

- name: put nginx app config 
    template: 
    src: '{{tpl}}.j2' 
    dest: '/{{tpl}}' 
    ... 
    with_items: 
    - 'etc/nginx/conf.d/myapp.conf' 
    loop_control: 
    loop_var: tpl 

このコードは、私見を維持するために容易になるだろう、とあまり注意が必要です。 あなたのファイルはテンプレートの状態とまったく同じように見えます。

メインのnginx設定ファイルは、すべての.confファイルを/etc/nginx/conf.d/に含めるように正しく設定する必要があります。正しい設定レベルを含める必要があります。

しかし、私はあなたがそのアイデアを得ていることを願っています。

:)

上記のコードは、変数を持っていた場合には、仕事とは:

app: 
    name: myapp1 
    domain: mydomain.com 
    aliases: 
    - name1 
    - name22 
    - name3 

また、このアプローチは、あなたが簡単に拡張することができます。複数のアプリケーションをサポートするために、あなた

ステップ1:あなたの変数を拡張:

apps: 
    - name: myapp1 
    domain: mydomain1.com 
    aliases: 
    - name1 
    - name22 
    - name3 
    - name: myapp2 
    domain: mydomain2.com 
    aliases: 
    - lalala 
    - uquququ 
    - lslsls 

ステップ2:あなたのタスク

- name: 'put nginx config of {{app.name}}' 
    template: 
    src: '{{tpl}}.j2' 
    dest: '/{{tpl|dirname}}/{{app.name}}.conf' 
    ... 
    with_items: 
    - 'etc/nginx/conf.d/myapp.conf' 
    loop_control: 
    loop_var: tpl 

ステップ3を更新:myapps.yml

の名前タスクリストとしてそれを抽出

ステップ4:アプリのループオーバーでタスクリストを実行する変数:

- include: myapps.yml 
    with_items: '{{apps}}' 
    loop_control: 
    loop_var: app 

これは、他のアプリのために変更する必要のないテンプレートがあることを意味します。 あなたはそれをより複雑にすることができます - appの特定の追加キーを確認し、対応する行/部分をconfigに追加します。 これはあなたのすべてのアプリに適用されます。 appsでは、さまざまなアプリについて異なるフィールドを定義することができ、それが持つものだけを使うには十分な堅牢性があります。

いいえ、いいですか? :)

2

このような何か(テストしていません):

- lineinfile: 
    line: 'server {{ ec2_public_dns_name }};' 
    insertafter: 'upstream myapp1' 
+0

私は次のようなものを持っています: 'http { 上流myapp1 { サーバdns_server100_name.com } –

関連する問題