簡單聊一聊Ansible自動化運維

1、Ansible概述

Ansible是今年來愈來愈火的一款開源運維自動化工具,經過Ansible能夠實現運維自動化,提升運維工程師的工做效率,減小人爲失誤。Ansible經過自己集成的很是豐富的模塊能夠實現各類管理任務,其自帶模塊超過上千個。更爲重要的是,它操做很是簡單,即便小白也能夠輕鬆上手,但它提供的功能又很是豐富,在運維領域,幾乎能夠作任何事。 python

一、Ansible特色

Ansible自2012年發佈以來,很快在全球流行,其特色以下: mysql

  • Ansible基於Python開發,運維工程師對其二次開發相對比較容易; web

  • Ansible豐富的內置模塊,幾乎能夠知足一切要求; sql

  • 管理模式很是簡單,一條命令能夠影響上千臺主機; shell

  • 無客戶端模式,底層經過SSH通訊; 數據庫

  • Ansible發佈後,也陸續被AWS、Google Cloud Platform、Microsoft Azure、Cisco、HP、VMware、Twitter等大公司接納並投入使用;

2、Ansible的角色

  • 使用者:如何使用Ansible實現自動化運維? 編程

  • Ansible工具集:Ansible能夠實現的功能? json

  • 做用對象:Ansible能夠影響哪些主機?

一、使用者

以下圖所示:Ansible使用者能夠採用多種方式和Ansible交互,圖中展現了四種方式: vim

  • CMDB:CMDB存儲和管理者企業IT架構中的各項配置信息,是構建ITIL項目的核心工具,運維人員能夠組合CMDB和Ansible,經過CMDB直接下發指令調用Ansible工具集完成操做者所但願達到的目標; centos

  • PUBLIC/PRIVATE方式:Ansible除了豐富的內置模塊外,同時還提供豐富的API語言接口,如PHP、Python、PERL等多種流行語言,基於PUBLIC/PRIVATE,Ansible以API調用的方式運行;

  • Ad-Hoc命令集:Users直接經過Ad-Hoc命令集調用Ansible工具集來完成任務;

  • Playbooks:Users預先編寫好Ansible Playbooks,經過執行
    Playbooks中預先編排好的任務集,按序執行任務;
    簡單聊一聊Ansible自動化運維

二、Ansible工具集

Ansible工具集包含Inventory、Modules、Plugins和API。其中:Inventory:用來管理設備列表,能夠經過分組實現,對組的調用直接影響組內的全部主機;Modules:是各類執行模塊,幾乎全部的管理任務都是經過模塊執行的;Plugins:提供了各類附加功能;API:爲編程人員提供一個接口,能夠基於此作Ansible的二次開發;具體表現以下:

  • Ansible Playbooks:任務腳本,編排定義Ansible任務及的配置文件,由Ansible按序依次執行,一般是JSON格式的YML文件;

  • Inventory:Ansible管理主機清單;

  • Modules:Ansible執行命令功能模塊,多數爲內置的核心模塊,也可自定義;

  • Plugins:模塊功能的補充,如鏈接類型插件、循環插件、變量插件、過濾插件等,該功能不太經常使用;

  • API:供第三方程序調用的應用程序編程接口;

  • Ansible:該部分圖中表現得不太明顯,組合Inventory、API、Modules、Plugins能夠理解爲是Ansible命令工具,其爲核心執行工具;

三、做用對象

Ansible的做用對象不只僅是Linux和非Linux操做系統的主機,也能夠做用於各種PUBLIC/PRIVATE、商業和非商業設備的網絡設施。

使用者使用Ansible或Ansible-Playbooks時,在服務器終端輸入Ansible的Ad-Hoc命令集或Playbooks後,Ansible會遵循預選安排的規則將Playbooks逐步拆解爲Play,再將Play組織成Ansible能夠識別的任務,隨後調用任務涉及的全部模塊和插件,根據Inventory中定義的主機列表經過SSH將任務集以臨時文件或命令的形式傳輸到遠程客戶端執行並返回執行結果,若是是臨時文件則執行完畢後自動刪除。

3、Ansible的配置

一、Ansible安裝

Ansible的安裝部署很是簡單,以RPM安裝爲例,其依賴軟件只有Python和SSH,且系統默認均已安裝。Ansible的管理端只能是Linux,如Redhat、Debian、Centos。

1)經過YUM安裝Ansible

