別讓運維太忙,一文詳解 Ansible 的自動化運維

1、Ansible 概述

Ansible 是近年來愈來愈火的一款開源運維自動化工具,經過Ansible能夠實現運維自動化,提升運維工程師的工做效率,減小人爲失誤。python

Ansible 經過自己集成的很是豐富的模塊能夠實現各類管理任務,其自帶模塊超過上千個。更爲重要的是,它操做很是簡單,即便小白也能夠輕鬆上手,但它提供的功能又很是豐富,在運維領域,幾乎能夠作任何事。mysql

一、Ansible 特色

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

  • Ansible 基於 Python 開發,運維工程師對其二次開發相對比較容易;
  • Ansible 豐富的內置模塊,幾乎能夠知足一切要求;
  • 管理模式很是簡單,一條命令能夠影響上千臺主機;
  • 無客戶端模式,底層經過 SSH 通訊;
  • Ansible發佈後,也陸續被 AWS、Google Cloud Platform、Microsoft Azure、Cisco、HP、VMware、Twitter 等大公司接納並投入使用;

2、Ansible的角色

  • 使用者:如何使用 Ansible 實現自動化運維?
  • Ansible 工具集:Ansible 能夠實現的功能?
  • 做用對象:Ansible 能夠影響哪些主機?

一、使用者

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

  • CMDB:CMDB 存儲和管理者企業IT架構中的各項配置信息,是構建 ITIL 項目的核心工具,運維人員能夠組合 CMDB 和 Ansible,經過 CMDB 直接下發指令調用Ansible 工具集完成操做者所但願達到的目標;
  • PUBLIC/PRIVATE 方式:Ansible 除了豐富的內置模塊外,同時還提供豐富的 API語言接口,如PHP、Python、PERL 等多種流行語言,基於 PUBLIC/PRIVATE,Ansible 以 API 調用的方式運行;
  • Ad-Hoc 命令集:Users直接經過Ad-Hoc命令集調用Ansible工具集來完成任務;
  • Playbooks:Users 預先編寫好 Ansible Playbooks,經過執行
  • Playbooks 中預先編排好的任務集,按序執行任務;

二、Ansible 工具集

Ansible 工具集包含 Inventory、Modules、Plugins 和 API。redis

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

  • Ansible Playbooks:任務腳本,編排定義Ansible任務及的配置文件,由Ansible按序依次執行,一般是JSON格式的YML文件;
  • Inventory:Ansible 管理主機清單;
  • Modules:Ansible 執行命令功能模塊,多數爲內置的核心模塊,也可自定義;
  • Plugins:模塊功能的補充,如鏈接類型插件、循環插件、變量插件、過濾插件等,該功能不太經常使用;
  • API:供第三方程序調用的應用程序編程接口;
  • Ansible:該部分圖中表現得不太明顯,組合 Inventory、API、Modules、Plugins能夠理解爲是 Ansible 命令工具,其爲核心執行工具;

三、做用對象

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

使用者使用 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安裝Ansiblejson

能夠自行從互聯網上直接下載Ansible所需軟件包,本篇博客提供安裝Ansible自動化運維工具所需的依賴軟件包

[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 自動管理設備,應該配置爲免交互登陸被管理設備。

[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-2ansible-2             
ansible-console-2.7   ansible-galaxy-2      ansible-pull          
ansible-vault-2.7ansible-2.7           ansible-doc           
ansible-galaxy-2.7    ansible-pull-2ansible-connection    
ansible-doc-2         ansible-playbook      
ansible-pull-2.7ansible-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     0897M    0% /dev  
tmpfs               tmpfs     912M   84K  912M    1% /dev/shm  
tmpfs               tmpfs     912M     0912M    0% /sys/fs/cgroup  
/dev/sda1           xfs      1014M  173M  842M   18% /boot  
tmpfs               tmpfs     183M   16K  183M    1% /run/user/42  
tmpfs               tmpfs     183M     0183M    0% /run/user/0  
  
192.168.100.20 | SUCCESS | rc=0 >>  
文件系統            類型      容量  已用  可用 已用% 掛載點  
/dev/mapper/cl-root xfs        17G  4.3G   13G   26% /  
devtmpfs            devtmpfs  897M     0897M    0% /dev  
tmpfs               tmpfs     912M   84K  912M    1% /dev/shm  
tmpfs               tmpfs     912M     0912M    0% /sys/fs/cgroup  
/dev/sda1           xfs      1014M  173M  842M   18% /boot  
tmpfs               tmpfs     183M   16K  183M    1% /run/user/42  
tmpfs               tmpfs     183M     0183M    0% /run/user/0  
/dev/sr0            iso9660   4.1G  4.1G     0100% /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 isNOT 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文件中-->
92.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=user01system=yes uid=502 group=root groups=root shell=/etc/nologinhome=/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-->...

全部的「-」和「:」後面均有空格,並且注意縮進和對齊,以下圖所示:

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/ 目錄下有不少子目錄,其中每個子目錄對應一個角色,每一個角色也有本身的目錄結構,以下圖所示:

/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倉庫指向互聯網便可。
轉自:51CTO博客-俊偉祺i
https://blog.51cto.com/141566...

最新整理的 2TB 技術乾貨:包括架構師實戰教程、大數據、Docker容器、系統運維、數據庫、redis、MogoDB、電子書、Java基礎課程、Java實戰項目、ELK Stack、機器學習、BAT面試精講視頻等。只需在「 民工哥技術之路」微信公衆號對話框回覆關鍵字:1024便可獲取所有資料。

相關文章
相關標籤/搜索