ansible 用变量简单渲染nginx配置文件

简介:

我发现还是salt好,ansible封装的,好多不会。还不如直接写py来的干脆。


技术点

ConfigParser

with_dict: iplist

{% for key in item.value  %}

` key ` weight=1;

{% endfor %}


实现效果

  1. 多主机域名,生成对应的域名文件,自动放入nginx中



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
最终版本
cat books.txt
172.1 . 1.211  ceshi  8015  8089  a
172.1 . 1.210  ceshi  8015  8089  a
172.1 . 1.210  ceshi  8015  8089  b
 
python nginx.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import  ConfigParser
import  string, os, sys
 
def  ynameconf():
     sfile  =  'books.txt'
     inventory  =  {}
     with  open (sfile,  'rb' ) as f:
         for  in  f.readlines():
             ip  =  i.strip().split()[ 1 ]
             yname  =  i.strip().split()[ 5 ]   # 域名
             if  not  yname  in  inventory:
                 inventory[yname]  =  []
             port =  i.strip().split()[ 4 ]
             ipport = ip + ":" + port
             inventory[yname].append(ipport)
     return  inventory
 
def  ynameParser():
     cf  =  ConfigParser.ConfigParser()
     ynameyname = ynameconf()
     print  ynameyname
     for  k,v  in  ynameyname.iteritems():
         general = k
         cf.add_section(general)
         cf. set (general,  "pro_dir" , k)
         for  in  range ( len (v)):
             ips = "ip" + str (i + 1 )
             cf. set (general,ips, v[i])
         # cf.set(k, ','.join(v))
         cf.write( open ( "vhost.fact" "w" ))
 
ynameP = ynameParser()
 
cat  / etc / foo.txt
{ 'a' : [ '172.1.1.211:8089' '172.1.1.210:8089' ],  'b' : [ '172.1.1.210:8089' ]}
 
-  hosts: ot5
   remote_user: root
   gather_facts: no
   vars :
     ipall: { 'api' :[ '172.1.1.2' ], 'api3' :[ '172.29.1.1' ]}
   -  name: get
     set_fact: 
       iplist:  "{{ lookup('file', '/etc/foo.txt') }}"
   tasks:
   -  name: copy
     template: dest = / tmp / `item`.`key`.conf src = / etc / ansible / named.conf.j2
     with_dict: iplist
 
 
 
. / set
upstream {{ item.key }} {
     { %  for  key  in  item.value   % }
     {{ key }} weight = 1 ;
     { %  endfor  % }
      
     check interval = 2000  rise = 2  fall = 2  timeout = 1000  type = http;
     check_http_send  "GET /  HTTP/1.0\r\n\r\n" ;
     check_http_expect_alive http_2xx http_3xx;
}
 
- - -
 
. / conf
server {
         listen   80 ;
         server_name     `item`.`key`.com;
        location  /  {
       proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
       proxy_pass http: / / `item`.`key`;
}
}




做的很垃圾

1
<span style = "text-decoration:line-through;" > 1. 首先在ansible上形成vhost.fact<br>cat books.txt<br>w ip1 dev  8021  8688  api<br>w ip2 dev  8021  8688  api<br><br>w是tomcat应用名称,api是域名名称<br><br><br>nginx.py<br> #!/usr/bin/env python<br># -*- coding: utf-8 -*-<br>import ConfigParser<br>import string, os, sys<br><br>def ynameconf():<br>    sfile = 'books.txt'<br>    inventory = {}<br>    with open(sfile, 'rb') as f:<br>        for i in f.readlines():<br>            ip = i.strip().split()[1]<br>            yname = i.strip().split()[5]  # 域名<br>            if not yname in inventory:<br>                inventory[yname] = []<br>            inventory[yname].append(ip)<br>    return inventory<br><br>def ynameParser():<br>    cf = ConfigParser.ConfigParser()<br>    ynameyname=ynameconf()<br>    for k,v in ynameyname.iteritems():<br>        cf.add_section('general')<br>        cf.set("general", "pro_dir", k)<br>        cf.set("general", "ip1", v[0])<br>        cf.set("general", "ip2", v[1])<br>        # cf.set(k, ','.join(v))<br>        cf.write(open("vhost.fact", "w"))<br><br>ynameP=ynameParser()<br><br>生成的vhost.fact的样子<br>[general]<br>pro_dir = api<br>ip1 = ip1<br>ip2 = ip2<br><br>还有很多问题<br>1.假如有三台以上机器怎么处理<br>2.多个域名怎么同时处理,搞到我想到了协程<br><br>2.写yml文件,就几行<br><br>mkdir -p /etc/ansible/nginx<br><br>├── hosts<br>├── roles<br>│   └── vhost<br>│       ├── default<br>│       ├── files<br>│       ├── handlers<br>│       │   └── main.yml<br>│       ├── meta<br>│       ├── tasks<br>│       │   ├── install.yml<br>│       │   └── main.yml<br>│       ├── templates<br>│       │   ├── set.conf<br>│       │   └── vhost.conf<br>│       └── vars<br>└── vhost.yml<br><br>主要tasks/install.yml<br>- name: mkdir<br>  shell: mkdir -p /etc/ansible/facts.d<br>- name: copy vhost.fact<br>  copy: src=/etc/ansible/vhost.fact dest=/etc/ansible/facts.d/vhost.fact <br>- name: flush<br>  setup: <br>- name: copy<br>  template: src=set.conf dest=/usr/local/tengine/conf/SET/{{ ansible_local.vhost.general.pro_dir }}.conf<br>- name: copy<br>  template: src=vhost.conf dest=/usr/local/tengine/conf/conf.d/{{ ansible_local.vhost.general.pro_dir }}.conf<br><br>3.手动执行命令<br>#nginx域名渲染<br>cd /etc/ansible && python nginx.py<br>cd /etc/ansible/nginx/<br>#'host=nginx' 这个是nginx服务器名称<br>ansible-playbook -i /etc/ansible/hosts vhost.yml --extra-vars 'host=nginx'<br>ansible -i /etc/ansible/hosts nginx -m shell -a '/usr/local/tengine/sbin/nginx -c /usr/local/tengine/conf/nginx.conf -t' <br>ansible -i /etc/ansible/hosts nginx -m shell -a '/usr/local/tengine/sbin/nginx -c /usr/local/tengine/conf/nginx.conf -s reload'<br><br>达到的效果,利用ansible使两台机器立刻部署完tomcat后,然后加入到nginx中。<br>土。<br></span>
1
<span style = "text-decoration:line-through;" >[root@localhost ansible] # cat test3.yml<br>- hosts: ot3<br>  remote_user: root<br>  gather_facts: no<br>  vars:<br>    ip: ['172.1.1.2']<br>  tasks:<br>  - name: get<br>    set_fact: <br>      iplist: "{{ lookup('file', '/etc/foo.txt') }}"<br>  - name: oup put the myjson of first<br>    debug: var="{{ iplist }}"<br>  - name: copy<br>    template: dest=/tmp/named.conf src=/etc/ansible/named.conf.j2<br></span>


