Ubuntu18.04下Ansible的基本使用


這里使用四台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命令執行的過程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM