1. Ansible介紹
2013年以前批量管理服務器都是用ssh秘鑰認證+腳本批量管理,ssh它的特點是非常的簡單且實用,而且它是一個類似實時復制的inotify工具。但是2013年后由于MySQL 高可用和MHA集群的發(fā)展,要求所有機器之間都需要秘鑰認證,就誕生了Ansible工具。
2. 批量管理工具的歷史
SSH+腳本:08年以前
CFEngine:07~08年
Puppet:10~13年
saltstack:14~17(python開發(fā))
ansible:16年以后(python開發(fā))
3. 為什么要用Ansible?
使用簡單、方便,易于學習,功能和其他工具相比略勝一籌。
Ansible有自己的配置文件,可以多線程直接實現,而且不需要寫腳本(類似實時復制的sersync)。
4. 什么是Ansible
Ansible是一個用來遠程管理服務器的工具軟件。
Ansible是一個用來批量部署遠程主機上服務的工具。這里“遠程主機(Remote Host)”是指任何可以通過SSH登錄的主機,所以它既可以是遠程虛擬機或物理機,也可以是本地主機。
Ansible通過SSH協(xié)議實現管理節(jié)點與遠程節(jié)點之間的通信。理論上來說,只要能通過SSH登錄到遠程主機來完成的操作,都可以通過Ansible實現批量自動化操作。
涉及管理操作:復制文件、安裝服務、服務啟動停止管理、配置管理等等。
5. 為什么要用批量管理工具運維?
可以顯著的提高效率;例如百度幾萬臺服務器和阿里云幾萬臺服務器(如果沒有批量操作管理工具,估計阿里的人早已累死;而且像百度、阿里這樣的互聯網公司服務器全部都是定制的,且他們在存儲數據上都有一個特點:SSD+SATA熱點存儲)。
6. Ansilbe特點
Ansible基于Python語言實現,由Paramiko和PyYAML兩個關鍵模塊構建。
Shell、Python是Linux運維學員必會的兩門語言。
安裝部署過程特別簡單,學習曲線很平坦。
不需要單獨安裝客戶端,只是利用現有的SSHD服務(協(xié)議)即可。
不需要服務端(no servers)。
ansible playbook,采用yaml配置,提前編排自動化任務。
ansible功能模塊較多,對于自動化的場景支持豐富。
官方參考網址:http://docs.ansible.com
7. Ansible架構介紹(見圖說明)
連接插件connectior plugins用于連接主機 用來連接被管理端
核心模塊 core modules 連接主機實現操作, 它依賴于具體的模塊來做具體的事情
自定義模塊 custom modules,根據自己的需求編寫具體的模塊
插件 plugins,完成模塊功能的補充
劇本 playbooks,ansible的配置文件,將多個任務定義在劇本中,由ansible自動執(zhí)行
主機清單 inventor,定義ansible需要操作主機的范圍
最重要的一點是 ansible是模塊化的 它所有的操作都依賴于模塊