能夠自行從互聯網上直接下載Ansible所需軟件包,本篇博客提供安裝Ansible自動化運維工具所需的依賴軟件包,網盤連接:[https://pan.baidu.com/s/1EduwbjYwoj2Pzl9Ye14HEw
提取碼:hsvm])
若是使用本人提供的網盤連接,本身創建yum配置文件,掛載光盤這些就不說了啊,畢竟太基礎了!使用互聯網直接安裝便可(實驗環境我這裏是關閉防火牆和SELinux的)。

[root@centos01 ~]# cd /mnt/ansiblerepo/ansiblerepo/repodata/
[root@centos01 ansiblerepo]# vim /etc/yum.repos.d/local.repo
[local]
name=centos
baseurl=file:///mnt/ansiblerepo/ansiblerepo  <!--修改yum路徑-->enabled=1
gpgcheck=0
[root@centos01 ~]# yum -y install ansible                <!--安裝Ansible自動化運維工具-->

2)驗證安裝結果

[root@centos01 ~]# ansible --version    <!--若是命令能夠正常執行,則表示Ansible工具安裝成功-->ansible 2.3.1.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
  python version = 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]

3)建立SSH免交互登陸

Ansible經過SSH對設備進行管理,而SSH包含兩種認證方式:一種是經過密碼認證,另外一種是經過密鑰對驗證。前者必須和系統交互,然後者是免交互登陸。若是但願經過Ansible自動管理設備,應該配置爲免交互登陸被管理設備。若是對SSH免交互式登陸不太瞭解的朋友能夠參考博文:Centos 7.4中的遠程訪問控制裏面有詳細的介紹,這裏就不詳細介紹了!

[root@centos01 ~]# ssh-keygen -t rsa  <!--生成密鑰對-->Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):<!--密鑰對存放路徑-->Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):    
       <!--輸入私鑰保護密碼,直接按Enter鍵表示無密碼-->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:cJz6NRTrvMDxX+Jpce6LRnWI3vVEl/zvARL7D10q9WY root@centos01
The key's randomart image is:
+---[RSA 2048]----+
|          .   . .|
|       . . +   oo|
|      . = o o. oo|
|       = * o..+ *|
|      . S *.=+=*+|
|       . o =+XooE|
|        . ..=.++.|
|           ..o ..|
|           .. o. |
+----[SHA256]-----+
[root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub  root@192.168.100.20   <!--複製公鑰到遠端192.168.100.20-->[root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub  root@192.168.100.30    <!--複製公鑰到遠端192.168.100.30-->

至此,已經完成Ansible的部署,接下來就能夠經過Ansible對設備進行管理了。

二、Ansible配置

Inventory是Ansible管理主機信息的配置文件,至關於系統Hosts文件的功能,默認存放在/etc/ansible/hosts。在hosts文件中,經過分組來組織設備,Ansible經過Inventory來定義主機和分組,經過在ansible命令中使用選項-i或--inventory-file來指定Inventory。

[root@centos01 ~]# ansible -i /etc/ansible/hosts web -m ping

若是使用默認的Inventory文件(/etc/ansible/hosts),也能夠不指定Inventory文件,例如:

[root@centos01 ~]# ansible web -m ping

Ansible經過設備列表以分組的方式添加到/etc/ansible/hosts文件來實現對設備的管理,因此在正式管理以前,首先要編寫好hosts文件。hosts文件中,以[ ]包含的部分表明組名,設備列表支持主機名和IP地址。默認狀況下,經過訪問22端口(SSH)來管理設備。若目標主機使用了非默認的SSH端口,還能夠在主機名稱以後使用冒號加端口標明,以行爲單位分隔配置。另外,hosts文件還支持通配符。

[root@centos01 ~]# vim /etc/ansible/hosts
............   <!--此處省略部份內容-->[web]
192.168.100.20
192.168.100.30
[test]
www.benet.com:222                         <!--經過222端口管理設備-->[mail]
yj1.kgc.cn
yj[2:5].kgc.cn<!--[2:5]表示2~5之間的全部數字,即表示yj2.kgc.cn、yj3.kgc.cn……的全部主機-->

能夠將一個主機同時歸置在不一樣的組中。

配置完成以後,能夠針對hosts定義的組進行遠程操做,也能夠針對組中的某一個或多個主機操做。例如:

1)只對web組中192.168.1.2主機操做,經過--limit參數限定主機的變動。

[root@centos01 ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.100.20"
192.168.100.20 | SUCCESS | rc=0 >><!--看到SUCCESS就知道成功了,因此如下內容--><!--若是測試httpd服務,被測試主機必然已經安裝並啓動了httpd服務-->

2)只對192.168.100.20主機操做。經過IP限定主機的變動。

[root@centos01 ~]# ansible 192.168.100.20 -m command -a "systemctl status httpd"192.168.100.20 | SUCCESS | rc=0 >>

3)只對192.168.100.0網段主機操做,這就須要使用到通配符來限定主機的變動了。

