人工運維時代
運維人員早期需要維護眾多的機器,因此需要執行很多重復的勞動,很多機器需要同時部署相同的服務或者是執行相同的命令,還得反復地登錄不同的機器,執行重復的動作
自動化運維時代
早期運維人員會結合ssh免密登錄,以及shell腳本來完成自動化的部署操作
系統管理員面臨的問題主要是:配置管理系統、遠程執行命令、批量安裝服務,啟停服務等等
后來也誕生了眾多的自動化運維軟件,比如 Ansible
自動化運維的好處
- 減少重復的操作,提高工作效率
- 減少了人為出錯的可能性
- ansible支持數據化管理,數據化追源,找到問題的源頭
?Ansible介紹
ansible是一個同時管理多個遠程主機的軟件,必須是任意可以通過ssh登錄的機器,因為ansible可以管理的機器,包括:
- 遠程虛擬機
- 物理機
- 本機機器
ansible通過ssh協議實現了,管理節點(安裝了ansible服務的機器)和被管理節點的通信。
只要是通過ssh協議登錄的主機,就可以完成ansible自動化部署操作
- 批量文件分發
- 批量數據復制
- 批量數據修改、刪除
- 批量自動化安裝軟件服務
- 批量服務啟動、停止
- 腳本化,自動批量服務部署
ansible特點
- 安裝部署簡單
- 管理主機便捷、支持多臺主機并行管理
- 無須安裝被管理節點的客戶端(no agent),且無需占用客戶端的其他端口,僅僅使用ssh服務即可
- 不僅僅支持python,還支持其他語言的二次開發
- 不用root用戶也可執行,降低系統權限
Ansible實踐部署
- 準備好虛擬機?
準備好3個Linux虛擬機,配置在同一個局域網內,然后設置好靜態ip地址
childA? ? ? ? 192.168.xxx.129????????????????被管理機器
childB? ? ? ??192.168.xxx.130? ? ? ? ? ? ? ? 被管理機器(配置好ssh服務,以及關閉防火墻等等)
master01? ?192.168.xxx.128? ? ? ? ? ? ? ? 管理機器(安裝了ansible的服務器)?
- 先準備ansible管理機器
#選擇yum自動化安裝(前提:已經安裝好了阿里云yum、epel源)
yum install epel-release
yum install ansible#檢查ansible軟件安裝情況,查詢配置文件和可執行命令
rpm -ql ansible | grep -E '^/etc|^/usr/bin'#檢查ansible版本
ansible --version
- 再準備ansible被管理機器
yum install epel-release libselinux-python -y
Ansible管理方式
ansible管理主機的方式有2種
- 傳統的輸入ssh密碼驗證
- 密鑰管理
配置好ansible的配置文件,添加被管理機器的ip地址,或者主機名
#主節點備份現有的配置文件
cp /etc/ansible/hosts /etc/ansible/hosts.ori#添加ansible需要管理的機器地址(節點A和節點B的ip地址)
[root@192 ansible]# vim hosts
[root@192 ansible]# tail -3 /etc/ansible/hosts
[qiujie]
192.168.xxx.129
192.168.xxx.130
ssh密碼認證方式管理機器
ansible是直接利用linux本地的ssh服務,以及一些遠程的ssh操作,一般情況下客戶端的ssh服務默認都是開啟的,無須額外管理
步驟:
①在master01機器上,執行如下命令
#在主機器上,告訴其他被管理的機器,你要執行什么命令,以及用什么用戶去執行
ansible qiujie -m command -a 'hostname' -k -u root
qiujie? ? /etc/ansible/hosts 文件中定義的主機組,還可以寫主機的ip地址,以及通配符
-m? ? ? ? 指定功能模塊,默認就是command模塊
-a? ? ? ? ?告訴模塊需要執行的參數
-k? ? ? ? ?詢問密碼驗證
-u? ? ? ? ?指定運行的用戶
運行命令之后報錯了:?
報錯原因:
使用了密碼方式登錄,在主機Host Key檢查激活情況下,sshpass不支持該用法,得在master01機器的 ~/.ssh/known_hosts 文件中,添加客戶端機器的指紋密鑰
?②手動ssh登錄,對主機進行連接,即可使用ansible命令操作了
ssh root@192.168.xxx.129
ssh root@192.168.xxx.130
連接之后,再查看? ~/.ssh/known_hosts 文件,發現
③此時可以在master01機器上,再次執行ansible命令
ansible qiujie -m command -a 'hostname' -k -u root
配置免密登錄
每次執行ansible命令的時候,都需要輸入ssh的認證密碼,也就是root密碼,如果不同的主機密碼不一樣,那你還得輸入多次才行。因此,我們可以配置如下的快捷登錄方式
- ansible自帶的密碼認證參數
#可以在 /etc/ansible/hosts文件中,定義密碼即可實現快速認證,遠程管理主機
#修改后的內容如下:
[qiujie]
192.168.186.129 ansible_user=root ansible_ssh_pass=111111
192.168.186.130 ansible_user=root ansible_ssh_pass=111111
ansible_host? ? ? ? ? ? ? ?主機地址
ansible_port? ? ? ? ? ? ? ? 端口,默認是22端口
ansible_user? ? ? ? ? ? ? ?認證的用戶
ansible_ssh_pass? ? ? ?用戶認證的密碼
執行ansible命令(這次后面?-k -u root 那段參數就不用加了,它會自動執行配置文件中設置的賬號和密碼)?
ansible qiujie -m command -a 'hostname'
- ssh密鑰方式批量管理主機
這個方式比起hosts文件的密碼參數來的更安全放心
#在master01機器上創建ssh密鑰對
ssh-keygen -f ~/.ssh/id_rsa -P "" > /dev/null 2>&1#檢查公私鑰文件
[root@master01 ~]# cd ~/.ssh/
[root@master01 .ssh]# ls
id_rsa id_rsa.pub known_hosts
編寫公鑰分發腳本
創建公鑰分發腳本mkdir /myshcd?/myshtouch ssh_key_send.shvim ssh_key_send.sh
腳本具體內容如下:?
#!/bin/bash
rm -rf ~/.ssh/id_rsa*
ssh-keygen -f ~/.ssh/id_rsa -P "" > /dev/null 2>&1
SSH_Pass=123123
Key_Path=~/.ssh/id_rsa.pub
for ip in 129 130
dosshpass -p$SSH_Pass ssh-copy-id -i $Key_Path "-o StrictHostKeyChecking=no" 192.168.xxx.$ip
done
#非交互式分發公鑰命令需要用sshpass指定SSH密碼,通過 -o StrictHostKeyChecking=no 跳過SSH確認連接信息
#執行
sh ssh_key_send.sh#然后直接使用以下命令連接childA和childB節點,這樣不需要輸入密碼
ssh -o ' StrictHostKeyChecking=no' '192.168.xxx.129'
ssh -o ' StrictHostKeyChecking=no' '192.168.xxx.130'
ansible模式
ansible實現批量化管理主機的模式,主要有2種
- ad-hoc模式:利用ansible的純命令行實現批量管理
- playbook劇本模式:利用ansible的playbook劇本實現批量管理
ansible-doc命令
列出ansible支持的所有模塊
ansible-doc -l
查看某個模塊的具體用法參數
ansible-doc -s command
Ansible模塊精講
1、command模塊
- 作用:在遠程節點上執行一個命令
chdir? ? ? ? ? ? ? ? 在執行命令之前,先通過cd進入該參數指定的目錄
creates? ? ? ? ? ? 在創建一個文件之前,判斷該文件是否存在,如果存在了則跳過前面的動作,如果不存在,則執行前面的動作
free_form? ? ? ? ?該參數可以輸入任何的系統命令,實現遠程執行和管理
removes? ? ? ? ? ?定義一個文件是否存在,如果存在則執行前面的動作,如果不存在則跳過
command模塊是ansible默認的基本模塊,也可以省略不寫,但是要注意如下的坑:
使用command模塊,不得出現shell變量,比如$name,也不得出現特殊符號,比如?> < | ; &?這些符號command模塊都不認識,如果你想用前面指定的變量、特殊符號,請使用shell模塊
- command模塊案例
?獲取所有被管理機器的負載信息
ansible qiujie -m command -a 'uptime'
讓客戶端機器,先切換到 /tmp 目錄下,然后打印當前的工作目錄
ansible qiujie -m command -a "pwd chdir=/tmp"
讓客戶端機器,判斷 /qiujie 文件是否存在,如果不存在就打印當前路徑,存在就跳過
ansible qiujie -m command -a "pwd creates=/qiujie"
讓客戶端機器,判斷/aaa目錄是否存在,如果存在就列出/aaa目錄下的所有東西,不存在就跳過
ansible qiujie -m command -a "ls /aaa removes=/aaa"
warn參數,是否提供警告信息
#執行命令,并且不提示報錯信息
ansible qiujie -m command -a "chmod 000 /etc/hosts warn=false"
shell模塊
批量查詢進程信息
ansible qiujie -m shell -a "ps -ef | grep vim"
批量在客戶端機器,創建寫入文件信息
ansible qiujie -m shell -a "echo 你真棒 > /tmp/heihei.txt"
批量執行腳本
#需要執行的這個腳本,必須在客戶端機器上存在,否則會報錯,這是shell模塊的特點
#因為還有一個專門執行腳本的script模塊1.創建文件夾
2.創建sh腳本文件,還要寫入腳本內容
3.賦予腳本可執行權限
4.執行腳本,并且忽略warning信息ansible qiujie -m shell -a "mkdir -p /server/myscripts; echo 'hostname' > /server/myscripts/hostname.sh; chmod +x /server/myscripts/hostname.sh warn=false"
script 模塊
功能:把 master01 管理機器上的腳本,遠程地傳輸到被管理的節點上執行
比起shell模塊,script模塊功能更強大,在master01機器本地有一份腳本,就可以在所有被管理節點上去運行
1.在管理節點上創建腳本
[root@master01 /]# mkdir /myscripts
[root@master01 /]# cd /myscripts
[root@master01 myscripts]# echo -e "pwd\nhostname" > /myscripts/local_hostname.sh
[root@master01 myscripts]# cat /myscripts/local_hostname.sh
pwd
hostname2.授權
[root@master01 myscripts]# chmod +x /myscripts/local_hostname.sh
遠程地批量執行腳本,并且在客戶端上不需要存在該腳本
myscripts]# ansible qiujie -m script -a "/myscripts/local_hostname.sh"
利用script模塊,可以批量讓所有被管理的機器執行腳本,且該腳本不需要在被管理的客戶端上存在