實踐部分:
1. Ansible實踐環(huán)境準備
172.16.1.61(m01)===>172.16.1.31(nfs01)
172.16.1.61(m01)===>172.16.1.41(backup)
2. 安裝Ansible
#m01管理機安裝epel-release、ansible、libselinux-python
[root@m01 /]# yum install epel-release -y
[root@m01 /]# yum install ansible -y
[root@m01 /]# yum install libselinux-python -y
[root@m01 /]# rpm -qa|grep libselinux-python
libselinux-python-2.5-14.1.el7.x86_64
#其它所有被管理服務器下安裝libselinux-python
[root@nfs01 /]# yum install libselinux-python -y
[root@nfs01 /]# rpm -qa|grep libselinux-python
libselinux-python-2.5-14.1.el7.x86_64
3. 主機列表配置
#先備份原始主機列表配置文件
[root@m01 /]# cp /etc/ansible/hosts{,.ori}
#方法一:
#將原始配置文件修改為如下
#注意:如果管理機向被管理機分發(fā)了公鑰文件則不需要添加[oldboy_pass]模塊
[root@m01 /]# cat >/etc/ansible/hosts<<EOF
[oldboy]
172.16.1.31
172.16.1.41
[oldgirl]
172.16.1.31
172.16.1.41
172.16.1.51
[oldboy_pass]
172.16.1.31 ansible_ssh_user=root ansible_ssh_pass=123456
172.16.1.41 ansible_ssh_user=root ansible_ssh_pass=123456
EOF
[root@m01 /]# cat /etc/ansible/hosts
[root@m01 ~]# ansible oldboy -m command -a "free -m" #<==出現如下結果證明已經配置完成
172.16.1.31 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 972 103 555 7 313 654
Swap: 1999 0 1999
#方法二:修改/etc/ansible/ansible.cfg中的374行或者將71行的注釋取消掉
[root@m01 ~]# cat /etc/ansible/ansible.cfg -n|grep 374
374 #ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s
#修改為:ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no
#注意:如果是在重啟服務器后修改374行,需要提前將公鑰分發(fā)至各個需要管理的服務器
[root@m01 ~]# cat /etc/ansible/ansible.cfg -n |grep -w 71
71 #host_key_checking = False
#修改為:host_key_checking = False
4. Ansible命令的常用參數
-m MODULE_NAME:模塊名字,默認command
-a MODULE_ARGS:模塊參數
-f FORKS:并發(fā)進程數,默認為5
-i INVENTORY:指定主機例表文件(/etc/anslble/hosts)
ansible-doc -l #<==查找屬于ansible的模塊
ansible-doc -s command #<==查找某個模塊的具體參數幫助
5. command模塊
5.1 功能說明
command Executes a command on a remote node
執(zhí)行一個命令在遠程節(jié)點上
5.2 操作實踐
1)#注意:不支持的符號;例如 > < | &等 $HOME
ansible oldboy -m command -a "free -m"
ansible oldboy -m command -a "df -h"
ansible oldboy -m command -a "ls /root"
ansible oldboy -m command -a "cat redhat-release"
ansible oldboy -m command -a "cat /etc/redhat-release"
2)#chdir相當于cd /etc
ansible oldboy -m command -a "pwd chdir=/etc"
3)#"pwd creates=/etc"相當于[ -e /etc ]||pwd
后面執(zhí)行成功,前面就不執(zhí)行;后面執(zhí)行失敗,前面才執(zhí)行(creates是創(chuàng)建的意思)
ansible oldboy -m command -a "pwd creates=/etc"
4)#"ls /root removes=/root" 相當于[ -e /root ]&&ls /root
后面執(zhí)行成功,前面才執(zhí)行;后面執(zhí)行失敗,前面就不執(zhí)行(removes是清除的意思)
ansible oldboy -m command -a "ls /root removes=/root"
5)#warn=False 忽略警告
ansible oldboy -m command -a "chmod 000 /etc/hosts warn=False"
6.項目實踐
rsync服務器端:172.16.1.31、172.16.1.41
rsync客戶端:172.16.1.7、172.16.1.8
實現:從172.16.1.7推送文件到172.16.1.31,從172.16.1.8推送文件到172.16.1.41.
#rsync服務端配置命令:
[root@m01 /server/scripts]# cat rsync_server.sh
#!/bin/sh
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
#rsync服務端部署
cp /etc/rsyncd.conf{,.ori}
#配置文件
cat >/etc/rsyncd.conf<<EOF
#config_______________start
#created by liuhuan
uid = rsync
gid = rsync
use chroot = no
fake super = yes
max connections = 200
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 172.16.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment = welcome to oldboyedu backup!
path = /backup/
EOF
#創(chuàng)建用戶|創(chuàng)建目錄并授權|生成密碼文件并授權
useradd rsync
mkdir -p /backup
chown -R rsync.rsync /backup
echo "rsync_backup:oldboy" >/etc/rsync.password
chmod 600 /etc/rsync.password
ls -l /etc/rsync.password
#rsync客戶端命令
[root@m01 /server/scripts]# cat rsync_client.sh
#!/bin/sh
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
#rsync客戶端部署
#生成密碼認證文件并授權
echo "oldboy" >/etc/rsync.password
chmod 600 /etc/rsync.password
ls -l /etc/rsync.password