Ansible。如何在一些正则表达式后添加新行?

时间:2017-09-07 07:21:27

标签: ansible

我需要在默认的nginx配置中添加行以进行负载平衡。我在AWS中有三台服务器,我想进行此配置:

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}},但是如何在默认配置中插入行?我想动态添加行到文件,然后我开始播放剧本。

2 个答案:

答案 0 :(得分:2)

像这样(未经测试):

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

答案 1 :(得分:1)

@ vladimir-fomin,我强烈反对你使用lineinfile模块:它非常脆弱。

最好使用template,使用{% for ... %}循环。

不是火箭科学,配置放在你的目标主机上,而不用担心:

  1. Idempotency(tm)
  2. 出货默认值的变化,通常已经允许包含应用程序特定的配置,或者需要非常简约的下游补丁,这可以自动化。
  3. 失去对您正在推出的内容的控制/稳定性
  4. 我通常将模板文件放在角色的templates文件夹下的相同相对路径中,例如,在您的角色的模板文件夹下,将模板放在:etc/nginx/conf.d/myapp.conf.j2

    在其中输入您的配置,如:

        upstream {{app.name}} {
    {% for alias in app.aliases %}
            #server {{alias}}.{{app.domain}}; there.
    
    {% endfor %}
        }
    
        server {
            listen 80;
    
            location / {
                proxy_pass http://{{app.name}};
            }
        }
    

    正如您所猜测的那样,您将拥有变量app,其中包含相应的详细信息。

    这样的行为与它看起来完全一样。 你可以这样渲染这个模板:

    - 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配置文件以包含/etc/nginx/conf.d/下的所有.conf文件,并且您需要确保包含正确的配置级别。

    但我希望你能得到这个想法。

    :)

    如果你有变量:

    ,上面的代码就可以了
    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:在apps变量循环中执行该任务列表:

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

    这意味着 - 您有一个模板,不需要更改更多的应用程序。 你可以把它变得更复杂 - 检查app中的特定附加键,并在配置中添加相应的行/部分,如果需要。 它适用于您的所有应用。 因此,您可以在apps中为不同的应用定义不同的字段,并且它足够强大,只能使用它拥有的内容。

    难道不是很酷吗? :)