基於ansible role實現LAMP平臺批量部署

前言

作爲運維人員,當面對幾十臺或上百臺服務器需要修改某個參數或部署某個平臺,你將從何入手呢?ansible的出現很好的解決了這一困擾,ansible基於Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。本文帶來的是基於Ansible Role實現LAMP平臺批量部署。

ansible簡介

特性

  • No agents:不需要在被管控主機上安裝任意客戶端

  • No server:無服務器端,使用時直接運行命令即可

  • Modules in any languages:基於模塊工作,可使用任意語言開發模塊

  • YAML,not code:使用yaml語言定製劇本playbook

  • SSH by default:基於SSH工作

  • Strong multi-tier solution:可實現多級指揮

基本架構

wKiom1V2iXiBUjalAAFoXWw40Qw478.jpg

命令格式

#常用格式
ansible <host-pattern> [-f forks] [-m module] [-a args]
host-pattern # 可以是all,或者配置文件中的主機組名
-f forks # 指定並行處理的進程數
-m module # 指定使用的模塊,默認模塊爲command
-a args # 指定模塊的參數
#查看各模塊
ansible-doc [options] [modules]
# 主要選項有:
-l或--list # 列出可用的模塊
-s或--snippet #顯示指定模塊的簡略使用方法

其他知識點介紹詳見官方文檔,我們直接進入正題

ansible role實現LAMP平臺批量部署

ansible role

ansilbe自1.2版本引入的新特性,用於層次性、結構化地組織playbook。roles能夠根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變量、文件、任務、模塊及處理器放置於單獨的目錄中,並可以便捷地include它們的一種機制。角色一般用於基於主機構建服務的場景中,但也可以是用於構建守護進程等場景中。

#創建role的步驟
(1) 創建以roles命名的目錄;
(2) 在roles目錄中分別創建以各角色名稱命名的目錄,如webservers等;
(3) 在每個角色命名的目錄中分別創建files、handlers、meta、tasks、templates和vars目錄;用不
到的目錄可以創建爲空目錄,也可以不創建;
(4) 在playbook文件中,調用各角色;
#role內各目錄中可用的文件
tasks目錄:至少應該包含一個名爲main.yml的文件,其定義了此角色的任務列表;此文件可以使用in
clude包含其它的位於此目錄中的task文件;
files目錄:存放由copy或script等模塊調用的文件;
templates目錄:template模塊會自動在此目錄中尋找Jinja2模板文件;
handlers目錄:此目錄中應當包含一個main.yml文件,用於定義此角色用到的各handler;在handler
中使用include包含的其它的handler文件也應該位於此目錄中;
vars目錄:應當包含一個main.yml文件,用於定義此角色用到的變量;
meta目錄:應當包含一個main.yml文件,用於定義此角色的特殊設定及其依賴關係;
default目錄:爲當前角色設定默認變量時使用此目錄;應當包含一個main.yml文件;

實驗拓撲

wKioL1V2pyqhMpdrAADUs38s-1Q655.jpg

配置過程

安裝ansible

[root@scholar ~]# yum install ansible -y        #需epel源

配置inventory文件

[root@scholar ~]# vim /etc/ansible/hosts 
#定義被控主機
[webservers]
172.16.10.123 ansible_ssh_user=root ansible_ssh_pass=centos
172.16.10.124 ansible_ssh_user=root ansible_ssh_pass=centos
[dbservers]
172.16.10.125 ansible_ssh_user=root ansible_ssh_pass=centos

實現基於ssh密鑰通信

[root@scholar ~]# ssh-keygen -t rsa -P ''
[root@scholar ~]# yum install sshpass -y  #請確保安裝sshpass,不然無法通信

wKiom1V2xrKgy0KwAAHn8bqqVCM977.jpg

wKiom1V2y8vDqSwXAABruWPFbdo902.jpg

#另外一組也執行以上操作

#此時可以將/etc/ansible/hosts改爲
[webservers]
172.16.10.123 
172.16.10.124 
[dbservers]
172.16.10.125

創建各目錄

[root@scholar ~]# mkdir lamp/role -pv
[root@scholar role]# mkdir web/{files,handlers,meta,tasks,templates,vars,default} db/{fil
es,handlers,meta,tasks,templates,vars,default} php/{files,handlers,meta,tasks,templates,v
ars,default} -p

準備各服務配置文件

[root@scholar role]# cp /etc/httpd/conf/httpd.conf web/files/
[root@scholar role]# cp /etc/php.ini php/files/
[root@scholar role]# cp /etc/my.cnf db/files/

創建各劇本

[root@scholar role]# touch web.yml php.yml db.yml site.yml
[root@scholar role]# touch web/{handlers,tasks}/main.yml db/{handlers,tasks}/main.yml php
/tasks/main.yml
[root@scholar role]# vim web.yml

- name: web service
  remote_user: root
  hosts: webservers
  roles:
    - web

[root@scholar role]# vim php.yml    

- name: php service
  remote_user: root
  hosts: webservers
  roles:
    - php
    
[root@scholar role]# vim db.yml 

- name: mysql service
  remote_user: root
  hosts: dbservers
  roles:
    - db

[root@scholar role]# vim web/tasks/main.yml     

- name: install httpd
  yum: name=httpd state=present
- name: configuration httpd
  copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
  notify:
    - restart httpd
- name: service httpd start
  service: name=httpd enabled=no state=started
  
[root@scholar role]# vim web/handlers/main.yml 

- name: restart httpd
  service: name=httpd state=restarted
  
[root@scholar role]# vim php/tasks/main.yml 

- name: install php
  yum: name=php state=present
- name: configuration php
  copy: src=php.ini dest=/etc/php.ini
  
[root@scholar role]# vim db/tasks/main.yml 

- name: install mysql
  yum: name=mysql state=present
- name: install mysql-server
  yum: name=mysql-server state=present
- name: configuration mysqld
  copy: src=my.cnf dest=/etc/my.cnf
  notify:
    - restart mysqld
- name: service mysqld start
  service: name=mysqld enabled=no state=started
  
[root@scholar role]# vim db/handlers/main.yml 

- name: restart mysqld
  service: name=mysqld state=restarted

批量部署

部署httpd

wKiom1V26JjiW9jIAAIa_z48tUw294.jpg

部署php

wKioL1V26sqg_9qTAAHcy9Ebvgo344.jpg

部署mysql

wKiom1V26f3x5IobAAIqz5fXrDA878.jpg

查看各節點服務端口是否被監聽

wKioL1V27LWjawB_AADW2sCvEGI954.jpg

The end

基於ansible role實現LAMP平臺批量部署就簡單說到這裏了,以上僅是牛刀小試,其他高難度部署還有待探究,實驗過程中坑也不少,具體遇到問題可留言交流。以上僅爲個人學習整理,如有錯漏,大神勿噴~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章