天天看點

ansible安裝tomcat8 最終版

假如你要在一台機器安裝多個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 &lt;hostname&gt;"</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` &amp;&amp; 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 &amp;&amp; source </code><code>/</code><code>etc</code><code>/</code><code>profile &amp;&amp; sudo </code><code>-</code><code>i </code><code>-</code><code>u tomcat nohup sh `cxx_pro_dir`.sh start &amp;</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,如需轉載請自行聯系原作者