1,ansible介紹
ssh密鑰認(rèn)證+腳本批量管理爱榕,特點(diǎn):簡(jiǎn)單弃舒,實(shí)用
但是看起來比較low,需要人工寫腳本鸽粉,類似于實(shí)時(shí)復(fù)制的inotify工具
2013年以前這種方式很普遍
MySQL高可用MHA集群斜脂,要求所有的機(jī)器互相密鑰認(rèn)證,大數(shù)據(jù)集群也需要
2触机,批量管理工具歷史
SSH+腳本 CFEngine ?? Puppte ?? saltstack ? ? ? ?? ansible
2013年 ? ? ? ? ? ? ? ? ? ? ? ? 10-13年 ? ? ?? 14-17年 ? ?? (python)
3帚戳,為什么使用ansible?
簡(jiǎn)單儡首,方便片任,容易學(xué)習(xí),功能同樣強(qiáng)大
ansible有配置文件蔬胯,可以多線程直接實(shí)現(xiàn)对供,不需要寫腳本,類似實(shí)時(shí)復(fù)制的sersync
4氛濒,什么是ansible
Ansible是一個(gè)用來遠(yuǎn)程管理服務(wù)器的工具軟件
Ansible是一個(gè)用來批量部署遠(yuǎn)程主機(jī)上服務(wù)的工具产场,這里遠(yuǎn)程主機(jī)(Remote? Host)鹅髓,是指任何可以通過SSH登錄的主機(jī),所以它既可以是遠(yuǎn)程虛擬機(jī)或物理機(jī)京景,也可以是本地主機(jī)
Ansible通過SSH協(xié)議實(shí)現(xiàn)管理節(jié)點(diǎn)與遠(yuǎn)程節(jié)點(diǎn)之間的通信迈勋。理論上來說,只要能通過SSH登錄到遠(yuǎn)程主機(jī)來完成的操作醋粟,都可以通過Ansible實(shí)現(xiàn)批量自動(dòng)化操作靡菇。涉及管理操作:復(fù)制文件、安裝服務(wù)米愿、服務(wù)啟動(dòng)停止管理厦凤、配置管理等等。
5育苟,為什么要用批量管理工具運(yùn)維
提高效率较鼓,服務(wù)器很多的情況下,例如阿里幾十萬臺(tái)服務(wù)器
6违柏,Ansible特點(diǎn)
Ansible基于Python語言實(shí)現(xiàn)博烂,由Paramiko和PyYAML兩個(gè)關(guān)鍵模塊構(gòu)建
Shell、Python是Linux運(yùn)維學(xué)員必會(huì)的兩門語言
1漱竖,安裝部署過程特別簡(jiǎn)單禽篱,學(xué)習(xí)曲線很平坦
2,不需要單獨(dú)安裝客戶端馍惹,只是利用現(xiàn)有的SSHD服務(wù)(協(xié)議)即可
3躺率,不需要服務(wù)端(no? server)
4,ansible playbook万矾,采用yaml配置悼吱,提前編排自動(dòng)化任務(wù)
5,ansible功能模塊較多良狈,對(duì)于自動(dòng)化的場(chǎng)景支持豐富
7后添,Ansible架構(gòu)介紹
1、連接插件connectior plugins用于連接主機(jī) 用來連接被管理端
2薪丁、核心模塊 core modules 連接主機(jī)實(shí)現(xiàn)操作遇西, 它依賴于具體的模塊來做具體的事情
3、自定義模塊 custom modules窥突,根據(jù)自己的需求編寫具體的模塊
4努溃、插件 plugins硫嘶,完成模塊功能的補(bǔ)充
5阻问、劇本 playbooks,ansible的配置文件,將多個(gè)任務(wù)定義在劇本中沦疾,由ansible自動(dòng)執(zhí)行
6称近、主機(jī)清單 inventor第队,定義ansible需要操作主機(jī)的范圍
最重要的一點(diǎn)是 ansible是模塊化的 它所有的操作都依賴于模塊
(懂Python可以二次開發(fā))
8,ansible實(shí)踐環(huán)境準(zhǔn)備
61(BOSS)======>>31(nfs)
61? (BOSS)? ======>>41(backup)
9刨秆,安裝ansible
BOSS管理機(jī)操作:
[root@BOSS ~]# yum install ansible -y ? ? ??
? ? ? ? ? ? ?? ===============>>此處省略
[root@BOSS ~]# rpm -qa |grep libselinux-python
libselinux-python-2.5-12.el7.x86_64 ? ? ?? =======>>正確
其他所有被管理的機(jī)器:
[root@NFS ~]# rpm -qa |grep libselinux-python
libselinux-python-2.5-14.1.el7.x86_64
[root@NFS ~]# yum install libselinux-python -y
=================>>此處省略
[root@BACKUP ~]# rpm -qa |grep libselinux-python
libselinux-python-2.5-14.1.el7.x86_64
[root@BACKUP ~]# yum install libselinux-python -y
? ? ?? =======================>>此處省略
10凳谦,主機(jī)列表配置
ssh列表實(shí)現(xiàn)方法:
for n in 7 8
do
echo 172.16.1.$n
done
/etc/ansible/hosts主機(jī)資產(chǎn)清單文件,用于定義被管理主機(jī)的認(rèn)證信息
例如ssh登錄用戶名衡未、密碼以及key相關(guān)信息尸执。如何配置Inventory文件
1.主機(jī)支持主機(jī)名通配以及正則表達(dá)式,例如web[1:3].oldboy.com代表三臺(tái)主機(jī)
2.主機(jī)支持基于非標(biāo)準(zhǔn)的ssh端口缓醋,例如web1.oldboyedu.com:6666
3.主機(jī)支持指定變量如失,可對(duì)個(gè)別主機(jī)的特殊配置,如登陸用戶\密碼
4.主機(jī)組支持指定變量[group_name:vars]送粱,同時(shí)支持嵌套組[game:children]
實(shí)踐:
[root@BOSS ~]# cp /etc/ansible/hosts{,.ori}
cp: overwrite '/etc/ansible/hosts.ori'? y
[root@BOSS ~]# 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
> EOF
檢查:
[root@BOSS ~]# cat /etc/ansible/hosts
[oldboy]
172.16.1.31
172.16.1.41
[oldgirl]
172.16.1.31
172.16.1.41
172.16.1.51
====================>>正確
/etc/ansible/ansible.cfg ###########ansible的配置文件
11褪贵,小試牛刀
[root@BOSS ~]# ansible oldboy -m command -a "free -m"? =============>>報(bào)錯(cuò)
ansible oldboy -m command -a "free -m" ? ######要想成功,先解決yes/no的問題
1抗俄,ssh連接一遍
2脆丁,ssh -o 參數(shù)
上述命令就是sshpass的封裝
================================================================
修改Host增加用戶和密碼:
[root@BOSS ~]# vim /etc/ansible/hosts
? 1 [oldboy]
? 2 172.16.1.31
? 3 172.16.1.41
? 4
? 5 [oldgirl]
? 6 172.16.1.31
? 7 172.16.1.41
? 8 172.16.1.51
? 9? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
10 [oldboy_pass]
11 172.16.1.31 ansible_ssh_user=root ansible_ssh_pass=123456
12 172.16.1.41 ansible_ssh_user=root ansible_ssh_pass=123456
==========================================================
測(cè)試:
[root@BOSS ~]# ansible oldboy_pass -m command -a "free -m"
172.16.1.31 | CHANGED | rc=0 >>
? ? ? ? ? ? ? total? ? ? ? used? ? ? ? free? ? ? shared? buff/cache? available
Mem:? ? ? ? ? ? 974? ? ? ? ? 77? ? ? ? 672? ? ? ? ? 7? ? ? ? 225? ? ? ? 734
Swap:? ? ? ? ? 1999? ? ? ? ? 0? ? ? ? 1999
172.16.1.41 | CHANGED | rc=0 >>
? ? ? ? ? ? ? total? ? ? ? used? ? ? ? free? ? ? shared? buff/cache? available
Mem:? ? ? ? ? ? 974? ? ? ? ? 72? ? ? ? 678? ? ? ? ? 7? ? ? ? 223? ? ? ? 740
Swap:? ? ? ? ? 1999? ? ? ? ? 0? ? ? ? 1999
================================================>>>成功
結(jié)論:使用SSH連接
密碼認(rèn)證? host里主機(jī)后面加密碼 ? ?? Paramiko模塊 ? 重點(diǎn):
密鑰認(rèn)證:提前發(fā)公鑰,才能使用ansible动雹,SSHPSAA工具
http://docs.ansible.com/ansible/latest/intro_inventory.html#list-of-behavioral-inventory-parameters
====================================================================
特殊端口:
[oldboy]
172.16.1.7? ansible_port=52113? ansible_user=root ansible_ssh_pass=123456
172.16.1.8? ansible_port=52113? ansible_user=root ansible_ssh_pass=123456
==================================================================
12槽卫,基于SSH秘鑰認(rèn)證的實(shí)踐
秘鑰分發(fā)腳本:
[root@BOSS ~]# vim yy.sh
?#!/bin/bash
#QQ: 2221269920
?#Private web site: www.xiakexing.vip
?#Date?Z2019-04-23
?#Author: longjie
?ssh-keygen -f ~/.ssh/id_rsa? -P '' -q
?for ip in 7 8 41 31
?do
?sshpass -p123456 ssh-copy-id -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 172.
? ? 16.1.$ip
?done ?
==============================================>>>腳本內(nèi)容
11,ansible命令參數(shù)
-m MODULE_NAME, 模塊名字胰蝠,默認(rèn)command
-a MODULE_ARGS, 模塊參數(shù)
-f FORKS ? ? 并發(fā)進(jìn)程數(shù)晒夹,默認(rèn)5個(gè)。
-i INVENTORY(default=/etc/ansible/hosts)指定主機(jī)列表文件
=============================================================
ansible
ansible-doc
ansible-playbook
ansible-galaxy
=======================================================
12姊氓,ansible模塊查看和幫助
查找模塊
ansible-doc -l ? ?? ######模塊就Linux命令了
查看某個(gè)模塊的具體參數(shù)幫助
ansible-doc -s command? #Linux命令參數(shù)
=====================================================
12.1 command模塊 *****
1)功能說明:
command? Executes a command on a remote node
功能說明:執(zhí)行一個(gè)命令在遠(yuǎn)程節(jié)點(diǎn)上
操作實(shí)踐:
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"
最通用的功能
===========================================================
腳本:
#!/bin/bash
#QQ: 2221269920
#Private web site: www.xiakexing.vip
#Date?Z2019-04-23
#Author: longjie
for n in 31 41
do? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? echo "=====172.16.1.$n======"
? ssh 172.16.1.$n "$1"
done
============================================
執(zhí)行:
[root@BOSS ~]# sh pp.sh "cat /etc/redhat-release"
=====172.16.1.31======
CentOS Linux release 7.5.1804 (Core)
=====172.16.1.41======
CentOS Linux release 7.5.1804 (Core)
===============================>>>成功
參數(shù)信息:
參數(shù):chdir=/tmp配置相當(dāng)于cd /tmp
[root@m01 ~]# ansible oldboy? -m command -a "pwd chdir=/etc"
ansible oldboy? -m shell -a "cd /etc/;pwd"
參數(shù):creates=/etc? 相當(dāng)于條件測(cè)試? [ -e /etc ]||pwd 和下面removes相反
[root@m01 ~]# ansible oldboy? -m command -a "pwd creates=/etc"
參數(shù):removes=/root 相當(dāng)于條件測(cè)試 [ -e /root ]&&ls /root
ansible oldboy? -m command -a "ls /root removes=/root"
ansible oldboy? -m shell -a "[ -d /etc ]||pwd"
[root@m01 ~]# ansible oldboy? -m command -a "cat /etc/hosts removes=/etc/hosts"
參數(shù):warn=False 忽略警告
[root@m01 ~]# ansible oldboy? -m command -a "chmod 000 /etc/hosts warn=False"