Ansible自動化運維的安裝及常用模塊詳解

Ansible作爲今年來越來越火的一款開源運維自動化工具,通過Ansible可以實現運維自動化,提高運維工程師的工作效率,減少人爲失誤。Ansible通過本身集成的非常豐富的模塊可以實現各種管理任務,其自帶模塊超過上千個。更爲重要的是,它操作簡單,但提供的功能又非常豐富,在運維領域,幾乎可以做任何事。
.
Ansible自2012年發佈以來,很快在全球流行,其特點如下:

1、Ansible基於Python開發,運維工程師對其二次開發相對比較容易
2、Ansible豐富的內置模塊,幾乎可以滿足一切要求
3、管理模式非常簡單,一條命令可以影響上千臺主機
4、無客戶端模式,底層通過SSH通信

我們可以通過四種方式和Ansible交互,我這裏只研究了其中兩種方式,應付日常工作足夠了。分別如下:

1、Ad-Hoc命令集:user直接通過Ad-Hoc命令集調用Ansible工具集來完成任務。
2、playbooks:user預先編寫好ansible playbooks,通過執行playbooks中預先編排好的任務集,按序執行任務。

1、Ansible工作集:
.
Ansible工作集包含inventory、Modules、Plugins和API,其中,inventory(清單)用來管理設備列表,可以通過分組實現,對組的調用直接影響組內的所有主機;modules是各種執行模塊,幾乎所有的管理任務都是通過模塊執行的;plugins提供了各種附加功能;API爲編程人員提供一個接口,可以基於此做Ansible的二次開發。
.
Ansible可以通過單條命令或者配置文件來對多臺主機進行控制及更改,下面將從安裝及配置依次寫出來。

2、playbook配置文件
.
playbook配置文件使用YAML語法,具有簡潔明瞭、結構清晰等特點。playbook配置文件類似於shell腳本,是一個YAML格式的文件,用於保存針對特定需求的任務列表。上面介紹的ansible命令雖然可以完成各種任務,但是當配置一些複雜任務時,逐條輸入就顯得效率非常低下了。更有效的方案是在playbook配置文件中放置所有的任務代碼,利用ansible-playbook命令執行該文件,可以實現自動化運維。YAML文件的擴展名通常爲.yaml或.yml。
.
Ansible的安裝及配置
.
環境如下:
Ansible自動化運維的安裝及常用模塊詳解
一、準備工作:
1、本地yum倉庫:https://pan.baidu.com/s/1-ERCVm6QaUA4XQd_X5Kwow 提取碼: exnp 版本爲:Ansible 2.3.1.0
2、若本機聯網,可指向互聯網yum倉庫
3、默認採用TCP 22進行與客戶機進行通信,若有更改,需自行設置防火牆放行
二、安裝Ansible:

[root@ansible /]# mount /dev/sr0 /media/                   # 掛載yum倉庫
[root@ansible /]# rm -rf /etc/yum.repos.d/*               # 刪除或移走yum目錄中的其他配置文件
[root@ansible /]# vim /etc/yum.repos.d/a.repo 
[aaa]
baseurl=file:///media
gpgcheck=0
[root@ansible yum.repos.d]# yum clean all          #清除yum緩存
[[email protected]]# yum -y install ansible             #安裝Ansible
[root@ansible yum.repos.d]# ansible --version              #可以查看到此信息,說明安裝成功
ansible 2.3.1.0
  config file = /etc/ansible/ansible.cfg
           ...................

我這裏採用了互聯網yum倉庫進行安裝,即ansible 2.4.2.0。
.
安裝已經完成,但是若要正常的使用Ansible,還需要解決一個問題,就是在控制多臺主機時,若要每執行一次命令或腳本都要輸入一次對端密碼的話,顯得就很雞肋,所以還需要創建SSH免交互登錄,如下:
.
以下操作都在Ansible服務器進行:

[root@ansible ~]# ssh-keygen -t rsa             #在Ansible服務器生成密鑰對,執行後默認一直按回車即可
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):         #默認按回車
Enter passphrase (empty for no passphrase):             #默認按回車
Enter same passphrase again:                        #默認按回車
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:                                           #默認按回車
SHA256:zhd2++KvByxFPE4ZKmDdmTHp6cjsuIEz5M26QrkBfes root@ansible
The key's randomart image is:                     #默認按回車
+---[RSA 2048]----+
|      o. .o*.o   |
|     . .. =o*    |
| .      ...= .   |
|. . .    .o o    |
| . o.. oSooo.    |
|  +o.+ o+.ooo.   |
| . += +oo ....   |
|  o E+....  ...  |
|   .o...   .o=o  |
+----[SHA256]-----+
#至此密鑰對已經生成了,隱藏存在當前用戶的宿主目錄下。
[root@ansible ~]# ls -a | grep ssh        #查看
.ssh
[root@ansible ~]# cd .ssh
[root@ansible .ssh]# ls       #查看.ssh目錄下的文件,有公鑰和私鑰
id_rsa  id_rsa.pub  known_hosts
[root@ansible ~]# ssh-copy-id [email protected]            #複製公鑰到主機192.168.1.20
[email protected]'s password:              #輸入主機1.20的root用戶密碼
[root@ansible ~]# ssh-copy-id [email protected]            #複製公鑰到主機192.168.1.30
[email protected]'s password:                 #輸入主機1.30的root用戶密碼
#在實際生產環境中,不會使用root身份,更改一下複製公鑰時指定的用戶即可。
[root@ansible ~]# ssh 192.168.1.20           #測試是否可以免密碼登錄
Last login: Tue Jul 23 08:11:39 2019 from 192.168.1.88
[root@server1 ~]# exit              #退出192.168.1.2的shell環境
[root@ansible ~]# ssh 192.168.1.30                #測試是否可以免密碼登錄
Last login: Tue Jul 23 08:43:16 2019 from 192.168.1.88
[root@server 2 ~]# exit           #退出192.168.1.3的shell環境

三、Ansible配置:
inventory是Ansible管理主機信息的配置文件,相當於系統的hosts文件功能,默認存放在/etc/ansible/hosts,在hosts文件中,通過分組來組織設備,Ansible通過inventory來定義主機和分組,若不使用默認的/etc/ansible/hosts,可以通過ansible -i 新的inventory路徑 來指定inventory,我這裏直接採用默認的路徑。
.
1、以分組的方式添加需要管理的主機:
.
正是管理之前,首先要編寫hosts文件,因爲Ansible通過將設備列表以分組的方式添加hosts文件來實現對設備的管理。hosts文件中,[ ]包含的是組名,設備列表支持域名及IP地址,默認情況下,通過訪問22端口(SSH)來管理設備,若目標主機使用了非默認的SSH端口,還可以在主機名稱之後使用冒號加端口號標明,以行爲分隔單位,也支持通配符。
.

[root@ansible ~]# vim /etc/ansible/hosts            #編輯清單文件,在文件末尾寫入以下內容
                .....................             #省略部分內容   
[web]              #定義一個名爲web的分組,下面是web組中的主機
192.168.1.20
192.168.1.30
[test01]            #定義一個名爲test01的分組,下面是test01組中的主機
www.test.com:222         #若目標主機使用了非默認的SSH端口,可以在域名後面加端口號來指定
www[2:5].test.com       #[2:5]表示2~5之間的所有數字,如www2.test.com、www3.test.com .......的所有主機
192.168.1.4:66               #IP地址後面也可以指定非默認的端口號
#將需要管理的主機寫入後,保存退出即可。注意,該文件中包含一個隱含的分組“all”,表示所有主機。

.
配置完成後,可以針對hosts定義的組進行遠程操作,也可以針對組中所指定的某一個或者多個主機操作,如下:

[root@ansible ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.1.20"
#查看web組中的192.168.1.20主機httpd服務的狀態
192.168.1.20 | FAILED | rc=3 >>
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd. preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd(8)
           man:apachectl(8)non-zero return code
#也可以這樣:
[root@ansible ~]# ansible 192.168.1.20 -m command -a "systemctl status httpd"
192.168.1.20 | FAILED | rc=3 >>
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd. preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd(8)
           man:apachectl(8)non-zero return code
[root@ansible ~]# ansible 192.168.1.* -m command -a "systemctl status httpd"
#查詢192.168.1.0這個網段所有主機的httpd服務狀態
192.168.1.20 | FAILED | rc=3 >>
     .................
192.168.1.30 | FAILED | rc=3 >>
     .................

四、Ansible命令:

[root@ansible ~]#ansible   #輸入ansible後,連續按兩下tab鍵,可以查看ansible所有相關命令
ansible               ansible-doc           ansible-playbook-2
ansible-2             ansible-doc-2         ansible-playbook-2.7
ansible-2.7           ansible-doc-2.7       ansible-pull
                ..........................

命令1、ansible:
.
ansible是生產環境中使用非常頻繁的命令之一,主要應用在以下場景:
.

  • 臨時性的維護,沒有規律,臨時需要做的任務,也稱爲非固化需求。
  • 臨時一次性操作。
  • 二次開發接口調用。

    ansible可用的選項如下:

    • -v:輸出詳細的執行過程信息,可以得到執行過程所有的信息。
    • -i PATH:指定inventory信息,默認爲/etc/ansible/hosts。
    • -f:併發線程數,默認爲5個線程。
    • --private-key=PRIVATE_KEY_FILE:指定密鑰文件。
    • -m:指定執行使用的模塊。
    • -M:指定模塊的存放路徑,默認爲/usr/share/ansible,也可以通過ANSIBLE_LIBRARY來設定默認路徑。
    • -a:指定模塊參數。
    • -u:指定遠程主機以哪個用戶運行命令。
    • -l:限制運行主機,等同於“--limit”。
    • --list-hosts:列出符合條件的主機列表,不執行任何命令。

用法示例1(需要提前在/etc/ansible/hosts文件中定義web組):

[root@ansible ~]# ansible all -f 5 -m ping          <!--檢查所有主機是否存活-->
192.168.1.30 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.1.20 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
<!--其中192.168.1.30和1.20是執行主機,SUCCESS表示命令執行成功,“=> {”表示返回的
結果。“changed”:false表示沒有對主機做出更改,“ping”:“pong”表示執行了ping命令的
返回結果。命令中“all”關鍵字在前面提到過,代表了/etc/ansible/hosts文件中的所有主機,
不需要在hosts文件中定義,系統中默認存在的-->

用法示例2:

[root@ansible ~]# ansible web --list                        #列出web組所有的主機列表
  hosts (2): 
    192.168.1.20
    192.168.1.30
#以上表示web中包含兩個主機,分別是1.20和1.30

用法示例3:

[root@ansible ~]# ansible web -m command -a "df -hT"        #顯示web組中主機的磁盤使用情況
192.168.1.20 | SUCCESS | rc=0 >>
文件系統                類型      容量  已用  可用 已用% 掛載點
/dev/mapper/centos-root xfs        50G  5.8G   45G   12% /
devtmpfs                devtmpfs  895M     0  895M    0% /dev
                          ............................            #省略部分

192.168.1.30 | SUCCESS | rc=0 >>
文件系統            類型      容量  已用  可用 已用% 掛載點
/dev/mapper/cl-root xfs        17G  5.5G   12G   33% /
devtmpfs            devtmpfs  897M     0  897M    0% /dev
tmpfs               tmpfs     912M   84K  912M    1% /dev/shm
                          ............................            #省略部分

ansible的返回結果非常友好,一般會用三種顏色來表示執行結果:紅色、綠色和橘yellow(那個顏色被和諧了)。其中紅色代表執行過程中有異常;橘yellow表示命令執行後目標有狀態變化;綠色表示執行成功且沒有對目標主機做修改。
命令2、ansible-doc:

ansible-doc用來查詢ansible模塊文檔的說明,類似於man命令,針對每個模塊都有詳細的用法說明及應用案例介紹。

[root@ansible ~]# ansible-doc -l | wc -l                  #列出支持的模塊
1378               #支持的模塊有1378個
[root@ansible ~]# ansible-doc ping             #查詢ping模塊的說明信息
> PING    (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)

        A trivial test module, this module always returns `pong' on
        successful contact. It does not make sense in playbooks, but
        it is useful from /usr/bin/ansible' to verify the ability to
                             ................#省略部分內容

命令3、ansible-playbook:
.
ansible-playbook是日常應用中使用率最高的命令,類似於Linux中的sh或source命令,用來執行系列任務。其工作機制是:通過讀取預先編寫好的playbook文件實現集中處理任務。ansible-playbook命令後跟yml格式的playbook文件,playbook文件存放了要執行的任務代碼,命令使用方式如下(playbook.yml文件需要提前編寫好,最好指定playbook.yml的絕對路徑):

[root@ansible ~]# ansible-playbook playbook.yml

命令4、ansible-console:
.
ansible-console是ansible爲我們提供的一款交互式工具,類似於Windows中的cmd及Linux中的shell。可以在ansible-console虛擬出來的終端上像shell一樣使用ansible內置的各種命令,這爲習慣於shell交互方式的用戶提供了良好的使用體驗,所有的操作與shell類似,而且支持tab鍵補全。具體操作如下:

[root@ansible ~]# ansible-console          #連接交互式工具
Vault password:         #ansible 2.4.2.0會提示輸入一個密碼,隨便輸入後按回車即可,不允許空值
Welcome to the ansible console.
Type help or ? to list commands.

root@all (2)[f:5]$ cd web         #切換到web組
root@web (2)[f:5]$ list     #列出組中主機
192.168.1.20
192.168.1.30
root@web (2)[f:5]$ ifconfig ens33         #查詢每個主機的網卡信息
root@web (2)[f:5]$ exit           #退出ansible-console環境

五、Ansible中自帶的模塊介紹:

1、command模塊:

command模塊在遠程主機執行命令,不支持管道,重定向等shell特性,其餘和shell類似,常用參數如下:

  • chdir:在遠程主機上運行命令前需要提前進入的目錄。
  • creates:在命令運行時創建一個文件,如果文件已經存在,則不會執行創建任務。
  • removes:在命令運行時移除一個文件,如果文件不存在,則不會執行移除任務。
  • executeble:指明運行命令的shell程序。
[root@ansible ~]# ansible all -m command -a "chdir=/home ls ./"
#在所有主機上運行“ls ./”命令,運行前切換至/home目錄下。

2、shell模塊(相當於萬能模塊,可以執行大多數命令):
.
shell模塊在遠程主機執行命令,相當於調用遠程主機的shell進程,然後在shell下打開一個子shell運行命令。和command模塊的區別是它支持shell特性,如管道符、重定向等。
.

[root@ansible ~]# ansible web -m shell -a 'echo "hello world" >> /tmp/hello.txt'
#在web組的主機上編寫一個txt文件
192.168.1.20 | SUCCESS | rc=0 >>

192.168.1.30 | SUCCESS | rc=0 >>

[root@ansible ~]# ansible web -m shell -a ' cat /tmp/hello.txt'        #查看編寫的文件
192.168.1.30 | SUCCESS | rc=0 >>
hello world

192.168.1.20 | SUCCESS | rc=0 >>
hello world

3、copy模塊:

copy模塊用於複製指定主機文件到遠程主機的位置,常見參數如下:

  • src:指出源文件路徑,可以使用相對路徑和絕對路徑。支持直接指定目錄,如果源是目錄,則目標也要是目錄。
  • dest:指出複製文件的目標目錄位置,使用絕對路徑,支持直接指定目錄。如果源是目錄,則目標也要是目錄,如果目標已經存在,則會覆蓋原有內容。
  • mode:指出複製時,目標文件的權限,可選。
  • owner:指出複製時,目標文件的屬主,可選。
  • group:指出複製時,目標文件的屬組,可選。
  • content:指出複製到目標主機上的內容,不能與src一起使用,相當於複製content指明的數據到目標文件中。
[root@ansible ~]# ansible web -m copy -a "src=/etc/hosts dest=/tmp/ mode=777 owner=nobody group=root"
#將本機的/etc/hosts文件複製到web組中的主機,並指定權限爲777,屬主爲nobody,屬組爲root。

4、hostname模塊:

hostname模塊用於管理主機名,常用參數如下:

name:指明主機名。

[root@ansible ~]# ansible 192.168.1.20 -m hostname -a "name=web1"
#將主機192.168.1.20的主機名改爲web1
192.168.1.20 | SUCCESS => {
    ansible_facts: {
        ansible_domain: , 
        ansible_fqdn: web1, 
        ansible_hostname web1 
        ansible_nodename: web1
    }, 
    changed: true
    name: web1
}
[root@server1 ~]# hostname       #在192.168.1.20主機上查看
web1
[root@server1 ~]# cat /etc/hostname                  #在192.168.1.20主機上查看
web1
#更改主機名後需重啓纔可使新的主機名生效。

5、yum模塊:

yum模塊基於yum機制,對遠程主機管理程序包,常用參數如下:

  • name:程序包的名稱,可以帶上版本號。若不指明版本,則默認安裝最新版本。
  • state=present | latest | absent:指明對程序包執行的操作,present表示安裝程序包,latest表示安裝最新版本的程序包,absent表示卸載程序包。
  • disablerepo:在用yum安裝時,臨時禁用某個倉庫的ID。
  • enablerepo:在用yum安裝時,臨時啓用某個倉庫的ID。
  • conf_file:yum運行時的配置文件,而不是使用默認的配置文件。
  • diable_gpg_check=yes | no:是否啓用完整性校驗功能。
[root@ansible ~]# ansible web -m yum -a "name=httpd state=present"       
                        <!--
在web組中的主機上安裝httpd服務,需要注意的是,管理端只是發送yum指令到被
管理端,被管理端要存在可用的yum倉庫纔可以成功安裝。
         -->

6、Service模塊:

Service模塊用來管理遠程主機上的服務的模塊,常見參數如下:

  • name:被管理的服務名稱。
  • state=started | stopped | restarted | reloaded:動作包含啓動、關閉、重啓及重新加載配置文件。
  • enabled=yes | no:表示是否設置該服務開機自啓動。
  • runlevel:如果設定了enabled開機自啓動,則要定義在那些運行目標下自動啓動,如2/3/4/5。
[root@ansible ~]# ansible web -m service -a "name=httpd state=started enabled=yes"
#啓動httpd服務,並設置爲開機自啓動。

7、user模塊:

user模塊用於管理遠程主機上的用戶賬號,常見參數如下:

  • name:必須參數,賬號名稱。
  • state=present | absent:創建或刪除賬號,present表示創建,absent表示刪除。
  • system=yes | no:是否爲系統賬戶。
  • uid:用戶UID。
  • group:用戶的基本組。
  • groups:用戶的附加組。
  • shell:默認使用的shell。
  • home:用戶的家目錄。
  • move_home=yes | no:如果設置的家目錄已經存在,是否將已存在的家目錄進行移動。
  • password:用戶的密碼。
  • comment:用戶的註釋信息。
  • remove=yes | no:當state=absent時,是否要刪除用戶的家目錄。
[root@ansible ~]# ansible web -m user -a 'name=user1 system=yes uid=501 group=root groups=sshd shell=/sbin/nologin home=/home/user1 password=user1 comment="test user"'
#創建一個名爲user1的用戶
[root@ansible ~]# ansible web -m user -a "name=user1 remove=yes state=absent"
#刪除剛纔創建的user1用戶

8、group模塊:

group模塊用於管理組,用於新建或刪除組,常用參數如下:

  • gid:指定組的gid
  • name:指定組的name
  • state=present | absent:創建或刪除
  • system=yes | no:是否爲系統組
[root@ansible ~]#  ansible web -m group -a 'name=test gid=300 state=present system=yes'
#創建gid爲300,組名爲test的系統組。
[root@ansible ~]#  ansible web -m group -a 'name=test gid=300 state=absent system=yes'
#刪除剛剛創建的組。

9、mount模塊:

mount模塊用於掛載文件系統,常用參數如下:

  • src:要掛載的設備或文件系統
  • name:指定掛載點
  • fstype:指定文件系統類型
  • ots=w | r | o :設置文件讀寫類型,可組合使用。
  • state=present | absent | mounted | unmounted:present表示只修改fstab文件中的配置,不自動創建掛載點,而且不掛載;absent表示刪除掛載點,修改fstab文件;mounted:自動創建掛載點並掛載,添加自動掛載(fstab);unmounted:只卸載,不刪除掛載點,不修改fstab文件。
[root@an..~]# ansible web -m mount -a 'name=/warrent src=/dev/cdrom fstype=iso9660 state=mounted'
#掛載iso鏡像到/warrent目錄下,並設置開機自動掛載。
[root@ansible ~]#  ansible web -m mount -a 'name=/warrent state=absent'
#卸載ISO鏡像,並刪除掛載點,刪除開機自動掛載。
[root@an..~]# ansible web -m mount -a "path=/mnt/data src=/dev/sdb1 fstype=xfs ots=wr state=mounted"
#注:mount已經使用path代替了原來的name參數,但是name參數還是可以使用的。

10、cron模塊:

cron模塊用來管理計劃任務,常用參數如下:

  • name:指定計劃任務描述,必填
  • job:要執行的任務
  • user:運行計劃任務的用戶
  • 執行時間:
  • minute:0-59,默認爲 *
  • hour:0-23,默認爲 *
  • day:1-31,默認爲 *
  • month:1-12,默認爲 *
  • weekday:1-7,默認爲 *
  • state=present | absent:present表示添加計劃任務;absent表示刪除計劃任務。
[root@ansible ~]# ansible web -m cron -a 'name=test user=root minute=*/2 job="echo test >> /tmp/warrent.txt" state=present'
#添加一個計劃任務測試一下
[root@ansible ~]# ansible web -m shell -a "crontab -l"                #查看創建的任務計劃
192.168.1.20 | SUCCESS | rc=0 >>
#Ansible: test
*/2 * * * * echo test >> /tmp/warrent.txt

192.168.1.30 | SUCCESS | rc=0 >>
#Ansible: test
*/2 * * * * echo test >> /tmp/warrent.txt

11、 script模塊:

功能:在遠程主機上執行主控端的腳本,相當於scp+shell組合。

用法如下:

[root@ansible ~]#ansible web -m script -a "/home/test.sh"

關於playbook配置文件的使用請參考:https://blog.51cto.com/14227204/2442514

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章