[root@centos01 ~]# ansible 192.168.1.* -m command -a "systemctl status httpd"
192.168.100.20 | SUCCESS | rc=0 >>
.......  <!--此處省略部份內容-->192.168.100.30 | SUCCESS | rc=0 >>
.......    <!--此處省略部份內容--><!--實驗環境,效果同樣,這裏就很少說了-->

三、Ansible命令

Ansible的維護命令大多數是以ansible開頭,在終端輸入ansible後連續按兩次Tab鍵,會補全全部跟ansible相關的命令。

[root@centos01 ~]# ansible  <!--連續按Tab鍵-->ansible               ansible-console-2     ansible-galaxy        ansible-playbook-2.7  ansible-vault-2
ansible-2             ansible-console-2.7   ansible-galaxy-2      ansible-pull          ansible-vault-2.7
ansible-2.7           ansible-doc           ansible-galaxy-2.7    ansible-pull-2        
ansible-connection    ansible-doc-2         ansible-playbook      ansible-pull-2.7      
ansible-console       ansible-doc-2.7       ansible-playbook-2    ansible-vault 

1)ansible

ansible是生產環境中使用很是頻繁的命令之一,主要在如下場景使用:

  • 非固化需求;

  • 臨時一次性操做;

  • 二次開發接口調用;

非固化需求是指臨時性的維護,如查看web服務器組磁盤使用狀況、複製一個文件到其餘機器等。相似這些沒有規律的、臨時須要作的任務,咱們成爲非固化需求,臨時一次性操做,語法以下:

Ansible  <host-pattern> [options]

可用選項以下:

  • -v(--verbose):輸出詳細的執行過程信息,能夠獲得執行過程全部信息;

  • -i PATH(--inventory=PATH):指定inventory信息,默認爲/etc/ansible/hosts;

  • -f NUM(--forks=NUM):併發線程數,默認爲5個線程;

  • --private-key=PRIVATE_KEY_FILE:指定密鑰文件;

  • -m NAME,--module-name=NAME:指定執行使用的模塊;

  • -M DIRECTORY(--module-path=DIRECTORY) :指定模塊存放路徑,默認爲/usr/share/ansible;

  • -a ARGUMENTS(--args=ARGUMENTS):指定模塊參數;

  • -u USERNAME(--user=USERNAME):指定遠程主機以USERNAME運行命令;

  • -l subset(--limit=SUBSET):限制運行主機;

①檢查全部主機是否存活,執行命令以下:

[root@centos01 ~]# ansible all -f 5 -m ping                         
<!--調用ping模塊,all表示/etc/ansible/hosts文件中的全部主機,不用建立all分組(默認存在)-->192.168.100.20 | SUCCESS => {               <!--表示執行成功-->
    "changed": false,                        <!--沒有對主機作出更改-->
    "ping": "pong"                  <!--表示執行ping命令的返回結果-->}
192.168.100.30 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

②列出web組全部的主機列表,執行命令以下:

[root@centos01 ~]# ansible web --list      <!-- --list:表示列出主機列表信息-->
  hosts (2):
    192.168.100.20
    192.168.100.30

③批量顯示web組中的磁盤使用空間,執行命令以下:

[root@centos01 ~]# ansible web -m command -a "df -hT"192.168.100.30 | SUCCESS | rc=0 >>
文件系統            類型      容量  已用  可用 已用% 掛載點/dev/mapper/cl-root xfs        17G  4.4G   13G   26% /devtmpfs            devtmpfs  897M     0  897M    0% /dev
tmpfs               tmpfs     912M   84K  912M    1% /dev/shm
tmpfs               tmpfs     912M     0  912M    0% /sys/fs/cgroup
/dev/sda1           xfs      1014M  173M  842M   18% /boot
tmpfs               tmpfs     183M   16K  183M    1% /run/user/42tmpfs               tmpfs     183M     0  183M    0% /run/user/0192.168.100.20 | SUCCESS | rc=0 >>
文件系統            類型      容量  已用  可用 已用% 掛載點/dev/mapper/cl-root xfs        17G  4.3G   13G   26% /devtmpfs            devtmpfs  897M     0  897M    0% /dev
tmpfs               tmpfs     912M   84K  912M    1% /dev/shm
tmpfs               tmpfs     912M     0  912M    0% /sys/fs/cgroup
/dev/sda1           xfs      1014M  173M  842M   18% /boot
tmpfs               tmpfs     183M   16K  183M    1% /run/user/42tmpfs               tmpfs     183M     0  183M    0% /run/user/0/dev/sr0            iso9660   4.1G  4.1G     0  100% /mnt

