1.什么是Ansible
Ansible是python 中的一套模塊呢灶,系統(tǒng)中的一套自動化工具,只需要使用ssh協(xié)議連接及可用來系統(tǒng)管理、自動化執(zhí)行命令等任務(wù)。
2.Ansible優(yōu)勢
1端铛、ansible不需要單獨(dú)安裝客戶端,也不需要啟動任何服務(wù)
2疲眷、ansible是python中的一套完整的自動化執(zhí)行任務(wù)模塊
3禾蚕、ansible playbook,采用yaml配置狂丝,對于自動化任務(wù)執(zhí)行一目了然
4换淆、ansible 模塊較多,對于自動化的場景支持較豐富
3.Ansible架構(gòu)
Ansible組成結(jié)構(gòu)
- Ansible
是Ansible的命令工具几颜,核心執(zhí)行工具产舞;一次性或臨時執(zhí)行的操作都是通過該命令執(zhí)行。 - Ansible Playbook
任務(wù)劇本(又稱任務(wù)集)菠剩,編排定義Ansible任務(wù)集的配置文件,由Ansible順序依次執(zhí)行耻煤,yaml格式具壮。 - Inventory
Ansible管理主機(jī)的清單,默認(rèn)是/etc/ansible/hosts文件哈蝇。 - Modules
Ansible執(zhí)行命令的功能模塊棺妓,Ansible2.3版本為止,共有1039個模塊炮赦。還可以自定義模塊怜跑。 - Plugins
插件,模塊功能的補(bǔ)充,常有連接類型插件性芬,循環(huán)插件峡眶,變量插件,過濾插件植锉,插件功能用的較少辫樱。 - API
提供給第三方程序調(diào)用的應(yīng)用程序編程接口。 - custom modules
自定義模塊 俊庇,根據(jù)自己的需求編寫具體的模塊
最重要的一點(diǎn)是 ansible是模塊化的 它所有的操作都依賴于模塊
4.為什么使用Ansible
批量管理功能
1.批量命令執(zhí)行
2.批量安裝服務(wù)
3.批量配置同步
4.批量任務(wù)執(zhí)行
5.批量代碼部署
6.批量系統(tǒng)操作配置
7.批量文件數(shù)據(jù)分發(fā)
8.批量系統(tǒng)信息收集
5.Ansible安裝
[root@m01 ~]# yum install ansible -y
[root@m01 ~]# ansible --version
ansible 2.9.6
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
ansible配置文件存在優(yōu)先級的問題
ANSIBLE_CONFIG #環(huán)境變量
ansible.cfg #項目目錄
.ansible.cfg #當(dāng)前用戶的家目錄
/etc/ansible/ansible.cfg #默認(rèn)配置文件
#由上到下優(yōu)先級逐漸降低
配置文件詳解
[root@m01 ~]# cat /etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts #主機(jī)列表配置文件
#library = /usr/share/my_modules/ #庫文件存放目錄
#remote_tmp = ~/.ansible/tmp #臨時py文件存放在遠(yuǎn)程主機(jī)目錄
#local_tmp = ~/.ansible/tmp #本機(jī)的臨時執(zhí)行目錄
#forks = 5 #默認(rèn)并發(fā)數(shù)
#sudo_user = root #默認(rèn)sudo用戶
#ask_sudo_pass = True #每次執(zhí)行是否詢問sudo的ssh密碼
#ask_pass = True #每次執(zhí)行是否詢問ssh密碼
#remote_port = 22 #遠(yuǎn)程主機(jī)端口
host_key_checking = False #跳過檢查主機(jī)指紋
log_path = /var/log/ansible.log #ansible日志
[privilege_escalation] #如果是普通用戶則需要配置提權(quán)
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
6.Ansible inventory
/etc/ansible/hosts主機(jī)資產(chǎn)清單文件狮暑,用于定義被管理主機(jī)的認(rèn)證信息, 例如ssh登錄用戶名辉饱、密碼以及key相關(guān)信息搬男。如何配置Inventory文件
1.主機(jī)支持主機(jī)名通配以及正則表達(dá)式,例如web[1:3].test.com代表三臺主機(jī)
2.主機(jī)支持基于非標(biāo)準(zhǔn)的ssh端口彭沼,例如web1.test.com:6666
3.主機(jī)支持指定變量缔逛,可對個別主機(jī)的特殊配置,如登陸用戶溜腐,密碼
4.主機(jī)組支持指定變量[group_name:vars]译株,同時支持嵌套組[game:children]
場景一、基于密碼連接
[root@m01 ~]# cat /etc/ansible/hosts
#方式一挺益、主機(jī)+端口+密碼
[webservers]
10.0.0.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
10.0.0.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
#方式二歉糜、主機(jī)+端口+密碼
[webservers]
web[1:2].yuntaoshu.com ansible_ssh_pass='123456'
#方式三、主機(jī)+端口+密碼
[webservers]
web[1:2].yutaoshu.com
[webservers:vars]
ansible_ssh_pass='123456'
場景二望众、基于密鑰連接匪补,需要先創(chuàng)建公鑰和私鑰,并下發(fā)公鑰至被控端
利用非交換式工具實(shí)現(xiàn)批量分發(fā)公鑰與批量管理服務(wù)器
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.31
#方式一烂翰、主機(jī)+端口+密鑰
[group_name]
10.0.0.31:22
10.0.0.41
#方式二夯缺、別名+主機(jī)+端口+密鑰
[group_name]
nfs-node1 ansible_ssh_host=10.0.0.31 ansible_ssh_port=22
場景三、主機(jī)組使用方式
#方式一甘耿、主機(jī)組變量+主機(jī)+密碼
[group_name1]
10.0.0.31
10.0.0.41
[group_name1:vars]
ansible_ssh_pass='123456'
#方式二踊兜、主機(jī)組變量+主機(jī)+密鑰
[group_name2]
10.0.0.7
10.0.0.8
#定義多組,多組匯總整合
# webservers組包括兩個子組[apapche,nginx]
[webservers:children]
[group_name1]
[group_name2]
查看主機(jī)清單
#查看所有
[root@m01 ~]# ansible all --list-hosts
hosts (1):
172.16.1.7
#查看某個組內(nèi)的主機(jī)數(shù)
[root@client ~]# ansible web --list-hosts
hosts (1):
172.16.1.7
#查看非默認(rèn)配置主機(jī)清單的
[root@m01 /project1]# ansible web -i hosts --list-hosts
hosts (1):
172.16.1.7
inventory內(nèi)置參數(shù)
被控端首次連接容易出現(xiàn)問題
解決方案1
如果控制端和被控制端第一次通訊佳恬,需要確認(rèn)指紋信息捏境,如果機(jī)器特別多少的情況下怎么辦?
將 Ansible 配置文件中的 host_key_checking = False 參數(shù)注釋打開即可毁葱。
但要注意ansible.cfg文件的讀取順序垫言。
解決方案2
通過腳本來實(shí)現(xiàn)
[root@ansible ~]# vim /server/scripts/fenfa.sh
#!/bin/bash
if [ -f /root/.ssh/id_rsa ];then
echo "----------密鑰對已經(jīng)存在---------------"
else
echo "----------正在生成密鑰對---------------"
ssh-keygen -f /root/.ssh/id_rsa -N '' > /dev/null 2>&1
fi
for i in {5,6,7,8,9,31,41,51,52}
do
echo "正在操作:172.16.1.${i}"
echo "----------正在分發(fā)--------"
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.${i} -o StrictHostKeyChecking=no > /tmp/ssh
.log 2>&1
done
7.Ansible Ad-Hoc
1.什么是ad-hoc模式
ad-hoc簡而言之,就是“臨時命令”倾剿,不會保存
ansible中有兩種模式, 分別是ad-hoc模式和playbook模式
2.ad-hoc模式的使用場景
場景一筷频,在多臺機(jī)器上,查看某個進(jìn)程是否啟動
場景二,在多臺機(jī)器上凛捏,拷貝指定日志文件到本地担忧,等等
3.ad-hoc模式的命令使用
4.ad-hoc模式的常用模塊
Ansible執(zhí)行返回->顏色信息說明
黃色:對遠(yuǎn)程節(jié)點(diǎn)進(jìn)行相應(yīng)修改
綠色:對遠(yuǎn)程節(jié)點(diǎn)不進(jìn)行相應(yīng)修改,或者只是對遠(yuǎn)程節(jié)點(diǎn)信息進(jìn)行查看
紅色:操作執(zhí)行命令有異常
紫色:表示對命令執(zhí)行發(fā)出警告信息(可能存在的問題葵袭,給你一下建議)
1.command命令模塊
# 默認(rèn)模塊, 執(zhí)行命令
[root@m01 ~]# ansible test -a "hostname"
# 如果需要一些管道操作涵妥,則使用shell
[root@m01 ~]# ansible test -m shell -a "ifconfig|grep eth0" -f 50
-f =forks /etc/ansible/ansible.cfg #結(jié)果返回的數(shù)量
2.script腳本模塊
# 編寫腳本
[root@m01 ~]# mkdir -p /server/scripts
[root@m01 ~]# cat /server/scripts/yum.sh
#!/usr/bin/bash
yum install -y iftop
#在本地運(yùn)行模塊,等同于在遠(yuǎn)程執(zhí)行坡锡,不需要將腳本文件進(jìn)行推送目標(biāo)主機(jī)執(zhí)行
[root@m01 ~]# ansible test -m script -a "/server/scripts/yum.sh"
3.yum安裝軟件模塊
[root@m01 ~]# ansible test -m yum -a "name=httpd state=installed"
name #指定要安裝的軟件包名稱
state #指定使用yum的方法
installed蓬网,present #安裝軟件包
removed,absent #移除軟件包
latest #安裝最新軟件包
4.copy文件拷貝模塊
# 推送文件模塊
[root@m01 ~]# ansible test -m copy -a "src=/etc/hosts dest=/tmp/test.txt"
# 在推送覆蓋遠(yuǎn)程端文件前鹉勒,對遠(yuǎn)端已有文件進(jìn)行備份帆锋,按照時間信息備份
[root@m01 ~]# ansible test -m copy -a "src=/etc/hosts dest=/tmp/test.txt backup=yes"
# 直接向遠(yuǎn)端文件內(nèi)寫入數(shù)據(jù)信息,并且會覆蓋遠(yuǎn)端文件內(nèi)原有數(shù)據(jù)信息
[root@m01 ~]# ansible test -m copy -a "content='bgx' dest=/tmp/test"
src #推送數(shù)據(jù)的源文件信息
dest #推送數(shù)據(jù)的目標(biāo)路徑
backup #對推送傳輸過去的文件禽额,進(jìn)行備份
content #直接批量在被管理端文件中添加內(nèi)容
group #將本地文件推送到遠(yuǎn)端锯厢,指定文件屬組信息
owner #將本地文件推送到遠(yuǎn)端,指定文件屬主信息
mode #將本地文件推送到遠(yuǎn)端脯倒,指定文件權(quán)限信息
5.file文件配置模塊
[root@m01 ~]# ansible test -m file -a "path=/tmp/oldboy state=directory"
[root@m01 ~]# ansible test -m file -a "path=/tmp/tt state=touch mode=555 owner=root group=root"
[root@m01 ~]# ansible test -m file -a "src=/tmp/tt path=/tmp/tt_link state=link"
path #指定遠(yuǎn)程主機(jī)目錄或文件信息
recurse #遞歸授權(quán)
state
directory #在遠(yuǎn)端創(chuàng)建目錄
touch #在遠(yuǎn)端創(chuàng)建文件
link #link或hard表示創(chuàng)建鏈接文件
absent #表示刪除文件或目錄
mode #設(shè)置文件或目錄權(quán)限
owner #設(shè)置文件或目錄屬主信息
group #設(shè)置文件或目錄屬組信息
6.service服務(wù)模塊
[root@m01 ~]# ansible test -m service -a "name=crond state=stopped enabled=yes"
name # 定義要啟動服務(wù)的名稱
state # 指定服務(wù)狀態(tài)
started #啟動服務(wù)
stopped #停止服務(wù)
restarted #重啟服務(wù)
reloaded #重載服務(wù)
enabled #開機(jī)自啟
7.group組模塊
[root@m01 ~]# ansible test -m group -a "name=oldgirl gid=888"
name #指定創(chuàng)建的組名
gid #指定組的gid
state
absent #移除遠(yuǎn)端主機(jī)的組
present #創(chuàng)建遠(yuǎn)端主機(jī)的組(默認(rèn))
8.user模塊
#創(chuàng)建用戶指定uid和gid实辑,不創(chuàng)建家目錄也不允許登陸
[root@m01 ~]# ansible test -m user -a "name=oldgirl uid=888 group=888 shell=/sbin/nologin create_home=no"
#將明文密碼進(jìn)行hash加密,然后進(jìn)行用戶創(chuàng)建
[root@m01 ~]# ansible localhost -m debug -a "msg={{ 'bgx' | password_hash('sha512', 'salt') }}"
localhost | SUCCESS => {
"msg": "$6$salt$WP.Kb1hMfqJG7dtlBltkj4Um4rVhch54R5JCi6oP73MXzGhDWqqIY.JkSOnIsBSOeXpKglY7gUhHzY4ZtySm41"
}
[root@m01 ~]# ansible test -m user -a 'name=xlw password=$6$salt$WP.Kb1hMfqJG7dtlBltkj4Um4rVhch54R5JCi6oP73MXzGhDWqqIY.JkSOnIsBSOeXpKglY7gUhHzY4ZtySm41 create_home=yes shell=/bin/bash'
uid #指定用戶的uid
group #指定用戶組名稱
groups #指定附加組名稱
password #給用戶添加密碼
shell #指定用戶登錄shell
create_home #是否創(chuàng)建家目錄
8.crond定時任務(wù)模塊
# 正常使用crond服務(wù)
[root@m01 ~]# crontab -l
* * * * * /bin/sh /server/scripts/yum.sh
# 使用ansible添加一條定時任務(wù)
[root@m01 ~]# ansible test -m cron -a "minute=* hour=* day=* month=* weekday=* job='/bin/sh /server/scripts/test.sh'"
[root@m01 ~]# ansible test -m cron -a "job='/bin/sh /server/scripts/test.sh'"
# 設(shè)置定時任務(wù)注釋信息藻丢,防止重復(fù)剪撬,name設(shè)定
[root@m01 ~]# ansible test -m cron -a "name='cron01' job='/bin/sh /server/scripts/test.sh'"
# 刪除相應(yīng)定時任務(wù)
[root@m01 ~]# ansible test -m cron -a "name='ansible cron02' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh' state=absent"
# 注釋相應(yīng)定時任務(wù),使定時任務(wù)失效
[root@m01 scripts]# ansible test -m cron -a "name='ansible cron01' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh' disabled=no"
9.mount模塊
[root@m01 ~]# ansible test -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=present"
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=mounted"
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=unmounted"
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=absent"
present # 開機(jī)掛載悠反,僅將掛載配置寫入/etc/fstab
mounted # 掛載設(shè)備残黑,并將配置寫入/etc/fstab
unmounted # 卸載設(shè)備党瓮,不會清除/etc/fstab寫入的配置
absent # 卸載設(shè)備俗冻,會清理/etc/fstab寫入的配置
10.setup用于獲取系統(tǒng)信息的一個模塊
# 查看模塊參數(shù)
[root@m01 ~]# ansible-doc -s setup
# 查看系統(tǒng)所有信息
[root@m01 ~]# ansible 192.16 1.31-m setup
# filter 對系統(tǒng)信息進(jìn)行過濾
[root@m01 ~]# ansible 192.168.1.31 -m setup -a 'filter=ansible_all_ipv4_addresses' # 常用的過濾選項
ansible_all_ipv4_addresses 所有的ipv4地址
ansible_all_ipv6_addresses 所有的ipv6地址
ansible_architecture 系統(tǒng)的架構(gòu)
ansible_date_time 系統(tǒng)時間
ansible_default_ipv4 系統(tǒng)的默認(rèn)ipv4地址
ansible_distribution 系統(tǒng)名稱
ansible_distribution_file_variety 系統(tǒng)的家族
ansible_distribution_major_version 系統(tǒng)的版本
ansible_domain 系統(tǒng)所在的域
ansible_fqdn 系統(tǒng)的主機(jī)名
ansible_hostname 系統(tǒng)的主機(jī)名,簡寫
ansible_os_family 系統(tǒng)的家族
ansible_processor_cores cpu的核數(shù)
ansible_processor_count cpu的顆數(shù)
ansible_processor_vcpus cpu的個數(shù)
11.unarchive解壓模塊
01.解壓遠(yuǎn)程服務(wù)器的壓縮包到指定目錄
創(chuàng)建壓縮包:
cd /etc && tar zxvf /opt/sys.tar.gz etc/fstab etc/hosts
執(zhí)行命令:
[root@m01 ~]# ansible 172.16.1.31 -m unarchive -a "src=/opt/sys.tar.gz dest=/opt/ remote_src=yes"
02.把本地文件解壓到目標(biāo)機(jī)器指定目錄
創(chuàng)建命令
cd / && tar zcvf /opt/log.tar.gz var/log/messages
[root@m01 ~]# ansible 172.16.1.31 -m unarchive -a "src=/opt/log.tar.gz dest=/opt/"
12.archive壓縮模塊
01.壓縮單個文件
[root@m01 ~]# ansible 172.16.1.31 -m archive -a "path=/var/log/message dest=/tmp/log.tar.gz format=gz force_archi
13.ansible查看幫助方法
[root@m01 ~]# ansible-doc -l --- 查看所有模塊說明信息
[root@m01 ~]# ansible-doc copy --- 表示指定查看某個模塊參數(shù)用法信息