這里使用四台Ubuntu18.04主機(一台充當Ansible管理端服務器,另外三台充當Ansible被管理端服務器),Ansible用apt安裝,版本為2.9.10,下表是它們所使用的操作系統以及IP地址。
四台Ubuntu18.04主機所使用的操作系統以及IP地址 |
||
主機名稱 | 操作系統 | IP地址 |
Ansible管理端服務器 | Ubuntu18.04 | 192.168.0.132 |
Ansible被管理端服務器 | Ubuntu18.04 | 192.168.0.133 |
Ansible被管理端服務器 | Ubuntu18.04 | 192.168.0.134 |
Ansible被管理端服務器 | Ubuntu18.04 | 192.168.0.135 |
Ansible官網文檔:https://docs.ansible.com
Ansible服務特點說明:
(1)管理端不需要啟動服務程序(no server)
(2)管理端不需要編寫配置文件(/etc/ansible/ansible.cfg)
(3)受控端不需要安裝軟件程序(libselinux-python)
被管理端selinux服務沒有關閉 --- 影響ansible軟件的管理
libselinux-python讓selinux開啟的狀態也可以使用ansible程序
(4)受控端不需要啟動服務程序(no agent)
(5)服務程序管理操作模塊眾多(module)
(6)利用劇本編寫來實現自動化(playbook)
提示:以下操作均在root用戶下進行,如在普通用戶,請自行加上sudo!
查看系統版本:
lsb_release -a
一、安裝Ansible
注意:以下操作均在Ansible管理端服務器上!
官網文檔截圖:
依次執行以下命令,安裝ansible:
apt update
apt install software-properties-common
apt-add-repository --yes --update ppa:ansible/ansible
apt install ansible
安裝完成后,查看ansible的版本:
ansible --version
二、創建“密鑰對”,Ansible是基於SSH遠程管理服務實現遠程主機批量管理的
注意:這里使用的是root用戶,Ubuntu18.04默認root用戶沒有密碼,並且不能使用SSH遠程,(需要設置root密碼,使用命令:sudo passwd root,需要開啟root用戶SSH遠程權限,在配置文件/etc/ssh/sshd_config里加入PermitRootLogin yes配置,重啟SSH服務生效即可)
ssh-keygen(也可以使用-t選項指定秘鑰的類型,如:ssh-keygen -t rsa或ssh-keygen -t dsa)
三、使用腳本將公鑰批量分發至Ansible被管理端服務器
思考,批量分發公鑰時有兩個問題:
1、需要輸入連接確認信息 yes/no
2、需要第一次連接輸入密碼
解決方法:
1、使用-o StrictHostKeyChecking=no選項,即可解決第一個問題
2、使用sshpass即可解決第二個問題,sshpass用於非交互的ssh密碼驗證,使用-p參數指定明文密碼,然后直接登錄遠程服務器。
安裝sshpass命令,apt install sshpass
實現腳本:
for i in `seq 3 5`; do sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.0.13$i "-o StrictHostKeyChecking=no"; done
查看軟件安裝到系統里面的文件目錄信息
dpkg -L ansible|egrep -v "^/usr/(share|lib)"
說明:
/etc/ansible/ansible.cfg # ansible服務配置文件
/etc/ansible/hosts # 主機清單文件,定義可以管理的主機信息
/etc/ansible/roles # 角色配置文件
四、配置主機清單文件,並測試是否可以管理多個主機
打開配置文件:vim /etc/ansible/hosts
在配置文件最后,輸入所有Ansible被管理端服務器的IP地址
保存退出后,進行測試基於秘鑰的SSH是否連接正常
執行下面的命令,查看Ansible被管理端服務器的主機名:
ansible all -a "hostname"
可以看到被管理端服務器主機名分別為:ceph3、ceph4、ceph2
五、Ansible模塊的應用
模塊的應用語法格式:
ansible 主機名稱/主機組名稱/主機地址信息/all -m(指定應用的模塊信息) 模塊名稱 -a(指定動作信息) "執行什么動作"
命令類型模塊
1、command模塊(官方文檔:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module)
簡單用法:
查看所有在主機清單配置文件里主機的主機名
ansible all -m command -a "hostname"(command也是個Ansible默認模塊,-m command可以不寫)
擴展應用
官方截圖:
(1)參數:chdir,在執行命令之前對目錄進行切換
以下命令意思是:在所有被管理端服務器的tmp目錄下創建demo.txt文件
ansible all -m command -a "chdir=/tmp touch demo.txt"
可以看到有條警告信息,如果不想再看到,根據說明進入Ansible配置文件:vim /etc/ansible/ansible.cfg,去掉command_warnings = False(188行)配置前的#即可,注意要頂格。
(2)參數:creates,如果文件存在了,不執行命令操作
以下命令意思是:如果被管理端服務器/tmp目錄下沒有hosts文件(注意:如果不加chdir=/tmp,默認會將文件創建到家目錄下),則創建demo123.txt文件
ansible all -m command -a "creates=/tmp/hosts chdir=/tmp touch demo123.txt"
(3)參數:removes,如果文件存在了, 這個步驟將執行
以下命令意思是:如果被管理端服務器/tmp目錄下有hosts文件(注意:如果不加chdir=/tmp,默認會將文件創建到家目錄下),則創建demo456.txt文件
ansible all -m command -a "removes=/tmp/hosts chdir=/tmp touch demo456.txt"
注意事項:command模塊有些符號信息無法識別,如:"<",">","|",";","&"
2、shell模塊(官方文檔:https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module)
shell模塊參數功能和command模塊類似
簡單用法:
查看所有在主機清單配置文件里主機的主機名
ansible all -m shell -a "hostname"
shell模塊被稱為萬能模塊,command模塊能干的不能干的它都能干
ansible all -m shell -a "chdir=/tmp touch demo.txt"
ansible all -m shell -a "creates=/tmp/hosts chdir=/tmp touch demo123.txt"
ansible all -m shell -a "removes=/tmp/hosts chdir=/tmp touch demo456.txt"
shell模塊,這些"<",">","|",";","&"符合都可以識別:
ansible all -m shell -a "echo 123 >> /tmp/hosts.bak"
ansible all -m shell -a "grep 192 /etc/hosts"
3、script模塊(官方文檔:https://docs.ansible.com/ansible/latest/modules/script_module.html#script-module)
scripts模塊參數功能也和command模塊類似
新建demo.sh文件,寫入以下腳本,腳本內容是計算1到100的累加和並將結果重定向到tmp目錄的sum.txt文件:
vim /root/demo.sh
#!/bin/bash sum=0
for i in `seq 1 100` do
sum=$[$i+$sum] done
echo $sum > /tmp/sum.txt
保存退出后,執行以下命令,命令意思是:在所有被管理端服務器執行demo.sh腳本
ansible all -m script -a "/root/demo.sh"
文件類型模塊
1、copy模塊,批量分發文件(官方文檔:https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module)
以下命令意思是:將管理端服務器/root目錄下的demo.sh文件批量分發至所有被管理端服務器/tmp目錄下
ansible all -m copy -a "src=/root/demo.sh dest=/tmp/"
擴展用法:
(1)在傳輸文件時修改文件的屬主和屬組信息,注意:指定的屬主和屬組必須在被管理端服務器存在,否則會報錯
ansible all -m copy -a "src=/root/demo.sh dest=/tmp/ owner=zhangsan group=zhangsan"
(2)在傳輸文件時修改文件的權限信息
ansible all -m copy -a "src=/root/demo.sh dest=/tmp/ mode=777"
(3)在傳輸數據文件信息時對遠程主機源文件進行備份,注意:文件必須有改動后再次傳輸才會備份,被管理端服務器的文件備份名類似這樣,demo.sh.8328.2020-06-20@03:51:21~
ansible all -m copy -a "src=/root/demo.sh dest=/tmp/ backup=yes"
(4)創建一個文件並直接編輯文件的信息
ansible all -m copy -a "content='123456' dest=/tmp/rsync.password"
復制文件時加不加“/”的區別:
ansible all -m copy -a "src=/tmp dest=/tmp/"
src后面目錄沒有/:將目錄本身以及目錄下面的內容都進行遠程傳輸復制
ansible all -m copy -a "src=/tmp/ dest=/tmp/"
src后面目錄有/:只將目錄下面的內容都進行遠程傳輸復制
2、file模塊,設置文件屬性信息(官方文檔:https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module)
基本用法:
ansible all -m file -a "dest=/tmp/demo.sh owner=zhangsan group=zhangsan mode=666"
擴展用法:
可以利用模塊創建數據信息 (文件 目錄 鏈接文件)
state 參數
=absent # 缺席/刪除數據信息
=directory # 創建一個目錄信息
=file # 檢查創建的數據信息是否存在,綠色存在,紅色不存在
=hard # 創建一個硬鏈接文件
=link # 創建一個軟鏈接文件
=touch # 創建一個文件信息
創建目錄信息:
ansible all -m file -a "dest=/tmp/demo/ state=directory"
ansible all -m file -a "dest=/tmp/demo/demo01/demo02 state=directory"
創建文件信息:
ansible all -m file -a "dest=/tmp/demo.py state=touch"
創建鏈接文件信息:
ansible all -m file -a "src=/tmp/demo.txt dest=/tmp/demo_hard.txt state=hard"
ansible all -m file -a "src=/tmp/demo.txt dest=/tmp/demo_link.txt state=link"
在被管理端服務器上驗證是否為硬鏈接,也就是查看inode索引節點編號是否相同,相同即為硬鏈接:ll -i /tmp/demo_hard.txt /tmp/demo.txt
可以利用模塊刪除數據信息
ansible all -m file -a "dest=/tmp/demo.txt state=absent"
ansible all -m file -a "dest=/tmp/demo/ state=absent"
3、 fetch模塊,批量拉取數據(官方文檔:https://docs.ansible.com/ansible/latest/modules/fetch_module.html#fetch-module)
以下命令意思是:將所有被管理端服務器/tmp目錄下的demo.txt文件批量拉取到管理端服務器的/tmp目錄下
ansible all -m fetch -a "src=/tmp/demo.txt dest=/tmp"
拉取成功后的目錄,默認以主機IP命名
包類型模塊
1、apt模塊(官方文檔:https://docs.ansible.com/ansible/latest/modules/apt_module.html#apt-module)
批量安裝apache2 :
ansible all -m apt -a "name=apache2 state=present"
ansible all -m apt -a "name=apache2 state=latest"
批量卸載apache2 :
ansible all -m apt -a "name=apache2 state=absent"
說明:
name # 指定安裝軟件名稱
state # 指定是否安裝軟件
absent # 卸載
build-dep
latest # 安裝最新版本
present(默認)
fixed
系統類型模塊
1、service模塊,被管理端服務器上服務的運行狀態,停止,開啟,重啟(官方文檔:https://docs.ansible.com/ansible/latest/modules/service_module.html#service-module)
批量停止apache2服務,並禁止開機自啟動
ansible all -m service -a "name=apache2 state=stopped enabled=no"
說明:
name # 指定管理的服務名稱
state # 指定服務狀態
reloaded # 重新加載
restarted # 重新啟動
started # 啟動
stopped # 停止
enabled # 指定服務是否開機自啟動
2、cron模塊,批量設置多個主機的定時任務信息(官方文檔:https://docs.ansible.com/ansible/latest/modules/cron_module.html#cron-module)
基本用法:
ansible all -m cron -a "minute=0 hour=2 job='sync && echo 3 > /proc/sys/vm/drop_caches >/dev/null 2>&1'"
說明:
* * * * * 定時任務動作
分 時 日 月 周
ansible-doc -s cron # 查看使用說明
minute # 設置分鍾信息
hour # 設置小時信息
day # 設置日期信息
month # 設置月份信息
weekday # 設置周信息
job # 用於定義定時任務需要干的事情
擴展用法:
(1)給定時任務設置注釋信息
ansible all -m cron -a "name='time sync' minute=0 hour=2 job='sync && echo 3 > /proc/sys/vm/drop_caches >/dev/null 2>&1'"
(3)批量注釋定時任務,disabled=yes為注釋,disabled=no為取消注釋
ansible all -m cron -a "name='time sync' minute=0 hour=2 job='sync && echo 3 > /proc/sys/vm/drop_caches >/dev/null 2>&1' disabled=yes"
(2)刪除指定定時任務
ansible all -m cron -a "name='time sync' state=absent"
注意:ansible可以刪除的定時任務,只能是ansible設置好的定時任務
3、mount模塊,批量進行掛載操作(官方文檔:https://docs.ansible.com/ansible/latest/modules/mount_module.html#mount-module)
基本用法:
ansible all -m mount -a "src=192.168.0.130:/data path=/mnt fstype=nfs state=mounted"
參數:
src:需要掛載的存儲設備或文件信息
path:指定目標掛載點目錄
fstype:指定掛載時的文件系統類型
state
present/mounted # 進行掛載
present:不會實現立即掛載,修改fstab文件,實現開機自動掛載
mounted:會實現立即掛載,並且會修改fstab文件,實現開機自動掛載 *****
absent/unmounted # 進行卸載
absent:會實現立即卸載,並且會刪除fstab文件信息,禁止開機自動掛載
unmounted:會實現立即卸載,但是不會刪除fstab文件信息 *****
4、user模塊,實現批量創建用戶(官方文檔:https://docs.ansible.com/ansible/latest/modules/user_module.html#user-module)
基本用法:
ansible all -m user -a "name=wangwu"
擴展用法:
(1)指定用戶uid信息
ansible all -m user -a "name=wangwu01 uid=6666"
(2)指定用戶組信息,group為指定主要組,groups為指定次要組
ansible all -m user -a "name=wangwu02 group=wangwu01"
ansible all -m user -a "name=wangwu03 groups=wangwu01"
(3)批量創建虛擬用戶,create_home=no為不創建家目錄
ansible all -m user -a "name=wangwu04 create_home=no shell=/sbin/nologin"
(4)給指定用戶創建密碼
ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}"
ansible all -i localhost, -m debug -a "msg={{ '密碼信息' | password_hash('sha512', '加密校驗信息') }}"
ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'abcdefg') }}"
ansible all -m user -a 'name=wangwu05 password=$6$abcdefg$SVqgF31LWsg8o0zQyy63h/NIcgk3RP516ZKxuWJasoxHYEkq0YWf.WgIhFz5uK19zJrEK61oiA.TFD5ROrPxH0'
六、Ansible劇本的編寫方法
學習Ansible劇本編寫前,需要先了解下YAML,YAML是專門用來寫配置文件的語言,非常簡潔和強大,遠比JSON格式方便。
YAML入門教程:https://www.runoob.com/w3cnote/yaml-intro.html
如何執行劇本:
第一個步驟:檢查劇本的語法格式
ansible-playbook --syntax-check rsync_server.yaml
第二個步驟:模擬執行劇本
ansible-playbook -C rsync_server.yaml
第三個步驟:直接執行劇本
ansible-playbook rsync_server.yaml
擴展
Ansible使用過程中屏幕輸出顏色說明:
綠色信息:查看主機信息/對主機未做改動
黃色信息:對主機數據信息做了修改
紅色信息:命令執行出錯了
粉色信息:忠告信息
藍色信息:顯示ansible命令執行的過程