web關鍵字須要提早在/etc/ansible/hosts文件中定義組。

Ansible的返回結果很是友好,通常會用三種顏色來表示執行結果:

  • 紅色:表示執行過程出現異常;

  • 橘黃顏色:表示命令執行後目標有狀態變化;

  • 綠色:表示執行成功且沒有目標機器作修改;

2)Ansible-doc

Ansible-doc用來查詢ansible模塊文檔的說明,相似於man命令,針對每一個模塊都有詳細的用法說明及應用案例介紹,語法以下:

ansible-doc [options] [module……]

列出支持的模塊:

[root@centos01 ~]#ansible-doc -l

查詢ping模塊的說明信息:

[root@centos01 ~]# ansible-doc 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 login and that a usable python is configured. This is NOT ICMP ping,
  this is just a trivial test module.

EXAMPLES:
# Test we can logon to 'webservers' and execute python with json lib.
ansible webservers -m ping

MAINTAINERS: Ansible Core Team, Michael DeHaan

METADATA:
        Status: ['stableinterface']
        Supported_by: core

3)Ansible-playbook

Ansible-playbook是平常應用中使用頻率最高的命令,相似於Linux中的sh或source命令,用來執行系列任務。其工做機制:經過讀取預先編寫好的playbook文件實現集中處理任務。Ansible-playbook命令後跟yml格式的playbook文件,playbook文件存放了要執行的任務代碼,命令使用方式以下:

Ansible-playbook playbook.yml<!--playbook.yml文件要提早編寫好,建議使用絕對路徑-->

4)Ansible-console

Ansible-console是Ansible爲用戶提供的一款交互式工具,相似於Windows的cmd或者是Linux中shell。用戶能夠在ansible-console虛擬出來的終端上像shell同樣使用Ansible內置的各類命令,這爲習慣於使用shell交互式方式的用戶提供了良好的使用體驗。在終端輸入ansible-console命令後,顯示以下:

[root@centos01 ~]# ansible-console
Welcome to the ansible console.
Type help or ? to list commands.      <!--輸入help或?獲取幫助-->root@all (2)[f:5]$ cd web    <!--使用cd命令切換主機或分組-->root@web (2)[f:5]$ list                  <!--列出當前的設備-->192.168.100.20
192.168.100.30<!--支持Tab鍵補全,快捷鍵Ctrl+D或Ctrl+C便可退出當前的虛擬終端-->

四、Ansible模塊

1)command模塊

command模塊在遠程主機執行命令,不支持管道、重定向等shell的特性。經常使用的參數以下:

  • chdir:在遠程主機上運行命令前要提早進入的目錄;

  • creates:在命令運行時建立一個文件,若是文件已存在,則不會執行建立任務;

  • removes:在命令運行時移除一個文件,若是文件不存在,則不會執行移除任務;

  • executeable:指明運行命令的shell程序;

在全部主機上運行「ls ./」命令,運行前切換到/home目錄下。操做以下:

[root@centos01 ~]# ansible web -m command -a "chdir=/ ls ./"

2)shell模塊

shell模塊在遠程主機執行命令,至關於調用遠程主機的Shell進程,而後在該Shell下打開一個子Shell運行命令。和command模塊的區別是它支持Shell特性:如管道、重定向等。

示例以下:

[root@centos01 ~]# ansible web -m shell -a "echo hello world "        <!--輸出到屏幕-->192.168.100.20 | SUCCESS | rc=0 >>
hello world

192.168.100.30 | SUCCESS | rc=0 >>
hello world
[root@centos01 ~]# ansible web -m shell -a "echo hello world > /1.txt"   <!--輸出到1.txt文件中-->192.168.100.20 | SUCCESS | rc=0 >>

192.168.100.30 | SUCCESS | rc=0 >>

