假如你要在一台機器安裝多個tomcat或者安裝多台tomcat,你可以選擇
假設現在tomcat有三個,分别為cxx,wxx,sxx
多建立對應的yml檔案,一個項目一個
copy.yml,install.yml,delete.yml 分别一個
我選擇第二種方法,變量可以定義在一個檔案中
借用ansible生成動态的hosts優勢
<code>#!/usr/bin/python</code>
<code># coding:utf-8</code>
<code>import</code> <code>sqlite3</code>
<code>import</code> <code>sys</code>
<code>try</code><code>:</code>
<code> </code><code>import</code> <code>json</code>
<code>except</code> <code>ImportError:</code>
<code> </code><code>import</code> <code>simplejson as json</code>
<code>def</code> <code>grouplist():</code>
<code> </code><code>inventory </code><code>=</code> <code>{}</code>
<code> </code><code>inventory[</code><code>'local'</code><code>] </code><code>=</code> <code>[</code><code>'127.0.0.1'</code><code>]</code>
<code> </code><code>sfile</code><code>=</code><code>'/etc/ansible/books.txt'</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>group</code><code>=</code><code>i.strip().split()[</code><code>0</code><code>]</code>
<code> </code><code>name</code><code>=</code><code>i.strip().split()[</code><code>1</code><code>]</code>
<code> </code><code>if</code> <code>not</code> <code>group </code><code>in</code> <code>inventory:</code>
<code> </code><code>inventory[group] </code><code>=</code> <code>{</code>
<code> </code><code>'hosts'</code><code>: []</code>
<code> </code><code>}</code>
<code> </code><code>inventory[group][</code><code>'hosts'</code><code>].append(name)</code>
<code> </code><code>print</code> <code>json.dumps(inventory, indent</code><code>=</code><code>4</code><code>)</code>
<code> </code>
<code>def</code> <code>hostinfo(name):</code>
<code> </code><code>vars</code> <code>=</code> <code>{}</code>
<code> </code><code>vars</code> <code>=</code> <code>{</code>
<code> </code><code>'admin'</code><code>: </code><code>'Jane Jolie'</code><code>,</code>
<code> </code><code>'datacenter'</code><code>: </code><code>1</code>
<code> </code><code>}</code>
<code> </code><code>print</code> <code>json.dumps(</code><code>vars</code><code>, indent</code><code>=</code><code>4</code><code>)</code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>
<code> </code><code>if</code> <code>len</code><code>(sys.argv) </code><code>=</code><code>=</code> <code>2</code> <code>and</code> <code>(sys.argv[</code><code>1</code><code>] </code><code>=</code><code>=</code> <code>'--list'</code><code>):</code>
<code> </code><code>grouplist()</code>
<code> </code><code>elif</code> <code>len</code><code>(sys.argv) </code><code>=</code><code>=</code> <code>3</code> <code>and</code> <code>(sys.argv[</code><code>1</code><code>] </code><code>=</code><code>=</code> <code>'--host'</code><code>):</code>
<code> </code><code>hostinfo(sys.argv[</code><code>2</code><code>])</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>print</code> <code>"Usage: %s --list or --host <hostname>"</code> <code>%</code> <code>sys.argv[</code><code>0</code><code>]</code>
<code> </code><code>sys.exit(</code><code>1</code><code>)</code>
這個配置檔案,指明端口和分組。cxx就是分組,後面的端口,你懂的。
<code>cat books.txt</code>
<code>cxx </code><code>192.168</code><code>.</code><code>1.3</code> <code>sc_tomcat </code><code>8005</code> <code>8080</code>
<code>wxx </code><code>192.168</code><code>.</code><code>1.3</code> <code>sc_tomcat </code><code>8006</code> <code>8081</code>
<code>sxx </code><code>192.168</code><code>.</code><code>1.3</code> <code>sc_tomcat </code><code>8007</code> <code>8082</code>
先來說ansible部分吧
<a href="https://s3.51cto.com/wyfs02/M01/95/81/wKioL1kVwwGh4g9SAADrIcGk0us294.jpg" target="_blank"></a>
目錄結構
<code>[root@localhost roles]</code><code># tree</code>
<code>.</code>
<code>├── copy</code>
<code>│ ├── default</code>
<code>│ ├── files</code>
<code>│ │ └── ROOT</code>
<code>│ │ └── test.html</code>
<code>│ ├── meta</code>
<code>│ │ └── test</code>
<code>│ └── tasks</code>
<code>│ ├── copy.yml</code>
<code>│ ├── delete.yml</code>
<code>│ ├── install.yml</code>
<code>│ ├── main.bak</code>
<code>│ ├── main.yml</code>
<code>│ ├── main.yml.v1</code>
<code>│ └── main.yml.v2</code>
<code>├── delete</code>
<code>│ ├── handlers</code>
<code>│ │ └── main.yml</code>
<code>│ ├── tasks</code>
<code>│ │ ├── copy.yml</code>
<code>│ │ ├── delete.yml</code>
<code>│ │ ├── install.yml</code>
<code>│ │ ├── main.bak</code>
<code>│ │ ├── main.yml</code>
<code>│ │ ├── main.yml.v1</code>
<code>│ │ └── main.yml.v2</code>
<code>│ ├── templates</code>
<code>│ │ ├── server.xml</code>
<code>│ │ └── tomcat.sh</code>
<code>│ └── </code><code>vars</code>
<code>│ └── main.yml</code>
<code>└── install</code>
<code> </code><code>├── default</code>
<code> </code><code>├── files</code>
<code> </code><code>│ └── ROOT</code>
<code> </code><code>│ └── test.html</code>
<code> </code><code>├── handlers</code>
<code> </code><code>│ └── main.yml</code>
<code> </code><code>├── meta</code>
<code> </code><code>│ └── test</code>
<code> </code><code>├── tasks</code>
<code> </code><code>│ ├── copy.yml</code>
<code> </code><code>│ ├── delete.yml</code>
<code> </code><code>│ ├── install.yml</code>
<code> </code><code>│ ├── main.bak</code>
<code> </code><code>│ ├── main.yml</code>
<code> </code><code>│ ├── main.yml.v1</code>
<code> </code><code>│ └── main.yml.v2</code>
<code> </code><code>├── templates</code>
<code> </code><code>│ ├── server.xml</code>
<code> </code><code>│ └── tomcat.sh</code>
<code> </code><code>└── </code><code>vars</code>
<code> </code><code>└── main.yml</code>
對比以前的變化是
<code>cd </code><code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>tomcat</code><code>/</code><code>roles</code>
<code>install中的install.yml 檔案改變了</code>
<code>cd </code><code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>tomcat</code><code>/</code><code>roles</code><code>/</code><code>install</code><code>/</code><code>tasks</code>
<code>[root@localhost tasks]</code><code># cat install.yml</code>
<code>-</code> <code>name: pro</code>
<code> </code><code>file</code><code>: path</code><code>=</code><code>/</code><code>opt</code><code>/</code><code>apps</code><code>/</code><code>`cxx_pro_dir` state</code><code>=</code><code>directory</code>
<code>-</code> <code>name: tar</code>
<code> </code><code>shell: chdir</code><code>=</code><code>/</code><code>opt</code><code>/</code><code>ea rm </code><code>-</code><code>rf `cxx_dir` && cp </code><code>-</code><code>r tomcat `cxx_dir`</code>
<code>-</code> <code>name: copy server.xml</code>
<code> </code><code>template: src</code><code>=</code><code>server.xml dest</code><code>=</code><code>/</code><code>opt</code><code>/</code><code>ea</code><code>/</code><code>`cxx_dir`</code><code>/</code><code>conf</code><code>/</code> <code>force</code><code>=</code><code>yes mode</code><code>=</code><code>0644</code>
<code>-</code> <code>name: rm webapps</code>
<code> </code><code>file</code><code>: dest</code><code>=</code><code>/</code><code>opt</code><code>/</code><code>ea</code><code>/</code><code>`cxx_dir`</code><code>/</code><code>webapps</code><code>/</code> <code>state</code><code>=</code><code>absent</code>
<code>-</code> <code>name: copy tomcat.sh</code>
<code> </code><code>copy: src</code><code>=</code><code>/</code><code>opt</code><code>/</code><code>src</code><code>/</code><code>tomcat.sh dest</code><code>=</code><code>/</code><code>opt</code><code>/</code><code>ea</code><code>/</code><code>`cxx_pro_dir`.sh owner</code><code>=</code><code>tomcat group</code><code>=</code><code>tomcat</code>
<code>-</code> <code>name: modify tomcat.sh</code>
<code> </code><code>shell: chdir</code><code>=</code><code>/</code><code>opt</code><code>/</code><code>ea sed </code><code>-</code><code>i </code><code>'s%/ea/tomcat%/ea/`cxx_dir`%g'</code> <code>`cxx_pro_dir`.sh</code>
<code>-</code> <code>name: modify </code>
<code> </code><code>file</code><code>: path</code><code>=</code><code>/</code><code>opt</code><code>/</code><code>ea</code><code>/</code><code>`cxx_dir`</code><code>/</code> <code>owner</code><code>=</code><code>tomcat group</code><code>=</code><code>tomcat mode</code><code>=</code><code>0755</code>
<code>-</code> <code>name: chown</code>
<code> </code><code>file</code><code>: path</code><code>=</code><code>/</code><code>opt</code><code>/</code><code>ea</code><code>/</code><code>`cxx_dir`</code><code>/</code> <code>state</code><code>=</code><code>directory recurse</code><code>=</code><code>yes owner</code><code>=</code><code>tomcat group</code><code>=</code><code>tomcat</code>
<code>-</code> <code>name: 首次啟動tomcat</code>
<code> </code><code>shell: cd </code><code>/</code><code>opt</code><code>/</code><code>ea && source </code><code>/</code><code>etc</code><code>/</code><code>profile && sudo </code><code>-</code><code>i </code><code>-</code><code>u tomcat nohup sh `cxx_pro_dir`.sh start &</code>
<code>-</code> <code>name: copy test</code>
<code> </code><code>copy: src</code><code>=</code><code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>tomcat</code><code>/</code><code>roles</code><code>/</code><code>install</code><code>/</code><code>meta</code><code>/</code><code>test dest</code><code>=</code><code>/</code><code>opt</code><code>/</code><code>apps</code><code>/</code><code>`cxx_pro_dir`</code><code>/</code>
<code>cd </code><code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>tomcat</code><code>/</code><code>roles</code><code>/</code><code>install</code><code>/</code><code>vars</code> <code>變量檔案有大改變</code>
<code>說明cxx_pro_dir 也可以指明wxx_pro_dir,你可以把它當做變量,上面的install.yml引用這個變量而已。</code>
<code>[root@localhost </code><code>vars</code><code>]</code><code># cat main.yml </code>
<code>cxx_pro_dir: </code><code>"{{ cxx_pro_dir }}"</code>
<code>cxx_dir: </code><code>"{{ cxx_dir }}"</code>
<code>cxx_port1: </code><code>"{{ cxx_port1 }}"</code>
<code>cxx_port2: </code><code>"{{ cxx_port2 }}"</code>
ansible部分完結。
因為有好多主機,不想手動書寫ansible執行檔案,可以用python腳本自動生成
主要想自動生成這樣的腳本
ansible-playbook -i /etc/ansible/test.py copy.yml --extra-vars "host=192.168.1.3"
ansible-playbook -i /etc/ansible/test.py install.yml --extra-vars "host=192.168.1.3 cxx_pro_dir=cxx cxx_dir=cxx_tomcat cxx_port1=8005 cxx_port2=8080"
以下python腳本,讀取生成的
聲明 什麼cxx都是變量,你可以随便取名字
<code># !/usr/bin/env python</code>
<code>#import sqlite3</code>
<code>dfile</code><code>=</code><code>'</code><code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>ansible.sh</code>
<code>'''</code>
<code>cxx 172.29.1.3 sc_tomcat 8005 8080</code>
<code>def</code> <code>ansiblec(host,cxx_pro_dir</code><code>=</code><code>None</code><code>,cxx_dir</code><code>=</code><code>None</code><code>,cxx_port1</code><code>=</code><code>None</code><code>,cxx_port2</code><code>=</code><code>None</code><code>):</code>
<code> </code><code>if</code> <code>cxx_port1</code><code>=</code><code>=</code><code>None</code><code>:</code>
<code> </code><code>stringa </code><code>=</code> <code>'ansible-playbook -i /etc/ansible/test.py copy.yml --extra-vars "host=%s"'</code> <code>%</code><code>(host)</code>
<code> </code><code>return</code> <code>stringa</code>
<code> </code><code>stringb </code><code>=</code> <code>'ansible-playbook -i /etc/ansible/test.py install.yml --extra-vars "host=%s cxx_pro_dir=%s cxx_dir=%s cxx_port1=%s cxx_port2=%s"'</code><code>\</code>
<code> </code><code>%</code><code>(host,cxx_pro_dir,cxx_dir,cxx_port1,cxx_port2)</code>
<code> </code><code>return</code> <code>stringb</code>
<code> </code><code>sfile </code><code>=</code> <code>'/etc/ansible/books.txt'</code>
<code> </code><code>with </code><code>open</code><code>(sfile, </code><code>'rb'</code><code>) as f:</code>
<code> </code><code>iplist</code><code>=</code><code>[]</code>
<code> </code><code>glist</code><code>=</code><code>[]</code>
<code> </code><code>group </code><code>=</code> <code>i.strip().split()[</code><code>0</code><code>]</code>
<code> </code><code>grouptomcat</code><code>=</code><code>group</code><code>+</code><code>"_"</code><code>+</code><code>"tomcat"</code>
<code> </code><code>name </code><code>=</code> <code>i.strip().split()[</code><code>1</code><code>]</code>
<code> </code><code>cxx_port1</code><code>=</code><code>i.strip().split()[</code><code>3</code><code>]</code>
<code> </code><code>cxx_port2</code><code>=</code><code>i.strip().split()[</code><code>4</code><code>]</code>
<code> </code><code>iplist.append(ansiblec(name))</code>
<code> </code><code>glist.append(ansiblec(name,group,grouptomcat,cxx_port1,cxx_port2))</code>
<code> </code><code># if not group in inventory:</code>
<code> </code><code># inventory[group] = {</code>
<code> </code><code># 'hosts': []</code>
<code> </code><code># }</code>
<code> </code><code># inventory[group]['hosts'].append(name)</code>
<code> </code><code># for ip in inventory.iteritems():</code>
<code> </code><code># ipt= ip[1]['hosts'][0]</code>
<code> </code><code>ipset</code><code>=</code><code>set</code><code>(iplist)</code>
<code> </code><code>gset</code><code>=</code><code>set</code><code>(glist)</code>
<code> </code><code># print json.dumps(inventory, indent=4)</code>
<code> </code><code>with </code><code>open</code><code>(dfile,</code><code>'wb'</code><code>) as f1:</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>ipset:</code>
<code> </code><code>line </code><code>=</code> <code>str</code><code>(i) </code><code>+</code> <code>"\n"</code>
<code> </code><code>f1.write(line)</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>gset:</code>
<code> </code><code>f1.close()</code>
<code> </code><code>grouplist()</code>
直接執行這個腳本後,自動生成
<code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>ansible.sh</code>
裡面包含就是
這樣,通過兩個python腳本,隻需要一個配置檔案,寫明端口和應用名稱,自動生成建立腳本。
剩餘沒有解決的問題
1.root權限,ansible最好不要用root權限
2.context.xml沒有加入到模闆裡面去,主要做叢集,可以自己添加
3.lib包,比如叢集包沒有,主要做session共享的叢集包
4.沒有自動啟動腳本,這個需要寫下tomcat的啟動腳本
這是自己個人的想法,比以前快點。
本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/1925198,如需轉載請自行聯系原作者