我需要在默认的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}},但是如何在默认配置中插入行?我想动态添加行到文件,然后我开始播放剧本。
答案 0 :(得分:2)
像这样(未经测试):
- lineinfile:
line: 'server {{ ec2_public_dns_name }};'
insertafter: 'upstream myapp1'
答案 1 :(得分:1)
@ vladimir-fomin,我强烈反对你使用lineinfile
模块:它非常脆弱。
最好使用template
,使用{% for ... %}
循环。
不是火箭科学,配置放在你的目标主机上,而不用担心:
我通常将模板文件放在角色的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
中为不同的应用定义不同的字段,并且它足够强大,只能使用它拥有的内容。
难道不是很酷吗? :)