ansible實戰示例

要求:

    使用ansible部署以下任務:

    (1) 在VS部署主/備模型的keepalived + nginx的負載均衡;

    (2) 在RS主機上部署httpd + php + php-mysql;

    (3) 在第五臺主機上部署mariadb-server, 并且數據庫擁有testdb庫, 并運行testuser對其擁有所有權;

步驟:

  1. 各主機IP規劃

    主機A: IPADDR=10.1.52.11

    主機B: IPADDR=10.1.52.22

    主機C: IPADDR=10.1.52.2

    主機D: IPADDR=10.1.52.3

    主機E: IPADDR=10.1.52.4

    

    其中主機A,B為keepalived+nginx的VS主機; 主機C,D部署httpd,php和php-mysql; 主機E部署mariadb-server.

2. 首先在A上安裝ansible, 并編輯/etc/ansible/hosts文件, 添加如下內容

[lvssrv]
10.1.52.11 STATE='MASTER' WEIGHT='100' VRIP='123' # 提供lvs服務
10.1.52.22 STATE='BACKUP' WEIGHT='98' VRIP='122'  # 提供lvs服務
[websrv]
10.1.52.2  #提供httpd服務
10.1.52.3  #提供httpd服務
[dbsrv]
10.1.52.4  #提供mysql服務

3. 在/etc/ansible/roles目錄下創建各需要的目錄

mkdir -pv /etc/ansible/roles/{nginx,keepalived,httpd,mysql}/{files,tasks,templates,vars,handlers,meta,defaults}

4. 為keepalived提供playbook的roles文件

(1) 創建/etc/ansilbe/roles/keepalived/tasks/main.yml文件, 添加如下內容

- name: install keepalived
  yum: name=keepalived state=latest
- name: copy nofigy.sh
  copy: src=notify.sh dest=/etc/keepalived/notify
- name: Virtual IP address
  shell: /usr/sbin/ip add add 10.1.52.123/16 dev eno16777736
- name: start keepalived service
  shell: /usr/bin/systemctl start keepalived
- name: copy conf file
  template: src=keepalived.conf.j2 dest=/etc/keepalived/keepalived.conf
  tags: instconf
  notify: reload keepalived service

(2) 提供templates的模板配置文件/etc/ansible/roles/keepalived/templates/keepalived.conf.j2, 內同如下, 其中參數部分, 在/etc/ansible/hosts文件中已經給出:

! Configuration File for keepalived

global_defs {
	notification_email {
		root@localhost
	}
	notification_email_from keepalived@localhost
	smtp_server 127.0.0.1
	smtp_connect_timeout 30
	router_id {{ ansible_hostname }}
	vrrp_mcast_group4 224.0.52.123
}

vrrp_script chk_down {
	script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
	interval 1
	weight -5
}

vrrp_script chk_nginx {
	script "killall -0 nginx && exit 0 || exit 1"
	interval 1
	weight -5
}
vrrp_instance VI_1 {
	state {{ STATE }}
	interface eno16777736
	virtual_router_id {{ VRIP }}
	priority {{ WEIGHT }}
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 571f97b2
	}
	virtual_ipaddress {
		10.1.52.123/16 dev eno16777736
	}
	track_script {
		chk_down
		chk_nginx
	}
	notify_master "/etc/keepalived/notify.sh master"
	notify_backup "/etc/keepalived/notify.sh backup"
	notify_fault "/etc/keepalived/notify.sh fault"
}

(3) 提供notify.sh腳本, 放置在/etc/ansible/roles/keepalived/files/目錄下, 內容如下

#!/bin/bash
#

contact='root@localhost'

notify() {
	mailsubject="$(hostname) to be $1, vip floating"
	mailbody="$(date +'%F %T'):vrrp transition, $(hostname) changed to be $1"
	echo "$mailbody" | mail -s "$mailsubject" $contact
}

case $1 in
master)
	notify master
	;;
backup)
	notify backup
	;;
fault)
	notify fault
	;;
*)
	echo "Usage: $(basename $0) {maseter|backup|fault}"
	exit 1
esac

(4) 提供handlers文件, 文件名為/etc/ansible/roles/keepalived/handlers/main.yml, 內容如下

- name: reload keepalived service
  shell: "/usr/bin/systemctl restart keepalived.service"

