我发现还是salt好,ansible封装的,好多不会。还不如直接写py来的干脆。
技术点
ConfigParser
with_dict: iplist
{% for key in item.value %}
` key ` weight=1;
{% endfor %}
实现效果
-
多主机域名,生成对应的域名文件,自动放入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
a
172.1
.
1.211
ceshi
8015
8089
a
a
172.1
.
1.210
ceshi
8015
8089
a
b
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
i
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
i
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,如需转载请自行联系原作者