我發現還是salt好,ansible封裝的,好多不會。還不如直接寫py來的幹脆。
技術點
ConfigParser
with_dict: iplist
{% for key in item.value %}
` key ` weight=1;
{% endfor %}
實作效果
多主機域名,生成對應的域名檔案,自動放入nginx中
<code>最終版本</code>
<code>cat books.txt</code>
<code>a </code><code>172.1</code><code>.</code><code>1.211</code> <code>ceshi </code><code>8015</code> <code>8089</code> <code>a</code>
<code>a </code><code>172.1</code><code>.</code><code>1.210</code> <code>ceshi </code><code>8015</code> <code>8089</code> <code>a</code>
<code>b </code><code>172.1</code><code>.</code><code>1.210</code> <code>ceshi </code><code>8015</code> <code>8089</code> <code>b</code>
<code>python nginx.py</code>
<code>#!/usr/bin/env python</code>
<code># -*- coding: utf-8 -*-</code>
<code>import</code> <code>ConfigParser</code>
<code>import</code> <code>string, os, sys</code>
<code>def</code> <code>ynameconf():</code>
<code> </code><code>sfile </code><code>=</code> <code>'books.txt'</code>
<code> </code><code>inventory </code><code>=</code> <code>{}</code>
<code> </code><code>with </code><code>open</code><code>(sfile, </code><code>'rb'</code><code>) as f:</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>f.readlines():</code>
<code> </code><code>ip </code><code>=</code> <code>i.strip().split()[</code><code>1</code><code>]</code>
<code> </code><code>yname </code><code>=</code> <code>i.strip().split()[</code><code>5</code><code>] </code><code># 域名</code>
<code> </code><code>if</code> <code>not</code> <code>yname </code><code>in</code> <code>inventory:</code>
<code> </code><code>inventory[yname] </code><code>=</code> <code>[]</code>
<code> </code><code>port</code><code>=</code> <code>i.strip().split()[</code><code>4</code><code>]</code>
<code> </code><code>ipport</code><code>=</code><code>ip</code><code>+</code><code>":"</code><code>+</code><code>port</code>
<code> </code><code>inventory[yname].append(ipport)</code>
<code> </code><code>return</code> <code>inventory</code>
<code>def</code> <code>ynameParser():</code>
<code> </code><code>cf </code><code>=</code> <code>ConfigParser.ConfigParser()</code>
<code> </code><code>ynameyname</code><code>=</code><code>ynameconf()</code>
<code> </code><code>print</code> <code>ynameyname</code>
<code> </code><code>for</code> <code>k,v </code><code>in</code> <code>ynameyname.iteritems():</code>
<code> </code><code>general</code><code>=</code><code>k</code>
<code> </code><code>cf.add_section(general)</code>
<code> </code><code>cf.</code><code>set</code><code>(general, </code><code>"pro_dir"</code><code>, k)</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(</code><code>len</code><code>(v)):</code>
<code> </code><code>ips</code><code>=</code><code>"ip"</code><code>+</code><code>str</code><code>(i</code><code>+</code><code>1</code><code>)</code>
<code> </code><code>cf.</code><code>set</code><code>(general,ips, v[i])</code>
<code> </code><code># cf.set(k, ','.join(v))</code>
<code> </code><code>cf.write(</code><code>open</code><code>(</code><code>"vhost.fact"</code><code>, </code><code>"w"</code><code>))</code>
<code>ynameP</code><code>=</code><code>ynameParser()</code>
<code>cat </code><code>/</code><code>etc</code><code>/</code><code>foo.txt</code>
<code>{</code><code>'a'</code><code>: [</code><code>'172.1.1.211:8089'</code><code>, </code><code>'172.1.1.210:8089'</code><code>], </code><code>'b'</code><code>: [</code><code>'172.1.1.210:8089'</code><code>]}</code>
<code>-</code> <code>hosts: ot5</code>
<code> </code><code>remote_user: root</code>
<code> </code><code>gather_facts: no</code>
<code> </code><code>vars</code><code>:</code>
<code> </code><code>ipall: {</code><code>'api'</code><code>:[</code><code>'172.1.1.2'</code><code>],</code><code>'api3'</code><code>:[</code><code>'172.29.1.1'</code><code>]}</code>
<code> </code><code>-</code> <code>name: get</code>
<code> </code><code>set_fact: </code>
<code> </code><code>iplist: </code><code>"{{ lookup('file', '/etc/foo.txt') }}"</code>
<code> </code><code>tasks:</code>
<code> </code><code>-</code> <code>name: copy</code>
<code> </code><code>template: dest</code><code>=</code><code>/</code><code>tmp</code><code>/</code><code>`item`.`key`.conf src</code><code>=</code><code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>named.conf.j2</code>
<code> </code><code>with_dict: iplist</code>
<code>.</code><code>/</code><code>set</code>
<code>upstream {{ item.key }} {</code>
<code> </code><code>{</code><code>%</code> <code>for</code> <code>key </code><code>in</code> <code>item.value </code><code>%</code><code>}</code>
<code> </code><code>{{ key }} weight</code><code>=</code><code>1</code><code>;</code>
<code> </code><code>{</code><code>%</code> <code>endfor </code><code>%</code><code>}</code>
<code> </code>
<code> </code><code>check interval</code><code>=</code><code>2000</code> <code>rise</code><code>=</code><code>2</code> <code>fall</code><code>=</code><code>2</code> <code>timeout</code><code>=</code><code>1000</code> <code>type</code><code>=</code><code>http;</code>
<code> </code><code>check_http_send </code><code>"GET / HTTP/1.0\r\n\r\n"</code><code>;</code>
<code> </code><code>check_http_expect_alive http_2xx http_3xx;</code>
<code>}</code>
<code>-</code><code>-</code><code>-</code>
<code>.</code><code>/</code><code>conf</code>
<code>server {</code>
<code> </code><code>listen </code><code>80</code><code>;</code>
<code> </code><code>server_name `item`.`key`.com;</code>
<code> </code><code>location </code><code>/</code> <code>{</code>
<code> </code><code>proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;</code>
<code> </code><code>proxy_pass http:</code><code>/</code><code>/</code><code>`item`.`key`;</code>
做的很垃圾
<code><span style</code><code>=</code><code>"text-decoration:line-through;"</code><code>></code><code>1.</code><code>首先在ansible上形成vhost.fact<br>cat books.txt<br>w ip1 dev </code><code>8021</code> <code>8688</code> <code>api<br>w ip2 dev </code><code>8021</code> <code>8688</code> <code>api<br><br>w是tomcat應用名稱,api是域名名稱<br><br><br>nginx.py<br></code><code>#!/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></code>
<code><span style</code><code>=</code><code>"text-decoration:line-through;"</code><code>>[root@localhost ansible]</code><code># 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></code>
[root@localhost ansible]# cat named.conf.j2
`iplist`
{% for key in iplist %}
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`
這樣就會生成多個conf檔案。
最後一個例子
<code><span style</code><code>=</code><code>"text-decoration:line-through;"</code><code>></code><code>-</code><code>-</code><code>-</code><code><br></code><code>-</code> <code>hosts: localhost<br> gather_facts: false<br> </code><code>vars</code><code>:<br> users:<br> </code><code>-</code> <code>name: paul<br> uid: </code><code>1</code><code><br> hosts:<br> </code><code>-</code> <code>host: apple<br> </code><code>-</code> <code>host: berry<br> </code><code>-</code> <code>name: pete<br> uid: </code><code>2</code><code><br> hosts:<br> </code><code>-</code> <code>host: banana<br> </code><code>-</code> <code>host: pear<br> </code><code>-</code> <code>host: kiwi<br> tasks:<br> </code><code>-</code> <code>set_fact:<br> args:<br> userslist:<br> name: </code><code>'{{ item.0.name }}'</code><code><br> uid: </code><code>'{{ item.0.uid }}'</code><code><br> host: </code><code>'{{ item.1.host }}'</code><code><br> with_subelements: <br> </code><code>-</code> <code>users<br> </code><code>-</code> <code>hosts<br> <br> <br> <br>The original result </code><code>for</code> <code>the </code><code>set</code> <code>fact would be<br> </code><code>"userslist"</code><code>: {<br> </code><code>"host"</code><code>: </code><code>"kiwi"</code><code>, <br> </code><code>"name"</code><code>: </code><code>"pete"</code><code>, <br> </code><code>"uid"</code><code>: </code><code>"2"</code><code><br> }<br>With this patch, one gets:<br> </code><code>"userslist"</code><code>: [<br> {<br> </code><code>"host"</code><code>: </code><code>"apple"</code><code>, <br> </code><code>"name"</code><code>: </code><code>"paul"</code><code>, <br> </code><code>"uid"</code><code>: </code><code>"1"</code><code><br> }, <br> {<br> </code><code>"host"</code><code>: </code><code>"berry"</code><code>, <br> </code><code>"name"</code><code>: </code><code>"paul"</code><code>, <br> </code><code>"uid"</code><code>: </code><code>"1"</code><code><br> }, <br> {<br> </code><code>"host"</code><code>: </code><code>"banana"</code><code>, <br> </code><code>"name"</code><code>: </code><code>"pete"</code><code>, <br> </code><code>"uid"</code><code>: </code><code>"2"</code><code><br> }, <br> {<br> </code><code>"host"</code><code>: </code><code>"pear"</code><code>, <br> </code><code>"name"</code><code>: </code><code>"pete"</code><code>, <br> </code><code>"uid"</code><code>: </code><code>"2"</code><code><br> }, <br> {<br> </code><code>"host"</code><code>: </code><code>"kiwi"</code><code>, <br> </code><code>"name"</code><code>: </code><code>"pete"</code><code>, <br> </code><code>"uid"</code><code>: </code><code>"2"</code><code><br> }<br> ]<br> <br> https:</code><code>/</code><code>/</code><code>github.com</code><code>/</code><code>ansible</code><code>/</code><code>ansible</code><code>/</code><code>pull</code><code>/</code><code>8019</code><code><br><</code><code>/</code><code>span></code>
本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/1947640,如需轉載請自行聯系原作者