第一章 Ansible介紹
1.手工運維與自動化運維
1.手動運維時代
2.自動化運維
3.自動化運維帶來的好處
1.什么是Ansible
Ansible 是 python 中的一套模塊,系統(tǒng)中的一套自動化工具呜叫,只需要使用 ssh 協(xié)議連接及可用來系統(tǒng)管理空繁、自動化執(zhí)行命令等任務(wù)。
2.為什么需要Ansible朱庆?
批量管理功能:
1\. 可以實現(xiàn)批量系統(tǒng)操作配置
2\. 可以實現(xiàn)批量軟件服務(wù)部署
3\. 可以實現(xiàn)批量文件數(shù)據(jù)分發(fā)
4\. 可以實現(xiàn)批量系統(tǒng)信息收集
管理服務(wù)意義:
1\. 提高工作的效率(部署綜合架構(gòu))
2\. 提高工作準確度
3\. 減少維護的成本
4\. 減少重復性工作
安裝部署簡單:
1\. 沒有配置文件(不需要配置)
2\. 不需要啟動服務(wù)
3\. 客戶端沒有需要部署任務(wù)
3.如何學習Ansible?
1.官方文檔
2.幫助文檔
3.其他人寫好的文檔
第二章 Ansible安裝部署
Ansible的安裝部署十分簡單盛泡,只需要yum安裝就行
[root@m01 ~]# yum install ansible -y
第三章 Ansible主機清單
/etc/ansible/hosts 主機資產(chǎn)清單文件,用于定義被管理主機的認證信息娱颊, 例如 ssh 登錄用戶名傲诵、密碼以及 key相關(guān)信息。
1.主機支持主機名通配以及正則表達式箱硕,例如 web[1:3].oldboy.com 代表三臺主機
2.主機支持基于非標準的 ssh 端口拴竹,例如 web1.oldboy.com:6666
3.主機支持指定變量,可對個別主機的特殊配置颅痊,如登陸用戶殖熟,密碼
4.主機組支持指定變量[group_name:vars],同時支持嵌套組[game:children]
1.指定主機組相關(guān)配置
#主機組
[root@m01 ~]# cat /etc/ansible/hosts
[webserver]
172.16.1.31
172.16.1.41
#主機+端口+密碼
[webserver]
172.16.1.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
172.16.1.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
#對整個主機組都生效的變量
[webserver:vars]
ansible_ssh_pass='123456'
#針對所有webserver組都生效的變量
[webserver:vars]
ansible_ssh_pass='123456'
第四章 Ansible常用模塊
0.如何學習模塊
ansible官方網(wǎng)站:
https://docs.ansible.com/
模塊的應(yīng)用語法格式:
ansible 主機名稱/主機組名稱/主機地址信息/all -m(指定應(yīng)用的模塊信息) 模塊名稱 -a(指定動作信息) "執(zhí)行什么動作"
1.ping
應(yīng)用場景:
測試主機和ansible之間的連通性
舉例:
對webserver主機組測試是否連通
ansible webserver -m ping
2.command 簡單模塊
應(yīng)用場景:
類似shell,但是只能執(zhí)行簡單的命令斑响,復雜的命令和有些符號并不能識別菱属,用的比較少
01.查看主機名,可以執(zhí)行成功
[root@m01 ~]# ansible webserver -m ping
172.16.1.41 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.16.1.31 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
02.使用awk拼接查看主機IP執(zhí)行失敗
[root@m01 ~]# ansible webserver -m command -a "ifconfig eth0|grep 10"
172.16.1.31 | FAILED | rc=255 >>
SIOCSIFADDR: 沒有那個設(shè)備
eth0|grep: ERROR while getting interface flags: 沒有那個設(shè)備non-zero return code
172.16.1.41 | FAILED | rc=255 >>
SIOCSIFADDR: 沒有那個設(shè)備
eth0|grep: ERROR while getting interface flags: 沒有那個設(shè)備non-zero return code
3.shell 萬能模塊
萬能模塊舰罚,所有命令都可以執(zhí)行纽门,和本地執(zhí)行效果一樣
01.使用管道查詢IP地址
[root@m01 ~]# ansible webserver -m shell -a "ifconfig eth0|grep 10.0.1"
172.16.1.41 | CHANGED | rc=0 >>
inet 10.0.1.41 netmask 255.255.255.0 broadcast 10.0.1.255
172.16.1.31 | CHANGED | rc=0 >>
inet 10.0.1.31 netmask 255.255.255.0 broadcast 10.0.1.255
02.批量執(zhí)行腳本
在其他主機上創(chuàng)建一個腳本,內(nèi)容為打印主機名
cat > echo.sh << EOF
#!/bin/bash
echo "$(hostname)"
EOF
然后使用ansible的shell模塊批量執(zhí)行
[root@m01 ~]# ansible webserver -m shell -a "/bin/bash /root/echo.sh"
172.16.1.41 | CHANGED | rc=0 >>
backup
172.16.1.31 | CHANGED | rc=0 >>
nfs01
4.copy 拷貝文件
01.拷貝m01的hostsname文件到其他主機的/opt目錄下
[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=/etc/hostname dest=/opt"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "f434396716e2c9aed47cfde87c491cce5a2c08fa",
"dest": "/opt/hostname",
"gid": 0,
"group": "root",
"md5sum": "318d7defb693a2eb0d4f1a7a96575a57",
"mode": "0644",
"owner": "root",
"size": 4,
"src": "/root/.ansible/tmp/ansible-tmp-1563780990.63-144254987732501/source",
"state": "file",
"uid": 0
}
02.在傳輸文件時修改文件屬主和屬組信息
ansible 172.16.1.31 -m copy -a "src=/root/rsync.password dest=/etc/ owner=oldboy group=oldboy"
03.在傳輸文件時修改文件的權(quán)限信息
ansible 172.16.1.31 -m copy -a "src=/root/rsync.password dest=/etc/ mode=0600"
04.創(chuàng)建文件并直接寫入內(nèi)容
ansible 172.16.1.31 -m copy -a "content='oldboy' dest=/etc/rsync.password mode=0600"
05.復制目錄
src后面目錄沒有/: 將目錄本身以及目錄下面的內(nèi)容都進行遠程傳輸復制
ansible 172.16.1.31 -m copy -a "src=/data dest=/data"
src后面目錄有/: 只將目錄下面的內(nèi)容都進行遠程傳輸復制
ansible 172.16.1.31 -m copy -a "src=/data/ dest=/data"
參數(shù)說明:
src #推送數(shù)據(jù)的源文件信息
dest #推送數(shù)據(jù)的目標路徑
backup #對推送傳輸過去的文件营罢,進行備份
content #直接批量在被管理端文件中添加內(nèi)容
group #將本地文件推送到遠端赏陵,指定文件屬組信息
owner #將本地文件推送到遠端,指定文件屬主信息
mode #將本地文件推送到遠端饲漾,指定文件權(quán)限信息
5.file 設(shè)置文件屬性
01.創(chuàng)建文件夾
ansible oldboy -m file -a "path=/root/oldboy state=directory"
02.創(chuàng)建文件并更改屬性
ansible oldboy -m file -a "path=/root/test.txt state=touch mode=777 owner=root group=root"
03.創(chuàng)建軟鏈接
ansible oldboy -m file -a "src=/root/abc path=/root/abc_link state=link"
參數(shù)說明:
path #指定遠程主機目錄或文件信息
recurse #遞歸授權(quán)
state
directory #在遠端創(chuàng)建目錄
touch #在遠端創(chuàng)建文件
link #link 或 hard 表示創(chuàng)建鏈接文件
absent #表示刪除文件或目錄
mode #設(shè)置文件或目錄權(quán)限
owner #設(shè)置文件或目錄屬主信息
group #設(shè)置文件或目錄屬組信息
6.script模塊
# 編寫腳本
[root@m01 ~]# mkdir -p /server/scripts
[root@m01 ~]# cat /server/scripts/yum.sh
#!/usr/bin/bash
yum install -y iftop
#在本地運行模塊蝙搔,等同于在遠程執(zhí)行,不需要將腳本文件進行推送目標主機執(zhí)行
[root@m01 ~]# ansible oldboy -m script -a "/server/scripts/yum.sh"
7.cron
01.創(chuàng)建一條定時任務(wù)
ansible oldboy -m cron -a "minute=* hour=* day=* month=* weekday=* job='/bin/sh
/server/scripts/test.sh'"
02.添加定時任務(wù)注釋信息考传,防止重復
ansible oldboy -m cron -a "name='cron01' job='/bin/sh /server/scripts/test.sh'"
03.刪除相應(yīng)定時任務(wù)
ansible oldboy -m cron -a "name='ansible cron02' minute=0 hour=0 job='/bin/sh
/server/scripts/test.sh' state=absent"
04.注釋相應(yīng)定時任務(wù)吃型,使定時任務(wù)失效
ansible oldboy -m cron -a "name='ansible cron01' minute=0 hour=0 job='/bin/sh
/server/scripts/test.sh' disabled=no"
8.user
01.創(chuàng)建用戶指定uid,gid,不創(chuàng)建家目錄也不允許登陸
ansible oldboy -m user -a "name=oldgirl uid=888 group=888 shell=/sbin/nologin
create_home=no"
參數(shù)說明:
uid #指定用戶的 uid
group #指定用戶組名稱
groups #指定附加組名稱
password #給用戶添加密碼
shell #指定用戶登錄 shell
create_home #是否創(chuàng)建家目錄
9.group
01.創(chuàng)建用戶組
ansible oldboy -m group -a "name=oldzhang gid=888 state=present"
參數(shù)說明:
name #指定創(chuàng)建的組名
gid #指定組的 gid
state
absent #移除遠端主機的組
present #創(chuàng)建遠端主機的組(默認)
10.yum
ansible oldboy -m yum -a "name=httpd state=installed"
參數(shù)說明:
name #指定要安裝的軟件包名稱
state #指定使用 yum 的方法
installed僚楞, present #安裝軟件包
removed勤晚, absent #移除軟件包
latest #安裝最新軟件包
11.service
ansible oldboy -m service -a "name=nfs state=stopped enabled=yes"
參數(shù)說明:
name # 定義要啟動服務(wù)的名稱
state # 指定服務(wù)狀態(tài)
started #啟動服務(wù)
stopped #停止服務(wù)
restarted #重啟服務(wù)
reloaded #重載服務(wù)
enabled #開機自啟
12.mount
ansible oldboy -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults
state=present"
ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults
state=mounted"
web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults
state=unmounted"
web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults
state=absent"
狀態(tài)解釋
present # 開機掛載枉层,僅將掛載配置寫入/etc/fstab
mounted # 掛載設(shè)備,并將配置寫入/etc/fstab
unmounted # 卸載設(shè)備赐写,不會清除/etc/fstab 寫入的配置
absent # 卸載設(shè)備鸟蜡,會清理/etc/fstab 寫入的配置
13.unarchive
01.解壓遠程服務(wù)器的壓縮包到指定目錄
創(chuàng)建壓縮包:
cd /etc && tar zxvf /opt/sys.tar.gz etc/fstab etc/hosts
執(zhí)行命令:
ansible 172.16.1.31 -m unarchive -a "src=/opt/sys.tar.gz dest=/opt/ remote_src=yes"
02.把本地文件解壓到目標機器指定目錄
創(chuàng)建命令
cd / && tar zcvf /opt/log.tar.gz var/log/messages
ansible 172.16.1.31 -m unarchive -a "src=/opt/log.tar.gz dest=/opt/"
14.archive
01.壓縮單個文件
ansible 172.16.1.31 -m archive -a "path=/var/log/message dest=/tmp/log.tar.gz format=gz force_archive=true"
15.setup 獲取主機信息
01.直接執(zhí)行獲取主機信息
ansible 172.16.1.31 -m setup
02.只將主機某個信息打印出來
[root@m01 /server/scripts/test]# ansible 172.16.1.41 -m setup -a "filter=ansible_all_ipv4_addresses"
172.16.1.41 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.16.1.41",
"10.0.1.41"
],
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
16.查看幫助
ansible-doc -l
ansible-doc copy
第六章 Ansible輸出信息顏色解釋
01\. 綠色信息: 查看主機信息/對主機未做改動
02\. 黃色信息: 對主機數(shù)據(jù)信息做了修改
03\. 紅色信息: 命令執(zhí)行出錯了
04\. 粉色信息: 忠告信息
05\. 藍色信息: 顯示ansible命令執(zhí)行的過程