Ansible自動化配置詳解
第1章 Ansible基本概述
1.1 ansible是一個配置管理系統configuration management system,
你只需要可以使用ssh訪問你的伺服器或裝置就行。
1.安裝軟體 2.配置服務
1.2 ansible能做什麼
ansible可以幫助我們完成一些批量任務,或者完成一些需要經常重複的工作。 比如:同時在100臺伺服器上安裝nfs服務,並在安裝後啟動服務。 比如:將某個檔案一次性拷貝到100臺伺服器上。 比如:每當有新伺服器加入工作環境時,你都要為新伺服器部署某個服務,也就是說你需要經常重複的完成相同的工作。 這些場景中我們都可以使用到ansible。
1.3 ansible軟體特點
1.ansible不需要單獨安裝客戶端,SSH相當於ansible客戶端。 2.ansible不需要啟動任何服務,僅需安裝對應工具即可。 3.ansible依賴大量的python模組來實現批量管理。 4.ansible配置檔案/etc/ansible/ansible.cfg 實現從管理機m01到其他機器的金鑰認證
第2章 Ansible安裝配置
2.1 ansible藉助公鑰批量管理
建立及利用非交換式工具實現批量分發公鑰與批量管理伺服器
[[email protected] ~]# ssh-keygen -t rsa [[email protected]~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected] [[email protected] ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected] [[email protected] ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
2.2 安裝ansible
[[email protected] ~]# yum install ansible -y
2.3 配置ansible
[[email protected] ~]# vim /etc/ansible/hosts [zeq] 172.16.1.31 172.16.1.41
2.4 驗證ansible
2.4.1 ansible是通過ssh埠探測通訊
[[email protected] ~]# ansible zeq -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" }
2.4.2 批量執行命令
[[email protected] ~]# ansible zeq -m command -a "df -h"
2.4.3 如果沒有給對應的主機下發公鑰,可以使用密碼的方式進行新增
172.16.1.41 ansible_ssh_user='root' ansible_ssh_pass='1' ansible_ssh_port='22'
2.5 定義主機清單
[[email protected] ~]# vim /etc/ansible/hosts [web] 172.16.1.7 [nfs] 172.16.1.31 [backup] 172.16.1.41 [zeq:children] web nfs backup
2.5.1 測試
[[email protected] ~]# ansible web --list-hosts #web hosts (1): 172.16.1.7 [[email protected] ~]# ansible nfs --list-hosts #nfs hosts (1): 172.16.1.31 [[email protected] ~]# ansible backup --list-hosts #rsync hosts (1): 172.16.1.41 [[email protected] ~]# ansible zeq --list-hosts #集中所有的小組,用於執行一些基礎的配置 hosts (3): 172.16.1.31 172.16.1.41 172.16.1.7
第3章 ansible命令語法格式及模組
1.command 執行命令 2.shell 執行命令 3.yum 安裝軟體模組 4.copy 配置模組 5.service 啟動服務模組 6.user 使用者管理 7.file 建立目錄,建立檔案,往檔案寫內容 8.cron 定時任務 9.mount 掛載
3.1 command命令模組
預設模組, 執行命令
[[email protected] ~]# ansible zeq -a "hostname"
3.2 如果需要一些管道操作,則使用shell
[[email protected] ~]# ansible zeq -m shell -a "ifconfig|grep eth0" -f 50-f =forks /etc/ansible/ansible.cfg #結果返回的數量
3.3 yum安裝模組
|
|
|
|
|
|
|
|
|
|
|
|
3.3.1 推送指令碼檔案至遠端,遠端執行指令碼檔案
[[email protected] ~]# ansible zeq -m yum -a "name=httpd state=installed"
3.4 copy模組
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3.4.1 推送檔案模組
[[email protected] ~]# ansible zeq -m copy -a "src=/etc/hosts dest=/tmp/test.txt owner=www group=www mode=0600"
3.4.2 在推送覆蓋遠端端檔案前,對遠端已有檔案進行備份,按照時間資訊備份
[[email protected] ~]# ansible zeq -m copy -a "src=/etc/hosts dest=/tmp/test.txt backup=yes"
3.4.3 直接向遠端檔案內寫入資料資訊,並且會覆蓋遠端檔案內原有資料資訊
[[email protected] ~]# ansible zeq -m copy -a "content='bgx' dest=/tmp/zeq"
3.5 service服務模組
引數 |
說明 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[[email protected] ~]# ansible zeq -m service -a "name=crond state=stopped enabled=yes"
3.6 user模組
[[email protected] ~]# echo "bgx"| openssl passwd -1 -stdin $1$1KmeCnsK$HGnBE86F/XkXufL.n6sEb.
[[email protected] ~]# ansible zeq -m user -a 'name=xlw password="$1$1KmeCnsK$HGnBE86F/XkXufL.n6sEb."'
3.7 file配置模組
引數 |
說明 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[[email protected] ~]# ansible zeq -m file -a "path=/tmp/zeq state=diretory" [[email protected] ~]# ansible zeq -m file -a "path=/tmp/tt state=touch mode=555 owner=root group=root" [[email protected] ~]# ansible zeq -m file -a "src=/tmp/tt path=/tmp/tt_link state=link"
3.8 crond模組
正常使用
crond
服務
[[email protected] ~]# crontab -l * * * * * /bin/sh /server/scripts/yum.sh
使用
ansible
新增一條定時任務
[[email protected] ~]# ansible zeq -m cron -a "minute=* hour=* day=* month=* weekday=* job='/bin/sh /server/scripts/test.sh'" [[email protected] ~]# ansible zeq -m cron -a "job='/bin/sh /server/scripts/test.sh'"
設定定時任務註釋資訊,防止重複,
name
設定
[[email protected] ~]# ansible zeq -m cron -a "name='cron01' job='/bin/sh /server/scripts/test.sh'"
刪除相應定時任務
[[email protected] ~]# ansible zeq -m cron -a "name='ansible cron02' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh' state=absent"
註釋相應定時任務,使定時任務失效
[[email protected] scripts]# ansible zeq -m cron -a "name='ansible cron01' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh' disabled=no"
3.9 mount模組
引數 |
說明 |
|
|
|
|
|
|
|
指定掛載檔案型別 |
opts |
設定掛載的引數選項資訊 |
path |
指定掛載點 |
[[email protected] ~]# ansible zeq -m mount -a "path=/backup src=10.0.0.31:/data fstype=nfs opts=defautls,noatime state=mounted"
3.10 ansible檢視幫助方法
ansible-doc -l --- 檢視所有模組說明資訊 ansible-doc copy --- 表示指定檢視某個模組引數用法資訊
第4章 ansible實戰應用
4.1 推送你的公鑰(免密登入)
[[email protected] ~]# sshpass -p1 ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
4.2 配置Ansible的主機清單
[[email protected] ~]# cat /etc/ansible/hosts [web] 172.16.1.7 172.16.1.8 [nfs] 172.16.1.31 [backup] 172.16.1.41
4.3 檢查主機是否都ok
[[email protected] ~]# ansible all -m ping epel、firewalld、selinux、ww
4.4 基礎環境:
1.所有的主機都需要安裝rsync和nfs-utils 2.所有的主機都需要準備對應的rsync客戶端的密碼檔案/etc/rsync.pass 3.所有的主機都需要建立一個uid和gid為666的www使用者 4.所有的主機都需要全網備份的指令碼,並配置好定時任務
4.4.1 安裝rsync和nfs-utils
[[email protected] ~]# ansible all -m yum -a "name=rsync,nfs-utils state=installed"
4.4.2 準備rsync的客戶端密碼檔案
[[email protected] ~]# ansible all -m copy -a "content='1' dest=/etc/rsync.pass owner=root group=root mode=600"
4.4.3 準備對應的www使用者,uid和gid都為666
[[email protected] ~]# ansible all -m group -a "name=www gid=666" [[email protected] ~]# ansible all -m user -a "name=www uid=666 group=666 create_home=no shell=/sbin/nologin"
4.4.4 從管理上拷貝對應的指令碼檔案,然後將其加入定時任務
[[email protected] ~]# ansible all -m copy -a "src=./scripts/rsync_backup_md5.sh dest=/server/scripts/ mode=755" [[email protected] ~]# ansible all -m cron -a "name='Rsync Bakcup Scripts' hour=01 minute=00 job='/bin/bash /server/scripts/rsync_backup_md5.sh &>/dev/null'" [[email protected] ~]# pwd /root [root[email protected] ~]# mkdir scripts [[email protected] ~]# cat scripts/rsync_backup_md5.sh #!/usr/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
4.4.5
指令碼編寫
1.定義變數
Host=$(hostname) Addr=$(ifconfig eth1|awk 'NR==2{print $2}') Date=$(date +%F) Dest=${Host}_${Addr}_${Date} Path=/backup
2.建立備份目錄
[ -d $Path/$Dest ] || mkdir -p $Path/$Dest
3.備份對應的檔案
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
5.推送本地資料至備份伺服器
export RSYNC_PASSWORD=1 rsync -avz $Path/ [email protected]::backup
6.本地保留最近7天的資料
find $Path/ -type d -mtime +7|xargs rm -rf
4.5 應用環境:(配置rsync服務->Backup伺服器)
1.安裝rsync 2.配置rsync,/etc/rsyncd.conf 3.建立目錄,建立虛擬使用者檔案,變更許可權 4.啟動服務,加入開機自啟動 5.配置郵箱,準備對應的指令碼
4.5.1 安裝rsync
[[email protected] ~]# ansible backup -m yum -a "name=rsync state=installed"
4.5.2 配置rsync,/etc/rsyncd.conf
[[email protected] ~]# ansible backup -m copy -a "src=./conf/rsyncd.conf dest=/etc/rsyncd.conf" [[email protected] ~]# pwd /root [[email protected] ~]# mkdir conf [[email protected] ~]# 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
4.5.3 建立目錄,變更許可權,建立虛擬使用者檔案
[[email protected] ~]# ansible backup -m file -a "path=/backup state=directory mode=755 owner=www group=www" [[email protected] ~]# ansible backup -m file -a "path=/data state=directory mode=755 owner=www group=www" [[email protected] ~]# ansible backup -m copy -a "content='rsync_backup:1' dest=/etc/rsync.password mode=600 owner=root group=root"
4.5.4 啟動服務,加入開機自啟動
[[email protected] ~]# ansible backup -m service -a "name=rsyncd state=started enabled=yes"
4.5.5 配置郵箱
配置郵箱(配發件伺服器)
yum install mailx -y set from=[email protected] 填寫自己郵箱 set smtp=smtps://smtp.qq.com:465 set smtp-auth-user=[email protected] 填寫自己郵箱 set smtp-auth-password=#填寫客戶端授權碼 set smtp-auth=login set ssl-verify=ignore set nss-config-dir=/etc/pki/nssdb/
4.5.6 準備對應的指令碼
1.定義全域性的變數
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
2.定義區域性變數
Path=/backup
Date=$(date +%F)
3.檢視flag檔案,並對該檔案進行校驗, 然後將校驗的結果儲存至result_時間
find $Path/*_${Date} -type f -name "flag"|xargs md5sum -c >$Path/result_${Date}
4.將校驗的結果傳送郵件給管理員
mail -s "Rsync Backup $Date" [email protected] <$Path/result_${Date}
5.刪除超過7天的校驗結果檔案, 刪除超過180天的備份資料檔案
find $Path/ -type f -name "result*" -mtime +7|xargs rm -f find $Path/ -type d -mtime +180|xargs rm -rf
4.6 應用環境:(配置nfs服務)
1.安裝nfs-utils 2.配置nfs-utils 3.建立對應的共享目錄,並修改許可權 4.啟動nfs
4.6.1 安裝nfs-utils
[[email protected] ~]# ansible nfs -m yum -a "name=nfs-utils state=installed"
4.6.2 配置nfs-utils
[[email protected] ~]# ansible nfs -m copy -a "content='/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)' dest=/etc/exports"
4.6.3 建立對應的共享目錄,並遞迴修改許可權
[[email protected] ~]# ansible nfs -m file -a "path=/data state=directory recurse=yes owner=www group=www mode=755"
4.6.4 啟動nfs
[[email protected] ~]# ansible nfs -m service -a "name=nfs-server state=started enabled=yes"
4.7 應用環境:(配置web服務,掛載操作)
[[email protected] ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=mounted"
4.8 驗證:
1.驗證nfs儲存是否可以用
2.驗證rsync是否能完成推送
3.backup伺服器進行校驗