Ansible配置管理系統(tǒng)
Ansible是一個配置管理系統(tǒng)configuration management system,
你只需要可以使用ssh訪問你的服務(wù)器或設(shè)備就行。
1. 安裝軟件
2. 配置服務(wù)
第1章 Ansible能做什么
ansible可以幫助我們完成一些批量任務(wù),或者完成一些需要經(jīng)常重復(fù)的工作。
比如:同時在100臺服務(wù)器上安裝nfs服務(wù),并在安裝后啟動服務(wù)。
比如:將某個文件一次性拷貝到100臺服務(wù)器上。
比如:每當(dāng)有新服務(wù)器加入工作環(huán)境時,你都要為新服務(wù)器部署某個服務(wù),也就是說你需要經(jīng)常重復(fù)的完成相同的工作。
這些場景中我們都可以使用到ansible。
1.1 Ansible軟件特點
1.ansible不需要單獨安裝客戶端,SSH相當(dāng)于ansible客戶端。
2.ansible不需要啟動任何服務(wù),僅需安裝對應(yīng)工具即可。
3.ansible依賴大量的python模塊來實現(xiàn)批量管理。
4.ansible配置文件/etc/ansible/ansible.cfg
1.2 實現(xiàn)從管理機(jī)m01到其他機(jī)器的密鑰認(rèn)證
ansible借助公鑰批量管理
1.2.1 利用非交換式工具實現(xiàn)批量分發(fā)公鑰與批量管理服務(wù)器
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.31
[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.7
1.3配置步驟
1.3.1安裝ansible
[root@m01 ~]# yum install ansible -y
2.配置ansible
[root@m01 ~]# vim /etc/ansible/hosts
[oldboy]
172.16.1.31
172.16.1.41
3.驗證ansible
ansible是通過ssh端口探測通信
[root@m01 ~]# ansible oldboy -m ping
172.16.1.7 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.16.1.31 | SUCCESS => {
? ? "changed": false,
? ? "ping": "pong"
}
172.16.1.41 | SUCCESS => {
? ? "changed": false,
? ? "ping": "pong"
}
1.3.2 批量執(zhí)行命令
[root@m01 ~]# ansible oldboy -m command -a "df -h"
如果沒有給對應(yīng)的主機(jī)下發(fā)公鑰,可以使用密碼的方式進(jìn)行添加
172.16.1.41 ansible_ssh_user=’root’ ansible_ssh_pass=’1′ ansible_ssh_port=’22’
1.4定義主機(jī)清單
[web]
172.16.1.7
[nfs]
172.16.1.31
[backup]
172.16.1.41
[oldboy:children]
web
nfs
backup
[root@m01 ~]# ansible web --list-hosts? ? ? ? ? #web
? hosts (1):
? ? 172.16.1.7
[root@m01 ~]# ansible nfs --list-hosts? ? ? ? ? #nfs
? hosts (1):
? ? 172.16.1.31
[root@m01 ~]# ansible backup --list-hosts? ? ? #rsync
? hosts (1):
? ? 172.16.1.41
[root@m01 ~]# ansible oldboy --list-hosts? ? ? #集中所有的小組,用于執(zhí)行一些基礎(chǔ)的配置
hosts (3):
172.16.1.31
172.16.1.41
172.16.1.7
1、命令 -> 文件 = 腳本
2、模塊 -> 文件 = 劇本
模塊作用
command執(zhí)行命令
shell執(zhí)行命令(支持管道符)
yum安裝軟件模塊
copy配置模塊
service啟動服務(wù)模塊
user用戶管理
file創(chuàng)建目錄,創(chuàng)建文件,往文件寫內(nèi)容
cron定時任務(wù)
mount掛載
command命令模塊
默認(rèn)模塊, 執(zhí)行命令
[root@m01 ~]# ansible oldboy? -a "hostname"
如果需要一些管道操作,則使用shell
[root@m01 ~]# ansible oldboy -m shell -a "ifconfig|grep eth0" -f 50
-f =forks /etc/ansible/ansible.cfg #結(jié)果返回的數(shù)量
yum安裝模塊
推送腳本文件至遠(yuǎn)程,遠(yuǎn)程執(zhí)行腳本文件
[root@m01 ~]# ansible oldboy -m yum -a "name=httpd state=installed"
name? ? ---指定要安裝的軟件包名稱
state? ---指定使用yum的方法
installed,present? ---安裝軟件包
removed,absent? ? ? ---移除軟件包
latest? ? ? ? ? ? ? ---安裝最新軟件包
copy模塊
推送文件模塊
[root@m01 ~]# ansible oldboy -m copy -a "src=/etc/hosts dest=/tmp/test.txt owner=www group=www mode=0600"
在推送覆蓋遠(yuǎn)程端文件前,對遠(yuǎn)端已有文件進(jìn)行備份,按照時間信息備份
[root@m01 ~]# ansible oldboy -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 oldboy -m copy -a "content='bgx' dest=/tmp/oldboy"
copy模塊主要參數(shù)
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)限信息
force — 分為force=no或yes,如果目標(biāo)主機(jī)包含該文件,但內(nèi)容不同,設(shè)置為yes,則強(qiáng)制覆蓋,如果為no,則只有當(dāng)目標(biāo)主機(jī)的目標(biāo)位置不存在該文件時,才復(fù)制。默認(rèn)為yes
service服務(wù)模塊
[root@m01 ~]# ansible oldboy -m service -a "name=crond state=stopped enabled=yes"
主要參數(shù)
name — 定義要啟動服務(wù)的名稱
state — 指定服務(wù)狀態(tài)是停止或是運行
started — 啟動
stopped — 停止
restarted — 重啟
reloaded — 重載
enabled — 是否讓服務(wù)開啟自啟動
1.安裝?
[root@m01 ~]# ansible web -m yum -a "name=httpd state=installed"
2.配置?
[root@m01 ~]# ansible web -m copy -a "content='This is Ansible' dest=/var/www/html/index.html"?
3.啟動?
[root@m01 ~]# ansible web -m service -a "name=httpd state=started"
script模塊
編寫腳本
[root@m01 ~]# mkdir -p /server/scripts
[root@m01 ~]# cat /server/scripts/yum.sh
#!/usr/bin/bash
yum install -y iftop
在本地運行模塊,等同于在遠(yuǎn)程執(zhí)行,不需要將腳本文件進(jìn)行推送目標(biāo)主機(jī)執(zhí)行
[root@m01 ~]# ansible oldboy -m script -a “/server/scripts/yum.sh”
file配置模塊
創(chuàng)建目錄
[root@m01 ~]# ansible oldboy -m file -a “path=/tmp/oldboy state=diretory”
創(chuàng)建文件
[root@m01 ~]# ansible oldboy -m file -a “path=/tmp/tt state=touch mode=555 owner=root group=root”
[root@m01 ~]# ansible oldboy -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è)置文件或目錄屬組信息
group模塊
name — 指定創(chuàng)建的組名
gid — 指定組的gid
state
absent — 移除遠(yuǎn)端主機(jī)的組
present — 創(chuàng)建遠(yuǎn)端主機(jī)的組(默認(rèn))
創(chuàng)建組,指定gid
[root@m01 ~]# ansible oldboy -m group -a “name=oldgirl gid=888”
user模塊
uid — 指定用戶的uid
group — 指定用戶組名稱
groups — 指定附加組名稱
password — 給用戶添加密碼
shell — 指定用戶登錄shell
create_home — 是否創(chuàng)建家目錄
創(chuàng)建oldgirl,設(shè)定uid為888,并加入gid為888
[root@m01 ~]# ansible oldboy -m user -a “name=oldgirl uid=888 group=888 shell=/sbin/nologin create_home=no”
隨機(jī)生成加密字符串(-1使用MD5進(jìn)行加密 -stdin 非交互式 -salt 加密參數(shù))
[root@m01 ~]# echo “bgx” | openssl passwd -1 -stdin
固定加密字符串
[root@m01 ~]# echo “123”| openssl passwd -1 -stdin -salt ‘salt
創(chuàng)建普通用戶,并配置對應(yīng)的用戶密碼
[root@m01 ~]# echo “bgx” | openssl passwd -1 -stdin
$1$1KmeCnsK$HGnBE86F/XkXufL.n6sEb.
[root@m01 ~]# ansible oldboy -m user -a ‘name=xlw password=”$1$765yDGau$diDKPRoCIPMU6KEVEaPTZ0″‘
crond模塊
正常使用crond服務(wù)
[root@m01 ~]# crontab -l
* * * * * /bin/sh /server/scripts/yum.sh
使用ansible添加一條定時任務(wù)
[root@m01 ~]# ansible oldboy -m cron -a “minute=* hour=* day=* month=* weekday=* job=’/bin/sh /server/scripts/test.sh'”
[root@m01 ~]# ansible oldboy -m cron -a “job=’/bin/sh /server/scripts/test.sh'”
設(shè)置定時任務(wù)注釋信息,防止重復(fù),name設(shè)定
[root@m01 ~]# ansible oldboy -m cron -a “name=’cron01′ job=’/bin/sh /server/scripts/test.sh'”
刪除相應(yīng)定時任務(wù)
[root@m01 ~]# ansible oldboy -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 oldboy -m cron -a “name=’ansible cron01′ minute=0 hour=0 job=’/bin/sh /server/scripts/test.sh’ disabled=yes”
mount模塊
present —開機(jī)掛載,僅將掛載配置寫入/etc/fstab
mounted —掛載設(shè)備,并將配置寫入/etc/fstab
unmounted —卸載設(shè)備,不會清除/etc/fstab寫入的配置
absent —卸載設(shè)備,會清理/etc/fstab寫入的配置
僅將掛載的配置寫入/etc/fstab,并不會執(zhí)行掛載操作
[root@m01 ~]# ansible oldboy -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=present"
臨時掛載設(shè)備,并將掛載信息寫入/etc/fstab
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=mounted"
臨時卸載,不會清理/etc/fstab
[root@m01 ~]# ansible web -m mount -a “src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=unmounted”
卸載,不僅臨時卸載,同時會清理/etc/fstab
[root@m01 ~]# ansible web -m mount -a “src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=absent”
1.機(jī)器還原快照(firewalld、selinux、配置好倉庫)
選擇虛擬機(jī)-》快照-》恢復(fù)
2.推送你的公鑰
[root@m01 ~]# sshpass -p1 ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
3.配置Ansible的主機(jī)清單
[root@m01 ~]# cat /etc/ansible/hosts
[web]
172.16.1.7
172.16.1.8
[nfs]
172.16.1.31
[backup]
172.16.1.41
檢查主機(jī)是否都o(jì)k
[root@m01 ~]# ansible all -m ping
epel、firewalld、selinux、ww
1.基礎(chǔ)環(huán)境:
1.所有的主機(jī)都需要安裝rsync和nfs-utils
2.所有的主機(jī)都需要準(zhǔn)備對應(yīng)的rsync客戶端的密碼文件/etc/rsync.pass
3.所有的主機(jī)都需要創(chuàng)建一個uid和gid為666的www用戶
4.所有的主機(jī)都需要全網(wǎng)備份的腳本,并配置好定時任務(wù)
1.安裝rsync和nfs-utils
[root@m01 ~]# ansible all -m yum -a “name=rsync,nfs-utils state=installed”
2.準(zhǔn)備rsync的客戶端密碼文件
[root@m01 ~]# ansible all -m copy -a “content=’1′ dest=/etc/rsync.pass owner=root group=root mode=600”
3.準(zhǔn)備對應(yīng)的www用戶,uid和gid都為666
[root@m01 ~]# ansible all -m group -a “name=www gid=666”
[root@m01 ~]# ansible all -m user -a “name=www uid=666 group=666 create_home=no shell=/sbin/nologin”
4.從管理上拷貝對應(yīng)的腳本文件,然后將其加入定時任務(wù)
[root@m01 ~]# ansible all -m copy -a “src=./scripts/rsync_backup_md5.sh dest=/server/scripts/ mode=755”
[root@m01 ~]# ansible all -m cron -a “name=’Rsync Bakcup Scripts’ hour=01 minute=00 job=’/bin/bash /server/scripts/rsync_backup_md5.sh &>/dev/null'”
[root@m01 ~]# pwd
/root
[root@m01 ~]# mkdir scripts
[root@m01 ~]# cat scripts/rsync_backup_md5.sh
#!/usr/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#1.定義變量
Host=$(hostname)
Addr=$(ifconfig eth1|awk 'NR==2{print $2}')
Date=$(date +%F)
Dest=${Host}_${Addr}_${Date}
Path=/backup
#2.創(chuàng)建備份目錄
[ -d $Path/$Dest ] || mkdir -p $Path/$Dest
#3.備份對應(yīng)的文件
cd / && \
[ -f $Path/$Dest/system.tar.gz ] || tar czf $Path/$Dest/system.tar.gz etc/fstab etc/rsyncd.conf && \
[ -f $Path/$Dest/log.tar.gz ] || tar czf $Path/$Dest/log.tar.gz? var/log/messages var/log/secure && \
#4.攜帶md5驗證信息
[ -f $Path/$Dest/${Date}.flag ] || md5sum $Path/$Dest/*.tar.gz >$Path/$Dest/${Date}.flag
#4.推送本地數(shù)據(jù)至備份服務(wù)器
export RSYNC_PASSWORD=1
rsync -avz $Path/ rsync_backup@172.16.1.41::backup
#5.本地保留最近7天的數(shù)據(jù)
find $Path/ -type d -mtime +7|xargs rm -rf
2.應(yīng)用環(huán)境:(配置rsync服務(wù)->Backup服務(wù)器)
1.安裝rsync
2.配置rsync,/etc/rsyncd.conf
3.創(chuàng)建目錄,創(chuàng)建虛擬用戶文件,變更權(quán)限
4.啟動服務(wù),加入開機(jī)自啟動
5.配置郵箱,準(zhǔn)備對應(yīng)的腳本
1.安裝rsync
[root@m01 ~]# ansible backup -m yum -a "name=rsync state=installed"
2.配置rsync,/etc/rsyncd.conf
[root@m01 ~]# ansible backup -m copy -a "src=./conf/rsyncd.conf dest=/etc/rsyncd.conf"
[root@m01 ~]# pwd
/root
[root@m01 ~]# mkdir conf
[root@m01 ~]# cat conf/rsyncd.conf
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.password
log file = /var/log/rsyncd.log
#####################################
[backup]
path = /backup
[data]
path = /data
3.創(chuàng)建目錄,變更權(quán)限,創(chuàng)建虛擬用戶文件
[root@m01 ~]# ansible backup -m file -a "path=/backup state=directory mode=755 owner=www group=www"
[root@m01 ~]# ansible backup -m file -a "path=/data state=directory mode=755 owner=www group=www"
[root@m01 ~]# ansible backup -m copy -a "content='rsync_backup:1' dest=/etc/rsync.password mode=600 owner=root group=root"
4.啟動服務(wù),加入開機(jī)自啟動
[root@m01 ~]# ansible backup -m service -a "name=rsyncd state=started enabled=yes"
5.配置郵箱,準(zhǔn)備對應(yīng)的腳本
3.應(yīng)用環(huán)境:(配置nfs服務(wù))
1.安裝nfs-utils
2.配置nfs-utils
3.創(chuàng)建對應(yīng)的共享目錄,并修改權(quán)限
4.啟動nfs
1.安裝nfs-utils
[root@m01 ~]# ansible nfs -m yum -a "name=nfs-utils state=installed"
2.配置nfs-utils
[root@m01 ~]# ansible nfs -m copy -a "content='/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)' dest=/etc/exports"
3.創(chuàng)建對應(yīng)的共享目錄,并遞歸修改權(quán)限
[root@m01 ~]# ansible nfs -m file -a "path=/data state=directory recurse=yes owner=www group=www mode=755"
4.啟動nfs
[root@m01 ~]# ansible nfs -m service -a "name=nfs-server state=started enabled=yes"
4.應(yīng)用環(huán)境:(配置web服務(wù),掛載操作)
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=mounted"
驗證:
1.驗證nfs存儲是否可以用
2.驗證rsync是否能完成推送
3.backup服務(wù)器進(jìn)行校驗
4.實時同步