3)copy模塊

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

  • dest:指出複製文件的目標目錄位置,使用絕對路徑。若是源是目錄,則目標也要是目錄,若是目標文件已存在,會覆蓋原有內容;

  • src:指出源文件的路徑,可使用相對路徑和絕對路徑,支持直接指定目錄。若是源是目錄,則目標也要是目錄;

  • mode:指出複製時,目標文件的權限,可選;

  • owner:指出複製時,目標文件的屬主,可選;

  • group:指出複製時目標文件的屬組,可選;

  • content:指出複製到目標主機上的內容,不能和src一塊兒使用,至關於複製content指明的數據到目標文件中;

示例以下:

[root@centos01 ~]# ansible web -m copy -a "src=/etc/hosts 
dest=/root/a1.hosts mode=777 owner=root group=root"<!--/將本機的hosts文件複製到web組中的全部主機上存放在家目錄下的a1.hosts目錄,
權限是777,屬主是root,屬組是root-->

4)hostname模塊

hostname模塊用於管理遠程主機上的主機名。經常使用的參數以下:

  • name:指明主機名;

示例以下:

[root@centos01 ~]# ansible 192.168.100.20 -m hostname -a "name=test"<!--將192.168.100.20的主機名改成test,
可是192.168.100.20須要敲一下bash才生效-->

5)yum模塊

yum模塊基於yum機制,對遠程主機管理程序包。經常使用的參數以下:

  • name:程序包名稱,能夠帶上版本號。若不指明版本,則默認爲最新版本;

  • state=present|atest|absent:指明對程序包執行的操做:present代表安裝程序包,latest表示安裝最新版本的程序包,absent表示卸載程序包;

  • disablerepo:在用yum安裝時,臨時禁用某個倉庫的ID;

  • enablerepo:在用yum安裝時,臨時啓用某個倉庫的ID;

  • conf_file:yum運行時的配置文件,而不是使用默認的配置文件;

  • disable_gpg_check=yes|no:是否啓用完整性校驗功能;

示例以下:

[root@centos01 ~]# ansible web -m shell -a "/usr/bin/rm -rf 
/etc/yum.repos.d/CentOS-*"   
          <!--批量化刪除web組主機的yum源-->[root@centos01 ~]# ansible web -m shell -a "/usr/bin/mount 
/dev/cdrom /mnt"   <!--批量化掛載光盤-->
 [WARNING]: Consider using mount module rather than running mount

192.168.100.20 | SUCCESS | rc=0 >>
mount: /dev/sr0 寫保護,將以只讀方式掛載

192.168.100.30 | SUCCESS | rc=0 >>
mount: /dev/sr0 寫保護,將以只讀方式掛載
[root@centos01 ~]# ansible web -m yum -a "name=httpd 
state=present"  <!--批量化安裝httpd程序-->[root@centos01 ~]# ansible web -m shell -a "rpm -qa | grep httpd"    <!--批量化查看安裝的httpd程序包-->
 [WARNING]: Consider using yum, dnf or zypper module rather than running rpm

192.168.100.20 | SUCCESS | rc=0 >>
httpd-2.4.6-67.el7.centos.x86_64
httpd-tools-2.4.6-67.el7.centos.x86_64

192.168.100.30 | SUCCESS | rc=0 >>
httpd-2.4.6-67.el7.centos.x86_64
httpd-tools-2.4.6-67.el7.centos.x86_64
[root@centos01 ~]# ansible web -m shell -a "systemctl start httpd"       <!--批量啓動服務-->[root@centos01 ~]# ansible web -m shell -a "netstat -anptu | grep httpd"     <!--批量化監聽httpd服務是否啓動成功-->192.168.100.20 | SUCCESS | rc=0 >>
tcp6       0      0 :::80                   :::*                    LISTEN      2072/httpd          

192.168.100.30 | SUCCESS | rc=0 >>
tcp6       0      0 :::80                   :::*                    LISTEN      3098/httpd          

管理端只是發送yum指令到被管理端,被管理端要存在可用的yum倉庫才能夠成功安裝。

6)service模塊

service模塊爲用來管理遠程主機上的服務的模塊。常見的參數以下:

  • name:被管理的服務名稱;

  • state=started|stopped|restarted:動做包含啓動,關閉或重啓;

  • enable=yes|no:表示是否設置該服務開機自啓動;

  • runlevel:若是設定了enabled開機自啓動,則要定義在哪些運行目標下自動啓動;

示例以下:

[root@centos01 ~]# ansible web -m service -a "name=httpd 
enabled=yes state=restarted"<!--設置httpd服務從新啓動和開機自動啓動-->