[root@localhost ansible]# cat named.conf.j2

`iplist`


{% for key in iplist %}

` key ` weight=1;

{% endfor %}


dict

- hosts: ot5

  remote_user: root

  gather_facts: no

  vars:

    ipall: {'api':['172.1.1.2'],'api3':['172.29.1.1']}

  tasks:

  - name: copy

    template: dest=/tmp/`item`.`key`.conf src=/etc/ansible/named.conf.j2

    with_dict: "` ipall `"


cat /etc/ansible/named.conf.j2

`item`.`key`

{% for key in item.value  %}

` key ` weight=1;

{% endfor %}


这样就会生成多个conf文件。


最后一个例子

1
<span style = "text-decoration:line-through;" > - - - <br> -  hosts: localhost<br>  gather_facts: false<br>   vars :<br>    users:<br>       -  name: paul<br>        uid:  1 <br>        hosts:<br>           -  host: apple<br>           -  host: berry<br>       -  name: pete<br>        uid:  2 <br>        hosts:<br>           -  host: banana<br>           -  host: pear<br>           -  host: kiwi<br>  tasks:<br>     -  set_fact:<br>      args:<br>        userslist:<br>          name:  '{{ item.0.name }}' <br>          uid:   '{{ item.0.uid }}' <br>          host:  '{{ item.1.host }}' <br>      with_subelements: <br>         -  users<br>         -  hosts<br>        <br>        <br>        <br>The original result  for  the  set  fact would be<br>     "userslist" : {<br>         "host" "kiwi" , <br>         "name" "pete" , <br>         "uid" "2" <br>    }<br>With this patch, one gets:<br>     "userslist" : [<br>        {<br>             "host" "apple" , <br>             "name" "paul" , <br>             "uid" "1" <br>        }, <br>        {<br>             "host" "berry" , <br>             "name" "paul" , <br>             "uid" "1" <br>        }, <br>        {<br>             "host" "banana" , <br>             "name" "pete" , <br>             "uid" "2" <br>        }, <br>        {<br>             "host" "pear" , <br>             "name" "pete" , <br>             "uid" "2" <br>        }, <br>        {<br>             "host" "kiwi" , <br>             "name" "pete" , <br>             "uid" "2" <br>        }<br>    ]<br>    <br> https: / / github.com / ansible / ansible / pull / 8019 <br>< / span>

allow set_fact action plugin to work with loops 




本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1947640,如需转载请自行联系原作者

相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
5月前
|
应用服务中间件 nginx
Nginx 配置文件详解
Nginx 配置文件详解
58 0
|
7月前
|
运维 Kubernetes 网络安全
Ansible自动化运维工具之主机管理与自定义配置文件(2)
Ansible自动化运维工具之主机管理与自定义配置文件(2)
|
11天前
|
存储 NoSQL 应用服务中间件
Etcd+Confd实现Nginx配置文件自动管理
Etcd+Confd实现Nginx配置文件自动管理
|
16天前
|
Java 应用服务中间件 PHP
Nginx配置文件解释
Nginx配置文件解释
17 1
|
2月前
|
运维 应用服务中间件 Linux
LNMP详解(五)——Nginx主配置文件详解
LNMP详解(五)——Nginx主配置文件详解
18 1
|
2月前
|
负载均衡 应用服务中间件 nginx
|
3月前
|
Ubuntu 应用服务中间件 nginx
ubuntu环境下 nginx 怎么配置文件
ubuntu环境下 nginx 怎么配置文件
|
4月前
|
负载均衡 NoSQL 应用服务中间件
Nginx编译安装及配置文件详解
Nginx编译安装及配置文件详解
|
4月前
|
应用服务中间件 nginx
上传文件失败413 Request Entity Too Large,nginx配置文件大小的限制
上传文件失败413 Request Entity Too Large,nginx配置文件大小的限制
|
5月前
|
缓存 负载均衡 应用服务中间件
Nginx配置文件详解与配置
Nginx配置文件详解与配置
397 0