【講清楚,說明白!】Ansible-playbook使用詳解

(1)playbook和YAML語法
(1.1)
Playbook是由一個或多個「play」組成的列表;play的主要功能在於將事先歸併爲一組的主機裝扮成事先經過ansible中的task定義好的角色。從根本上來說,所謂task無非是調用ansible的一個moudle;將多個play組織在一個playbook中,便可以讓它們聯同起來事先編排的機制同唱一臺大戲;Playbook採用YAML語言編寫。
(1.2)YAML介紹:YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其餘多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年首次發表了這種語言,另外Ingy與Oren Ben-Kiki也是這語言的共同設計者;YAML Ain’t Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思實際上是:Yet Another Markup Language(還是一種標記語言)
特性:
YAML的可讀性好
YAML和腳本語言的交互性好
YAML使用實現語言的數據類型
YAML有一個一致的信息模型
YAML易於實現
YAML能夠基於流來處理
YAML表達能力強,擴展性好
(1.3)YAML語法簡介:
1.在單一檔案中,可用連續三個連子號(---)區分多個檔案。另外,還有選擇性的連續三個點號(...)用來表示檔案結尾
2.次行開始正常寫playbook內容,通常建議寫明該Playbook的功能
3.使用#號註釋代碼
4.縮進必須是統一的,不能空格和tab混用
5.縮進的級別也必須是一致的,一樣的縮進表明一樣的級別,程序判別配置的級別是經過縮進結合換行來實現的
6.YAML文件內容和Linux系統大小寫判斷方式保持一致,是區別大小寫的,k/v的值均需大小寫敏感
7.k/v的值可同行寫也可換行寫。同行使用(:)分隔
8.v能夠是個字符串,也但是另外一個列表
9.一個完整的代碼塊功能所需最少元素包括name:task
10.一個name只能包括一個task
11.YAML文件擴展名一般爲yml或yaml
(1.4)Dictionary:字典,一般由多個key與value構成
YAML的語法和其餘高階語言相似,而且能夠簡單表達清單、散列表、標量等數據結構。其結構(Structure)經過空格來展現,序列(Sequence)裏的項用「-」來表明,Map裏的鍵值對用「:」分隔
(1.5)Playbook核心元素
Hosts:執行的遠程主機列表
Tasks:任務集
Varniables:內置變量或自定義變量在playbook中調用
Templates模板,可替換模板文件中的變量並實現一些簡單邏輯的文件
Handlers和notity結合使用,由特定條件觸發的操做,知足條件方纔執行,不然不執行
Tag標籤,指定某條任務執行,用於選擇運行playbook中的部分代碼。Ansible具備冪等性,所以會自動跳過沒有變化的部分,即使如此,有些代碼爲測試其確實沒有發生變化的時間依然會很是的長。此時,若是確信其沒有變化,就能夠經過tags跳過此些代碼片斷。
# yum install httpd -y
在130主機本地安裝一個httpd服務
# echo 'welcome to wangxiangyu_home' > /var/www/html/index.html
在130主機上建立一個網頁文件
【講清楚,說明白!】Ansible-playbook使用詳解
【講清楚,說明白!】Ansible-playbook使用詳解
在/root/ansible/file.yaml文件中寫上以下的配置信息,咱們會touch建立一個newfile文件,而後建立一個test2用戶,再安裝httpd服務,將130本地的html文件拷貝到對應的主機中,最後啓動httpd服務
【講清楚,說明白!】Ansible-playbook使用詳解
# ansible-playbook -C file.yaml
使用大C檢查一遍建立的yaml文件
# ansible-playbook file.yaml
若是檢查沒有問題就真正的執行一遍playbook文件
# ansible all -a 'ls -l /data'
檢查/data目錄下是否有newfile文件
# ansible all -a 'getent passwd test2'
檢查test2用戶是否有建立
# ansible all -m shell -a 'ss -tln| grep :80'
檢查httpd服務是否有安裝成功(若是沒有裝成功能夠把防火牆關閉一下)
【講清楚,說明白!】Ansible-playbook使用詳解
(1.6)playbook基礎組件
(1.6.1)remote_user:可用於Host和task中。也能夠經過指定其經過sudo的方式在遠程主機上執行任務,其可用於play全局或某任務;此外,甚至能夠在sudo時使用sudo_user指定sudo時切換的用戶
(1.6.2)task列表和action:play的主體部分是task_list。task_list中的各個任務按次序逐個在hosts中指定的全部主機上執行,即在全部主機上完成第一個任務後再開始第二個。在運行自上而下某playbook時,若是中途發生錯誤,全部已執行任務都將回滾,所以,在更正playbook後從新執行一次便可;task的目的是使用指定的參數執行模塊,而在模塊參數中可使用變量。模塊執行是冪等的,這意味着屢次執行時安全的,由於其結果均一致;每一個task都應該有其name,用於playbook的執行結果輸出,建議其內容儘量清晰地描述任務執行步驟。若是未提供name,則action的結果將用於輸出。
若是命令或腳本的退出碼不爲零,可使用以下方式替代:
tasks:html

  • name: run this command and igonre the result
    shell: /usr/bin/somecommand || /bin/true
    或者使用ignore_errors來忽略錯誤信息:
    tasks:
  • name: run this command and igonre the result
    shell: /usr/bin/somecommand
    ignore_errors: True
    咱們可使用以下的常見選項:
    # ansible all -a 'getent passwd test2' --list-hosts
    查看全部的主機列表的清單
    # ansible all -a 'getent passwd test2' --limit 192.168.26.131
    限定只在131主機上執行查詢的命令
    # ansible-playbook file.yaml --limit websrvs
    限定只在websrvs組中的主機能夠執行playbook
    # ansible-playbook file.yaml --list-tasks
    查看file.yaml文件中的具體任務個數
    (1.6.3)Handlers:即觸發器,是task列表,這些task與前述的task並無本質上的不一樣,用於當關注的資源發生變化時,纔會採起必定的操做;notify此action可用於在每一個play的最後被觸發,這樣可避免屢次有改變發生時每次都執行指定的操做,僅在全部的變化發生完成後一次性地執行指定操做,在notify中列出的操做稱爲handler,也即notify中調用handler中定義的操做。
    【講清楚,說明白!】Ansible-playbook使用詳解
    【講清楚,說明白!】Ansible-playbook使用詳解
    (1.6.4)Tags標籤:能夠在playbook中使用的標籤信息,注意:也能夠多個動做公用一個標籤
    # ansible all -m service -a 'name=httpd state=stopped'
    首先將各主機中的httpd服務中止
    # ansible all -m shell -a 'ss -tnl| grep :9527'
    檢查各主機中的http服務對應的9527端口是否有中止
    【講清楚,說明白!】Ansible-playbook使用詳解
    而後咱們在httpd.yaml配置文件中寫上以下的tags信息
    【講清楚,說明白!】Ansible-playbook使用詳解
    # ansible-playbook -t rshttpd httpd.yaml
    將httpd.yaml文件從新執行一遍,而且只選擇標籤爲rshttpd的進行執行
    # ansible all -m shell -a 'ss -tnl| grep :9527'
    檢查各主機中的http服務對應的9527端口是否有中止
    # ansible all -m yum -a 'name=httpd state=absent'
    首先把httpd服務卸載一下
    # ansible-playbook -t inshttpd,rshttpd httpd.yaml
    使用playbook在httpd.yaml文件中使用inshttpd和rshttpd標籤,使用-t參數選項
    # ansible-playbook httpd.yaml --list-tags
    查看httpd.yaml文件的全部tags標籤信息
    (1.7)playbook中變量使用
    變量名:僅能由字母、數字和下劃線組成,且只能以字母開頭
    變量來源:ansible setup facts遠程主機的全部變量均可直接調用。
    (1.7.1)# ansible all -m setup -a 'filter=address'
    查找全部主機中配置帶IP地址的,使用-a選項,使用filter關鍵字過濾,其中setup包含的都是系統自帶的變量
    # ansible all -m setup -a 'filter=ansible_all_ipv4_addresses'
    查詢全部主機中變量爲ansible_all_ipv4_addresses的信息,使用-a選項,使用filter關鍵字過濾
    # ansible all -m setup -a 'filter=ansible_ens32'
    查詢全部主機中變量爲ansible_ens32的信息
    需求操做:咱們定義一個app.yaml文件,將name值定義爲pkname變量
    【講清楚,說明白!】Ansible-playbook使用詳解
    # ansible-playbook -e 'pkname=vsftpd' app.yaml
    咱們使用playbook設置pkname的參數值爲安裝vsftpd服務,其中使用-e選項
    # ansible appsrvs -m shell -a 'ss -tnl| grep :21'
    查看appsrvs中的主機的ftp服務對應的21端口是否有開啓
    【講清楚,說明白!】Ansible-playbook使用詳解
    # ansible-playbook -e 'pkname1=httpd pkname2=memcached' app.yaml
    若是想同時安裝多個軟件包,可使用多個參數的方式指定,使用e參數指定
    # ansible appsrvs -m shell -a 'rpm -q httpd memcached'
    查看指定的軟件是否有安裝成功
    【講清楚,說明白!】Ansible-playbook使用詳解
    (1.7.2)若是咱們想在yaml文件中直接定義好安裝的軟件包,可使用vars模塊
    # ansible-playbook app.yaml
    直接安裝app.yaml中的配置信息
    【講清楚,說明白!】Ansible-playbook使用詳解
    【講清楚,說明白!】Ansible-playbook使用詳解
    (1.7.3)
    變量名:僅能由字母、數字和下劃線組成,且只能以字母開頭
    變量來源:在/etc/ansible/host中定義
    1.普通變量:主機組中主機單獨定義
    2.公共組變量:針對主機組中全部主機定義統一變量
    3.經過命令行指定變量,優先級最高
    # vim /etc/ansible/hosts
    在/etc/ansible/hosts進行配置
    【講清楚,說明白!】Ansible-playbook使用詳解
    # vim hostname.yaml
    建立一個hostname.yaml文件
    【講清楚,說明白!】Ansible-playbook使用詳解
    # ansible-playbook hostname.yaml
    執行 hostname.yaml文件修改主機名
    # ansible websrvs -a 'hostname'
    查看主機名修改後的結果
    【講清楚,說明白!】Ansible-playbook使用詳解
    (1.7.4)變量名:僅能由字母、數字和下劃線組成,且只能以字母開頭
    變量來源:在/etc/ansible/host中定義
    4.普通變量的優先級[websrvs]中的http_port要比分組的[websrvs:vars]中的一樣http_port參數優先級高
    # vim /etc/ansible/hosts
    在/etc/ansible/hosts進行配置
    【講清楚,說明白!】Ansible-playbook使用詳解
    【講清楚,說明白!】Ansible-playbook使用詳解
    # ansible-playbook hostname.yaml
    執行 hostname.yaml文件修改主機名
    # ansible websrvs -a 'hostname'
    查看主機名修改後的結果
    【講清楚,說明白!】Ansible-playbook使用詳解
    (1.7.5)
    # ansible all -m setup -a 'filter=ansible_fqdn'
    使用setup模塊查詢ansible_fqdn這個系統自帶系統變量的信息,同時在var.yaml文件中進行以下配置,權限爲600,屬主爲wang
    【講清楚,說明白!】Ansible-playbook使用詳解
    # ansible-playbook -C var.yaml
    使用playbook將var.yaml幹跑一遍
    # ansible-playbook var.yaml
    使用playbook將var.yaml文件執行一遍
    # ansible all -a 'ls /data/'
    查看各主機上是否由在data目錄下建立.log文件
    【講清楚,說明白!】Ansible-playbook使用詳解
    (1.7.6)變量名:僅能由字母、數字和下劃線組成,且只能以字母開頭
    變量來源:在/etc/ansible/host中定義
    5.在獨立的變量YAML文件中定義
    # vim vars.yaml
    建立一個vars.yaml文件,裏面專門放變量的配置信息
    【講清楚,說明白!】Ansible-playbook使用詳解
    # vim testvar.yaml
    在testvar.yaml文件中編輯以下的配置
    【講清楚,說明白!】Ansible-playbook使用詳解
    # ansible-playbook testvar.yaml
    使用playbook安裝testvar.yaml配置文件
    # ansible all -m shell -a 'rpm -q httpd'
    查看httpd服務是否有安裝成功
    # ansible all -m shell -a 'ls -l /data'
    查看data目錄下是否有生成.log的文件
    【講清楚,說明白!】Ansible-playbook使用詳解
    【講清楚,說明白!】Ansible-playbook使用詳解
    (2)模板templates
    文本文件,嵌套有腳本(使用模板編程語言編寫)
    Jinjia2語言,使用字面量,有下面形式
    templates功能:根據模塊文件動態生成對應的配置文件;templates文件必須存放於templates目錄下,且命名爲.j2結尾;yaml文件需和templates目錄平級。
    字符串:使用單引號或雙引號
    數字:整數,浮點數
    列表:[item1,item2,...]
    元組:[item1,item2,...]
    字典:{key1:value1,key:value2,...}
    布爾型:true/false
    算術運算:+,-,*,/,//(整除),%(取餘),**(求指數)
    比較操做:==,!=,>,>=,<,<=
    邏輯運算:and,or,not
    流表達式:for,if,when(當..條件知足的時候)
    # ansible websrvs -m setup -a 'filter=ansible_processor_vcpus'
    查詢各主機上的cpu個數的參數信息
    # ansible all -m shell -a 'ps aux | grep nginx'
    查詢全部CPU上的nginx的進程數量
    # ansible all -m shell -a 'ss -tnlp'
    查詢ngixn是否有在80端口運行
    【講清楚,說明白!】Ansible-playbook使用詳解
    【講清楚,說明白!】Ansible-playbook使用詳解
    【講清楚,說明白!】Ansible-playbook使用詳解
    【講清楚,說明白!】Ansible-playbook使用詳解
    (2.1)經驗總結得出結論:經過試驗咱們獲得變量的優先級爲:第一優先級的是在命令行加上-e而後再加上具體設置參數如http_port=99的狀況(圖2-4);第二優先級是在playbook文件中定義,例如在testtempl.yaml文件中設置的vars參數值爲http_port: 88的狀況(圖2-5);第三優先級的是在主機清單/etc/ansible/hosts中定義的http_port=83的狀況(圖2-6)。
    命令行>playbook>主機清單
    【講清楚,說明白!】Ansible-playbook使用詳解
    【講清楚,說明白!】Ansible-playbook使用詳解
    【講清楚,說明白!】Ansible-playbook使用詳解
    (2.2)條件測試:若是須要根據變量、facts或此前任務的執行結果來做爲某task執行與否的前提時要用到條件測試,經過when語句實現,在task中使用,jinja2的語法格式
    When語句:在task後添加when子句便可使用條件測試,when語句支持jinja2表達式語法
    # ansible all -m setup -a 'filter=ansible_os_family'
    查看各主機使用的操做系統信息
    # ansible all -m setup -a 'filter=ansible_distribution_major_version'
    查看各主機的具體操做系統版本信息
    # vim testtempl.yaml
    編輯testtempl.yaml配置文件
    【講清楚,說明白!】Ansible-playbook使用詳解
    (2.3)迭代:with_items
    迭代:當有須要重複性執行的任務時,可使用迭代機制
    1.對迭代項的引用,固定變量名爲「item」
    2.要在task中使用with_items給定要迭代的元素列表
    列表格式:字符串、字典
    # vim testitem.yaml
    編輯testitem.yaml文件,在配置文件中定義循環建立文件和安裝軟件
    【講清楚,說明白!】Ansible-playbook使用詳解
    # vim testitem.yaml
    編輯testitem.yaml文件,在配置文件中定義循環建立組
    # ansible all -m shell -a 'getent group'
    檢查組是否由建立成功
    【講清楚,說明白!】Ansible-playbook使用詳解
    【講清楚,說明白!】Ansible-playbook使用詳解
    (2.4)迭代嵌套自變量
    # vim testitem2.yaml
    建立一個testitem2.yaml文件,而後配置好對應的用戶到對應的組中
    【講清楚,說明白!】Ansible-playbook使用詳解
    # ansible all -m shell -a 'getent passwd'
    查詢建立的用戶的屬主屬組信息
    【講清楚,說明白!】Ansible-playbook使用詳解
    # ansible all -m shell -a 'getent group'
    查詢各主機上建立的屬組信息
    【講清楚,說明白!】Ansible-playbook使用詳解
    (2.5)playbook中template for if
    需求:咱們須要在各主機的/data目錄下生成一個for.conf的配置文件,並在每一個文件中生成監聽81,82,83端口的信息
    # vim testfor.yaml
    建立一個testfor.yaml配置文件
    【講清楚,說明白!】Ansible-playbook使用詳解
    # vim for.conf.j2
    在/root/ansible/templates目錄下編輯模板文件
    【講清楚,說明白!】Ansible-playbook使用詳解
    # ansible-playbook testfor.yaml
    使用playbook執行testfor.yaml配置文件
    【講清楚,說明白!】Ansible-playbook使用詳解
    # ansible all -m shell -a 'cat /data/for.conf'
    查看各服務器下的/data/for.conf文件中是否有生成對應的配置內容
    【講清楚,說明白!】Ansible-playbook使用詳解
    (2.6.1)需求:咱們須要在各主機的/data目錄下生成一個for.conf的配置文件,並在每一個文件中生成監聽81,82,83端口的信息,注意須要將列表使用字典的方式組織。
    # vim testfor2.yaml
    建立一個testfor2.yaml配置文件
    【講清楚,說明白!】Ansible-playbook使用詳解
    # vim templates/for.conf.j2
    在/root/ansible/templates目錄下編輯模板文件
    【講清楚,說明白!】Ansible-playbook使用詳解
    # ansible-playbook testfor2.yaml
    使用playbook執行testfor2.yaml配置文件
    (2.6.2)字典的高級用法
    # vim testfor3.yaml
    編輯/root/ansible目錄下的testfor3.yaml文件
    【講清楚,說明白!】Ansible-playbook使用詳解
    # vim for3.conf.j2
    編輯/root/ansible/templates目錄下的for3.conf.j2文件
    【講清楚,說明白!】Ansible-playbook使用詳解
    # ansible-playbook testfor3.yaml
    使用playbook執行testfor3.yaml配置文件
    # ansible all -m shell -a 'cat /data/for3.conf'
    查詢在各主機下生成的for3.conf文件中的內容是否正確
    【講清楚,說明白!】Ansible-playbook使用詳解
    【講清楚,說明白!】Ansible-playbook使用詳解
    (2.6.3)字典的高級用法
    # vim testfor4.yaml
    編輯/root/ansible目錄下的testfor4.yaml配置文件
    【講清楚,說明白!】Ansible-playbook使用詳解
    # vim for4.conf.j2
    在/root/ansible/templates目錄下編輯for4.conf.j2文件
    【講清楚,說明白!】Ansible-playbook使用詳解
    # ansible-playbook testfor4.yaml
    使用playbook執行testfor4.yaml配置文件
    # ansible all -m shell -a 'cat /data/for4.conf'
    查詢在各主機下生成的for4.conf文件中的內容是否正確
    【講清楚,說明白!】Ansible-playbook使用詳解

—————— 本文至此結束,感謝閱讀 ——————nginx

相關文章
相關標籤/搜索