7)user模塊

user模塊主要用於管理遠程主機上的用戶帳號。常見的參數以下:

  • name:必選參數,帳號名稱;

  • state=present|absent:建立帳號或者刪除帳號,present表示建立,absent表示刪除;

  • system=yes|no:是否爲系統帳戶;

  • uid:用戶UID;

  • group:用戶的基本組;

  • groups:用戶的附加組;

  • shell:默認使用的shell;

  • home:用戶的家目錄;

  • mve_home=yes|no:若是設置的家目錄已經存在,是否將已存在的家目錄進行移動;

  • pssword:用戶的密碼,建議使用加密後的字符串;

  • comment:用戶的註釋信息;

  • remore=yes|no:當state=absent時,是否要刪除用戶的家目錄;

建立用戶示例以下:

[root@centos01 ~]# ansible web -m user -a "name=user01 
system=yes uid=502 group=root groups=root shell=/etc/nologin 
home=/home/user01 password=pwd@123"<!--在web組的全部主機上新建一個系統用戶,UID爲502,
屬組是root,名字是user01,密碼是pwd@123-->

4、playbook配置文件

一、執行配置文件

playbook配置文件使用YAML語法,具備簡潔明瞭、結構清晰等特色。playbook配置文件相似於shell腳本,是一個YAML格式的文件,用於保存針對特定需求的任務列表。上面介紹的ansible命令雖然能夠完成各類任務,可是當配置一些複雜任務時,逐條輸入就顯得效率很是低下。更有效的方案是在playbook配置文件中放置全部的任務代碼,利用ansible-playbook命令執行該文件,能夠實現自動化運維。YAML文件的擴展名一般爲.yaml或.yml。

YAML語法與其餘高級語言相似,其結構經過縮進來展現,經過「-」來表明項;「:」用來分隔鍵和值;整個文件以「---」開頭並以「...」結尾,以下所示:

[root@centos01 ~]# grep -v ^# /etc/ansible/hosts | grep -v ^$              <!--查看hosts中的分組信息-->[web1]
192.168.100.20
[web2]
192.168.100.30
[root@centos01 ~]# vim /etc/ansible/a.yml  
                   <!--建立a.yml文件,寫入如下內容-->---
- hosts: web1                   <!--針對web1組中的操做-->
  remote_user: root                    <!--遠端執行用戶身份爲root-->
  tasks:                <!--任務列表-->
        - name: adduser                               <!--任務名稱-->
          user: name=user1 state=present <!--執行user模塊,建立用戶-->
          tags:                <!--建立tag標籤-->
          - aaa                 <!--tag標籤爲aaa-->
        - name: addgroup           <!--任務名稱-->
          group: name=root system=yes <!--執行group模塊,建立組-->
          tags:               <!--建立tag標籤-->
          - bbb               <!--tag標籤爲bbb-->- hosts: web2               <!--針對web2組中的操做-->
  remote_user: root        <!--遠端執行用戶身份爲root-->
  tasks:                     <!--任務列表-->
        - name: copy file to web            <!--任務名稱-->
          copy: src=/etc/passwd dest=/home        <!--執行copy模塊,複製文件-->
          tags:                        <!--建立tag標籤-->
          - ccc                     <!--tag標籤爲ccc-->...

全部的「-」和「:」後面均有空格,並且注意縮進和對齊,以下圖所示:
簡單聊一聊Ansible自動化運維

playbook的核心元素包含:

  • hosts:任務的目標主機,多個主機用冒號分隔,通常調用/etc/ansible/hosts中的分組信息;

  • remote_user:遠程主機上,運行此任務的默認身份爲root;

  • tasks:任務,即定義的具體任務,由模塊定義的操做列表;

  • handlers:觸發器,相似tasks,只是在特定的條件下才會觸發的任務。某任務的狀態在運行後爲changed時,可經過「notify」通知給相應的handlers進行觸發執行;

  • roles:角色,將hosts剝離出去,由tasks、handlers等所組成的一種特定的結構集合;

playbook文件定義的任務須要經過ansible-playbook命令進行調用並執行。ansible-playbook命令用法以下:

ansible-playbook [option] /PATH/TO/PLAYBOOK.yaml