5. 為nginx提供playbook的roles文件

(1) 創建/etc/ansilbe/roles/keepalived/tasks/main.yml文件, 添加如下內容

- name: copy nginx package
  copy: src=nginx-1.10.2-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm
- name: install nginx 
  shell: "/usr/bin/yum -y install /tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm"
- name: delete nginx package 
  shell: "/usr/bin/rm -f /tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm"
- name: copy conf file
  copy: src={{ item.ngxconfj2 }} dest={{ item.ngxconf }}
  with_items:
  - { ngxconfj2: nginx.conf.j2, ngxconf: /etc/nginx/nginx.conf }
  - { ngxconfj2: nginx.default.conf.j2, ngxconf: /etc/nginx/conf.d/default.conf }
- name: start nginx service 
  shell: "/usr/bin/systemctl start nginx"

(2) 在/etc/ansible/roles/nginx/files/目錄下放置nginx的rpm安裝文件

示例用版本為: nginx-1.10.2-1.el7.ngx.x86_64.rpm

(3) 為nginx提供負載均衡的配置文件, 放置在/etc/ansible/roles/nginx/files/目錄下, 文件名與修改的配置文件內容如下, 其他為默認:

   (a) nginx.conf.j2

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    access_log  /var/log/nginx/access.log  main;    
    keepalive_timeout  65;
    upstream websrvs {
	server 10.1.52.2;
	server 10.1.52.3;
    }   
    include /etc/nginx/conf.d/*.conf;
}

    (b) nginx.default.conf.j2

server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
	proxy_pass http://websrvs;
        index  index.html index.htm;
    }    
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

6. 為httpd, php, php-mysql提供playbook的roles文件

(1) 在/etc/ansible/roles/httpd/templates/index.html.j2文件, 內容如下

<h1> {{ ansible_hostname }} </h1>

(2) 創建/etc/ansilbe/roles/httpd/tasks/main.yml文件, 添加如下內容

- name: install httpd php and php-mysql
  yum: name={{ item }} state=latest
  with_items:
  - httpd
  - php
  - php-mysql
- name: support index.html
  template: src=index.html.j2 dest=/var/www/html/index.html
- name: copy set.sh
  copy: src=set.sh dest=/root/set.sh
- name: add ip address
  shell: bash /root/set.sh start
- name: start httpd service
  shell: "/usr/bin/systemctl start httpd.service"

(3) 在/etc/ansible/roles/httpd/files/目錄下, 創建set.sh文件, 內容如下:

#!/bin/bash
#
vip='10.1.52.123'
vport='80'
netmask='255.255.255.255'
iface='lo:0'

case $1 in
start)
	echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
	echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
	echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
	echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

	ifconfig $iface $vip netmask $netmask broadcast $vip up
	route add -host $vip dev $iface
	;;
stop)
	ifconfig $iface down
	echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
	echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
	echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
	echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
esac

7. 為httpd, php, php-mysql提供playbook的roles文件

(1) 在/etc/ansible/roles/mysql/tasks/index.html.j2文件, 內容如下

- name: isntall mariadb-server
  yum: name=mariadb-server state=latest
- name: copy cnf file
  copy: src=my.cnf dest=/etc/my.cnf
- name: copy sql script
  copy: src=grant_testuser.sql dest=/root/grant_testuser.sql
- name: start mariadb service
  shell: /usr/bin/systemctl start mariadb.service
- name: create database and grant user
  shell: "/usr/bin/mysql < /root/grant_testuser.sql"

(2) 在/etc/ansible/roles/mysql/files/目錄下創建grant_testuser.sql文件, 內容如下

CREATE DATABASE testdb;
GRANT ALL ON *.* TO 'testuser'@'localhost' IDENTIFIED BY 'testpass';
GRANT ALL ON *.* TO 'testuser'@'10.1.52.%' IDENTIFIED BY 'testpass';
GRANT ALL ON *.* TO 'testuser'@'127.0.0.1' IDENTIFIED BY 'testpass';

(3) 在/etc/ansible/roles/mysql/files/下創建my.cnf, 內容如下:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
skip_name_resolve = ON
innodb_file_per_table = ON
!includedir /etc/my.cnf.d

8. 在/erc/ansible/目錄下分別創建各程序的playbook的yml文件

(1) 創建keepalived.yml, 內容如下

- hosts: lvssrv
  remote_user: root
  roles:
  - keepalived

(2) 創建nginx.yml, 內容如下:

- hosts: lvssrv
  remote_user: root
  roles:
  - nginx

(3) 創建httpd.yml, 內容如下

- hosts: websrv
  remote_user: root
  roles:
  - httpd

(4) 創建mysql.yml, 內容如下

- hosts: dbsrv
  remote_user: root
  roles:
  - mysql

9. 分別運行各yml文件

ansible-playbook /etc/ansible/keepalived.yml
ansible-playbook /etc/ansible/nginx.yml
ansible-playbook /etc/ansible/httpd.yml
ansible-playbook /etc/ansible/mysql.yml

10. 使用curl測試實驗

[root@node1 ~]# (for i in {1..10}; do curl http://10.1.52.123 ; done;)
<h1> node3 </h1>
<h1> node2 </h1>
<h1> node3 </h1>
<h1> node2 </h1>
<h1> node3 </h1>
<h1> node2 </h1>
<h1> node3 </h1>
<h1> node2 </h1>
<h1> node3 </h1>
<h1> node2 </h1>

11. 經測試, 實驗成功.

原創文章,作者:black_fish,如若轉載,請注明出處:http://www.www58058.com/58045

(2)
black_fishblack_fish
上一篇 2016-11-11
下一篇 2016-11-11

相關推薦

  • Linux計算機基礎-入門2016-07-19

    Linux計算機基礎-入門2016-07-19 計算機系統的組成部分 計算機系統由硬件系統和軟件系統兩大部分組成 硬件系統 馮.諾依曼體系結構: 1946年數學家馮.諾依曼提出運算器,控制器,存儲器,輸入設備,輸出設備。 具體變現為一下硬件: 運算器,控制器  ——>  CPU 存儲器  …

    Linux干貨 2016-08-04
  • 馬哥教育網絡班20期+第3周課程練習

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 # who |cut -d" " -f1 | uniq 2、取出最后登錄到當前系統的用戶的相關信息。 # last | head -1 3…

    Linux干貨 2016-06-26
  • 關于軟硬鏈接那些事兒

           小編這周接觸到了鏈接,那么重點來了,啥是鏈接呢小編覺得鏈接簡單來說就是一種共享的方式,比如我們去逛超市,超市的入口就是‘鏈接’。在Linux中,鏈接又分為軟連接和硬鏈接,想要了解他倆,就得先了解幾個基本概念。 一:Inode       我們知道文件包含數據和元數據,它的數據…

    Linux干貨 2017-07-22
  • 如何在Linux上創建文件系統

        談到如何創建文件系統,在這里就不得不提一下什么是文件系統,在百度上搜索得到的定義是這樣的:操作系統中負責管理和存儲文件信息的軟件機構稱為文件管理系統,簡稱文件系統,簡單的看這個概念可能感覺還是有點茫茫然,其實簡單的說,就是定義磁盤存取數據的一種邏輯組織,我們都知道磁盤是一種存儲數據的硬件,首先但這個硬件的工作當…

    Linux干貨 2016-01-18
  • N22-第一周練習作業-冥界之王

    1.描述計算機系統的組成及功能硬件組成(輸入設備,輸出設備,存儲器,運算器,控制器) 輸入設備:鼠標,鍵盤,麥克,聲卡(輸入聲音),掃描儀,手寫板等輸出設備:顯示器,聲卡(輸出聲音),音箱,投影儀等存儲器:內存,硬盤,磁帶,CPU內部還可以分1,2,3級緩存運算器:主要完成對二進制數據的定點算術運算(加減乘除)、邏輯運算(與或非異或)以及移位操作。在某些CP…

    Linux干貨 2016-08-15
  • 馬哥教育21期網絡班—第15周課程+練習—-awk 總結

    GNU awk: 文本處理三工具:grep, sed, awkgrep, egrep, fgrep:文本過濾工具;pattern sed: 行編輯器 模式空間、保持空間 awk:報告生成器,格式化文本輸出; AWK: Aho, Weinberger, Kernighan&nbsp…

    Linux干貨 2016-11-14
欧美性久久久久