其中,[option]部分的功能包括:

  • --syntax-check:檢測yaml文件的語法;

  • -C(--check):預測試,不會改變目標主機的任何設置;

  • --list-hosts:列出yaml文件影響的主機列表;

  • --list-tasks:列出yaml文件的任務列表;

  • --list-tags:列出yaml文件中的標籤;

  • -t TAGS(--tags=TAGS):表示只執行指定標籤的任務;

  • --skip-tags=SKIP_TAGS:表示除了指定標籤的任務,執行其餘任務;

--start-at-task=START_AT:從指定的任務開始往下運行;

執行playbook的示例以下:

[root@centos01 ~]# ansible-playbook --syntax-check /etc/ansible/a.yml    <!--語法檢測-->playbook: /etc/ansible/a.yml     <!--表示沒有報錯-->[root@centos01 ~]# ansible-playbook -C /etc/ansible/a.yml         <!--對a.yml進行預測試-->
    .................<!--省略部份內容-->192.168.100.20       : ok=3    changed=1    unreachable=0    failed=0   
192.168.100.30       : ok=2    changed=1    unreachable=0    failed=0   
<!--返回結果表示沒有錯誤,所有能夠執行成功。-->[root@centos01 ~]# ansible-playbook --list-hosts /etc/ansible/a.yml   
<!--列出a.yml文件中的主機-->[root@centos01 ~]# ansible-playbook --list-tasks /etc/ansible/a.yml       
<!--列出任務-->[root@centos01 ~]# ansible-playbook --list-tags /etc/ansible/a.yml           <!--列出標籤-->[root@centos01 ~]# ansible-playbook /etc/ansible/a.yml                <!--執行任務-->[root@centos01 ~]# ssh 192.168.100.20 tail -1 /etc/passwd <!--確認執行結果-->user1:x:1001:1001::/home/user1:/bin/bash
[root@centos01 ~]# ssh 192.168.100.30 ls -ld /home/passwd
-rw-r--r--. 1 root root 2342 7月  23 16:06 /home/passwd<!--通常狀況先執行「-C」命令進行預測試,沒有問題後再執行.yml文件。-->

一般狀況下先執行ansible-playbook -C /PATH/TO/PLAYBOOK.yaml命令進行測試,測試沒問題後再執行ansible-playbook /PATH/TO/PLAYBOOK.yml命令。

二、觸發器

須要觸發才能執行的任務,當以前定義在tasks中的任務執行成功後,若但願在此基礎上觸發其餘任務,這時就須要定義handlers。例如,當經過ansible的模塊對目標主機的配置文件進行修改以後,若是任務執行成功,能夠觸發一個觸發器,在觸發器中定義目標主機的服務重啓操做,以使配置文件生效。handlers觸發器具備如下特色:

  • handlers是Ansible提供的條件機制之一。handlers和task很相似,可是它只在被task通知的時候纔會觸發執行。

  • handlers只會在全部任務執行完成後執行。並且即便被通知了不少次,它也只會執行一次。handlers按照定義的順序依次執行。

handlers觸發器的使用示例以下:

[root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 80                  <!--查詢100.20主機監聽的端口-->tcp6       0      0 :::80         :::*          LISTEN      94858/httpd 
<!--能夠看到是監聽80端口,如今經過腳本改成8080端口,並使其生效。-->[root@centos01 ~]# vim /etc/ansible/httpd.yml            <!--編輯httpd.yml文件,寫入如下內容-->---
- hosts: web1
  remote_user: root
  tasks:
        - name: change port
          command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf
          notify:                             <!--配置觸發條件-->
                - restart httpd server    <!--完成該任務後調用名爲「restart httpd server」的觸發器-->
  handlers:                                      <!--配置觸發器-->
        - name: restart httpd server  <!--指定觸發器名字,要和上面「notify」指定的觸發器名字同樣-->
          service: name=httpd state=restarted<!--觸發任務爲重啓httpd服務-->...<!--編寫完成後,保存退出便可-->[root@centos01 ~]# ansible-playbook -C /etc/ansible/httpd.yml          <!--進行預測試-->[root@centos01 ~]# ansible-playbook  /etc/ansible/httpd.yml               <!--執行腳本-->[root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 8080        <!--遠端主機已經運行8080端口-->tcp6       0      0 :::8080        :::*         LISTEN      103594/httpd

三、角色

將多種不一樣的tasks的文件集中存儲在某個目錄下,則該目錄就是角色。角色通常存放在/etc/ansible/roles/目錄,可經過ansible的配置文件來調整默認的角色目錄,/etc/ansible/roles/目錄下有不少子目錄,其中每個子目錄對應一個角色,每一個角色也有本身的目錄結構,以下圖所示:
簡單聊一聊Ansible自動化運維

/etc/ansible/roles/爲角色集合,該目錄下有自定義的各個子目錄:

  • mariadb:mysql角色;

  • Apache:httpd角色;

  • Nginx:Nginx角色;

每一個角色的定義,以特定的層級目錄結構進行組織。以mariadb(mysql角色)爲例:

  • files:存放由copy或script等模塊調用的文件;

  • templates:存放template模塊查找所須要的模板文件的目錄,如mysql配置文件模板;

  • tasks:任務存放的目錄;

  • handlers:存放相關觸發執行的目錄;

  • vars:變量存放的目錄;

  • meta:用於存放此角色元數據;

  • default:默認變量存放的目錄,文件中定義了此角色使用的默認變量;

上述目錄中,tasks、handlers、vars、meta、default至少應該包含一個main.yml文件,該目錄下也能夠有其餘.yml文件,可是須要在main.yml文件中用include指令將其餘.yml文件包含進來。

有了角色後,能夠直接在yaml文件(playbook配置文件)中調用角色,示例以下:

- hosts: web
  remote_user: root
  roles:            
  - mysql        <!--調用角色名-->
  - httpd             <!--調用角色名-->

能夠只調用一個角色,也能夠調用多個角色,當定義了角色後,用ansible-playbook PALYBOOK文件執行便可。此時ansible會到角色集合的目錄(/etc/ansible/roles)去找mysql和httpd目錄,而後依次運行mysql和httpd目錄下的全部代碼。

下面來個安裝及配置mariadb數據庫的實例

需求分析:

  • 要求被管理主機上自動安裝mariadb,安裝完成後上傳提早準備好的配置文件至遠端主機,重啓服務,而後新建testdb數據庫,並容許test用戶對其擁有全部權限。

  • 被管理主機配置yum倉庫,自行配置,若被管理端能夠鏈接互聯網,那麼直接將yum倉庫指向互聯網便可。

開始在ansible服務器上實施:

[root@centos01 /]# mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
mkdir: 已建立目錄 "/etc/ansible/roles/mariadb"
mkdir: 已建立目錄 "/etc/ansible/roles/mariadb/files"
mkdir: 已建立目錄 "/etc/ansible/roles/mariadb/tasks"
mkdir: 已建立目錄 "/etc/ansible/roles/mariadb/handlers"
[root@ansible /]# cd /etc/ansible/roles/mariadb/tasks/ <!--切換至指定目錄-->[root@centos01 tasks]# ls
[root@centos01 tasks]# vim main.yml  <!--編寫main.yml文件-->---
- name: install mariadb
  yum: name=mariadb-server state=present
- name: move config file
  shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config file
  copy: src=my.cnf dest=/etc/my.cnf
- name: reload mariadb
  shell: systemctl restart mariadb
- name: create database testdb
  shell: mysql -u root -e "create database testdb;grant all on testdb.* to 'test'@'192.168.100.%' identified by 'test123';flush privileges;"
  notify:
  - restart mariadb
...<!--編寫完畢,保存退出便可-->[root@centos01 tasks]# cd ../handlers/ <!--切換至觸發器目錄-->[root@centos01 handlers]# vim main.yml <!--編寫main.yml文件,寫入如下內容-->---
- name: restart mariadb
  service: name=mariadb state=restarted
...<!--編寫完畢,保存退出便可-->[root@centos01 handlers]# cd ../files <!--進入mariadb角色文件夾的files-->[root@centos01 files]# pwd
/etc/ansible/roles/mariadb/files
[root@centos01 files]# ls  <!--準備好配置好的mysql數據庫配置文件,須要分發到遠程主機的-->my.cnf
[root@centos01 files]# cd /etc/ansible/
[root@centos01 ansible]# vim mariadb.yml  <!--編寫.yml文件-->---
- hosts: web
  remote_user: root
  roles:
  - mariadb
...<!--編寫完畢,保存退出便可-->[root@centos01 ansible]# ansible-playbook -C mariadb.yml          <!--進行預檢測-->
                                  ........................          <!--省略部份內容-->PLAY RECAP ***************************************************************************
192.168.100.20                : ok=3    changed=1    unreachable=0    failed=0 
<!--返回結果表示沒問題-->[root@centos01 ansible]# ansible-playbook mariadb.yml   <!--執行安裝-->

待安裝完成後,在遠端主機上自行測試。

相關文章
相關標籤/搜索