第20章,運維自動化之ansible

更多內容請點擊:html

Linux學習從入門到打死也不放棄,徹底筆記整理(持續更新,求收藏,求點贊~~~~) 
java

https://blog.51cto.com/13683480/2095439python


第20章,運維自動化之ansiblelinux

 

本章內容:nginx

               運維自動化發展歷程及技術應用git

               ansible 命令使用github

               ansible 經常使用模塊使用web

               YAML語法簡介正則表達式

               ansible playbook基礎shell

               playbook 變量,tags,handlers使用

               playbook模板templates

               playbook 條件判斷 when

               playbook 字典 with_items

               ansible roles

 

雲計算,運維自動化發展歷程及技術應用

               IaaS: Intrastructure as a Service 基礎設施即服務

                             提供給消費者的服務時對多有計算機基礎設施的利用,包括處理CPU,內存,存儲

                             和其餘基本的計算資源,用戶可以部署和運行任意軟件,包括操做系統和應用程序。

                             消費者無論理或控制任何雲計算基礎設施,但能控制操做系統的選擇,存儲空間,部署

                             的應用,也有可能得到有限制的網絡組件,例如路由器、防火牆、負載均衡器等,的控制

                             

               PaaS:Platform as a Service 平臺即服務

                             提供給消費者的服務是把客戶採用提供的開發語言和工具(如java,python,.net等)

                             開發的或收購的應用程序部署到供應商的雲計算基礎設施上去。客戶不須要管理或者控制底層

                            的雲基礎設施,包括網絡,服務器,操做系統,存儲等,但客戶能控制部署的應用程序,也可能

                             控制運行應用程序的託管環境配置

                             

               SaaS:Software as a Serveice 軟件即服務

                             提供給客戶的服務時運營商運行在雲計算基礎設施上的應用程序,用戶能夠在各類

                             設備上經過客戶端界面訪問,如瀏覽器,消費者不須要管理或控制任何雲計算基礎設施,

                             包括網絡,服務器,操做系統,存儲等;

                             

 

經常使用自動化運維工具

               ansible:python                 Agentless中小型應用環境,經過ssh實現,無需部署代理程序

               Saltstack:python        通常需部署agent,執行效率更高

               Puppet:ruby                      功能強大,配置複雜,適合大型環境

               Fabric:python                    agentless

               chef:ruby                        

               cfengine

               func

               

ansible特性:----------------------------------------------------------------------

                      模塊化:調用特定的模塊,完成特定任務

                     有Paramiko(基於ssh的python實現),pyYAML,jinja2 三個關鍵模塊

                     支持自定義模塊

                     基於python語言實現

                     部署簡單,基於python和ssh,

                     安全,基於openssh

                     支持playbook 編排任務

                     具備冪等性,一個任務執行1遍和執行n遍效果同樣,不因重複執行帶來意外狀況

                     無需代理,不依賴PKI(無需ssl)

                     可以使用任務編程語言寫模塊

                      YAML格式,編排任務,支持豐富的數據結構

                     交強大的多層解決方案

               

ansible主要組成部分:

               invenroty:                 ansible管理主機的清單,存放於/etc/ancible/hosts

               modules:               ansible執行命令的功能模塊,多數爲內置核心模塊,也能夠自定義

               ansible playbook:      任務劇本,編排定義ansible任務集合的配置文件,由ansible順序

                                                  執行,一般是JSON格式的YML文件

               plugins:                      模塊功能的補充,如鏈接類型插件,循環插件,變量插件,過濾插件等

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

               ansible: 組合Inventory api modules plugins  的綠框,能夠理解爲是ansible的命令工具

                                    其爲核心執行工具

                                    

               ansible命令執行來源:

                            USER  普通用戶,即system administrator

                             CMDB(配置管理數據庫)API調用

                            Public/private  cloud  API調用

                            user -> ansible  playbook -> ansible

                    

               利用ansible實現管理的方式:

                            ad-hoc 即ansible命令,用戶臨時命令使用場景

                            ansible-playbook  主要用於長期規劃好的,大型項目的場景,須要由前提的規劃

                    

               absible-playbook 執行過程:

                             將已有編排好的任務集寫入ansible-palybook

                            經過ansible-playbook 命令分拆任務逐條ansible命令,按預約規則逐條執行

                    

               ansible主要操做對象:

                            host主機

                             network網路設備

                             

               注意事項:     

                            執行ansible的主機通常稱爲主控端,中控,master或堡壘機

                            主控端python版本須要2.6或以上

                            被控端python版本小於2.4須要安裝python-simplejson

                            被控端如開啓selinux,須要安裝libselinex-python

                             windows不能做爲主控端

                             

ansible安裝:

               1     rpm包安裝,epel源

                                   yum install  ansible

               

               2     編譯安裝:

                                   yum -y  install python-jinja2 PyYAML python-paramiko python-babel  python-crypto

                                   tar xf  ansible-1.5.4.tar.gz

                                   cd  ansible-1.5.4

                                   python  setup.py build

                                   python  setup.py install

                                   mkdir  /etc/ansible

                                   cp -r  examples/* /etc/ansible                     

 

               3     git方式:

                                   git clone  git://github.com/ansible/ansible.git --recursive

                                   cd ./ansible

                                   source ./hacking/env-setup              

 

               4     pip安裝: pip是安裝Python包的管理器,相似yum

                                   yum install  python-pip python-devel

                                   yum install  gcc glibc-devel zibl-devel rpm-bulid openssl-devel

                                   pip install  --upgrade  pip

                                   pip install  ansible --upgrade

 

               5     確認安裝版本:

                                   ansible  --version

                             

相關文件:

               配置文件:

                             /etc/ansible/ansible.cfg        主配置文件,配置ansible工做特性

                            /etc/ansible/hosts                       主機清單

                             /etc/ansible/roles/                存放roles的目錄

                             

               程序:     

                            /usr/bin/ansible                   主程序,臨時命令執行工具

                             /usr/bin/ansible-doc            查看配置文檔,模塊功能查看工具

                             /usr/bin/ansible-galaxy        下載、上傳優秀代碼或roles模塊的官網平臺

                             /usr/bin/ansible-playbook 定製自動化任務,編排劇本工具

                             /usr/bin/ansible-pull           遠程執行命令的工具

                             /usr/bin/ansible-vault          文件機密工具

                             /usr/bin/ansible-console      基於console界面與用戶交互的執行工具

                             

               主機清單:

                            Inventory  :主機清單

                            默認的Inventory file爲:    /etc/ansible/hosts

                            inventory  file能夠有多個,且也能夠經過dynamic inventory 來動態生成

 

主機清單:Inventory

               /etc/ansible/hosts文件格式:

               inventory文件遵循INI文件風格,中括號中的字符爲組名。能夠將同一個主機同時

               歸併到多個不一樣的組中;此外,若是目標主機使用了非默認的ssh端口,還能夠在主機名

               以後使用 :端口號 來標明

               

               例如:

                             [webservers]

                             192.168.65.128

                             192.168.65.132

                             www.test1.com

                             www.test2.com

                                           

                             [dbservers]

                             192.168.65.150:2222

                             192.168.65.160

                             db1.test.com

                             db2.test.com

                                           

               注意:     若是使用name來標明主機,那麼就必須提供能供解析的name-server,或者修改

                            本地host文件。/etc/hosts

                                    

               若是主機名稱遵循類似的命名模式,還可使用列表的方式標識各主機

               例如:

                             [webs]

                            www.test[1:100].com             1-100

                            ca.test[a:f].com              a-f

               

               

ansible配置文件:

               /etc/ansible/ansible.cfg        通常保持默認

               [defaults]

               #inventory                   =  /etc/ansible/hosts      主機列表配置文件

               #library                =  /usr/share/my_modules/ 庫文件存放目錄

               #remote_tmp              =  $HOME/.ansible/tmp      臨時py命令文件存放的遠程主機目錄

               #local_tmp                   =  $HOME/.ansible/tmp        本機的臨時命令執行目錄

               #forks                          =  5                                      默認併發數

               #sudo_user                  = root                                  默認sudo用戶

               #ask_sudo_pass           =  True                  每次執行ansible命令是否詢問ssh密碼

               #ask_pass                    = True                 

               #remote_port              =  22

               #host_key_checking     = False    檢查對應服務器的host_key,建議取消註釋

               #log_path      =  /var/log/ansible.log 日誌文件

 

               

ansible-doc    顯示模塊幫助

               ansible-doc [options][modules]

                            -a                  顯示全部模塊的文檔

                            -l --list 列出可用模塊

                            -s --snippet  顯示指定模塊的playbook片斷

                             

               示例:

                            ansible-doc -l  

                            ansible-doc  ping

                            ansible-doc -s  ping

                    

ansible命令:---------------------------------------------------------------------

               

               經過ssh實現配置管理,應用部署,任務執行等功能,建議配置ansible端能基於祕鑰

               認證的方式聯繫各被管理節點

               

               ansible <host-pattern> [-m module_name] [-a  'args']

                            --version              顯示版本

                            -m module          指定模塊,默認爲command

                            -v -vv -vvv   顯示詳細過程

                            -list-hosts     顯示主機列表,可簡寫  --list

                            -k --ask-pass      提示鏈接密碼,默認key驗證

                            -K --ask-become-pass  提示輸入sudo密碼

                            -C --check           檢查,並不執行

                            -T --timeout=      執行命令的超時時間,默認10s

                            -u  --user=REMOTE_USER    執行遠程命令執行的用戶

                            -b --bacome       代替舊版的sudo  切換

 

               示例:

                            ansible centos6 -m  shell -u hello -k -a 'ls -l /data/f1'

                            ansible all -m command  -u wang  --become-user=root -a 'ls /root'  -b –k  -K            

                             

               host-pattern          匹配主機的列表

                             

                            all   表示全部inventory中的全部主機

                                   ansible all  -m ping

                             

                            *             通配符,任意長度任意字符

                                   ansible "*"  -m ping

                                   ansible  192.168.65.* -m ping

                                   ansible  1*      -m ping

                                   ansible "c*"  -m ping

                                           如單獨使用或者使用時字符串較短 如1-2個字符,建議使用""

                                           不然容易語法錯誤

                             

                            :           或

                                   ansible  "centos6:centos7" -m ping

                                   ansible  "centos6:192.168.65.132" -m ping

                                   ansible  "centos6:192.168.65.132:centos7" -m  ping

 

                            :&           邏輯與

                                   ansible  "webs:&dbs" -m ping

                                           表示在webs組裏,而且在dbs組裏的主機

                                           

                            :!            邏輯非

                                   ansible  'webs:!centos6' -m shell -a 'echo  hello'

                                           表示在webs組中,但不在centos6中的主機

                                           

                            注意:    :&  用"" ''  均可以

                                           :!     只能使用''

                                           

                            綜合邏輯:

                                   ansible  'webs:dbs:&centos6:!centos7' -m  ping

 

                            正則表達式:

                                   ansible  '~centos(6|7)' -m ping

                                   ansible  '~(web|db).*\.magedu\.com' -m  ping

                                    

               

ansible命令的執行過程:

               1     加載本身的配置文件 默認/etc/ansible/ansible.cfg

               2     加載本身對應的模塊文件,如shell、 copy

               3     經過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器

                     的對應執行用戶$HOME/.ansible/tmp/ansible-tmp-數字/xxx.Py文件

               4     給文件+x  執行權限

               5     執行並返回結果

               6     刪除臨時py文件,sleep 0 退出

               

               執行狀態:

                            綠色:    執行成功而且不須要作改變的操做

                            ×××:    執行成功而且對目標主機作變動

                            紅色:    執行失敗

                             

ansible 經常使用模塊:------------------------------------------------------------------

               

               command:默認模塊,可忽略 -m 選項,在遠程主機上執行命令,

                            ansible webs -a 'rpm  -q httpd'

                            ansible webs -m  command -a 'rm -f /data/*'

                                    經常使用選項:

                                           chdir=/DIR                    cd到/DIR目錄下執行

                                           creates=filename   若是filename文件存在,將不執行         不存在-->  執行

                                           removes=filename 若是filename文件不存在,將不執行       存在_-->  執行

                                    

               注意:command模塊不支持 $name  < > | ; & 等特殊用法,用shell模塊實現

               

               shell:     和command 類似,用shell執行命令,支持 $name < > | ; &  等特殊用法

                            ansible webs -m  shell -a 'echo magedu | passwd --stdin hello'

                            調用bash執行命令

                            可是相似 cat /tmp/stanley.md |awk -F'|' '{print $1 $2}'  &>/tmp/example.txt

                             這樣的複雜命令就算使用shell模塊也可能失敗,並且存在引號衝突問題,

                             解決辦法:寫到腳本中,copy到遠程,執行,再把須要的結果拉回執行命令的機器

                                    經常使用選項:     

                                           chdir

                                           creates

                                           removes

                                           

               script:運行腳本

                            ansible webs -m  script -a f1.sh

                                    經常使用選項:     chdir

                                                         creates

                                                         removes

                                                         --some-arguments 1234      提供運行參數

                                                         

               copy:      從本地複製文件到遠程主機

                            經常使用選項:   

                                           backup=yes|no      若是目標存在,是否備份

                                           src=                源文件,本地

                                           dest=                     目標路徑,遠程主機

                                           group=                  所屬組

                                           owner=                 全部者

                                           mode=                  設置權限

 

                            ansible webs -m copy  -a 'src=/etc/fstab dest=f2 backup=yes'

                                           ansible webs -m shell -a 'ls /root'

                                           若是不指明路徑,默認複製到家目錄下

                            ansible dbs -m copy  -a 'src=/root/f2 dest=/data/cat backup=yes mode=000'

                             

               fetch:    從遠程主機複製文件到本地主機,與copy相反

                             只能複製單個文件,目錄可先tar在fetch

                            選項:

                                           src=

                                           dest=

                            會在dest目錄下生成多個主機名命名的目錄,且會將源文件的路徑一併生成

                            如:

                                           ansible dbs -m fetch -a 'src=/etc/passwd dest=/data/bak'   

                                           [root@Centos6 /data]#tree

                                           .

                                          └──  bak

                                                  ├── 192.168.65.150

                                                  │   └── etc

                                                  │       └──  passwd

                                                  └── 192.168.65.160

                                                         └── etc

                                                                └── passwd

 

                                          5  directories, 2 files

               

               file:       設置文件屬性

                            選項:            

                                           path=  dest= name=         等價,指明文件路徑

                                          state      

                                                          =derictory              若是不存在則建立目錄

                                                         =file                若是不存在默認不建立

                                                         =touch                  默認,建立文件或目錄

                                                         =absent                 遞歸刪除        

                                                         =link                      軟連接

                                                         =hard                    硬連接

                                           group=                                所屬組

                                           owner=                               全部者

                                           src=                              源,建立連接文件需指明

                                           mod=                                  權限        

                             

                            示例:

                            建立文件:

                                           ansible dbs -m file -a 'path=/data/f1 state=touch'

                            建立目錄:

                                           ansible dbs -m file -a 'path=/data/dir1  state=directory'

                            刪除文件或目錄

                                           ansible dbs -m file -a 'path=/data/dir1  state=absent'

                            建立連接

                                           ansible dbs -m file -a 'src=/data/f1 path=/data/f1.link  state=touch'

                             

                             注意:不支持通配符*操做,一次只能操做一個文件或目錄

               

               hostname:    管理主機名

                            ansible  192.168.65.150 -m hostname -a 'name=NAME'

                             

               yum:       管理程序包

                            經常使用選項:   

                                                  name=                  包名

                                                  state=

                                                         present installed latest         安裝

                                                         absent    removed                      卸載

                                                         list= installed   name

                                                         disable_gpg_check=yes|no 禁用gpgcheck  默認no

                                                         update_cache=yes|no          是否清楚緩存默認no

                                                         

                            安裝程序包:

                                           ansible dbs -m yum -a 'name=vsftpd,httpd'

                            卸載程序包

                                           ansible dbs -m yum -a 'name=vsftpd,httpd  state=absent'

                            查看包列表:

                                           ansible dbs -m yum -a 'list=NAME or intalled'

                            rpm包直接使用yum安裝:

                                           ansible dbs -m copy -a 'src=rpmfile dest=/path/'

                                           ansible dbs -m yum -a 'name=/path/rpmfile  disable_gpg_check=yes'

                                           

                             

               cron:     計劃任務

                            時間格式選項:minute hour day month weekday

                            選項:    job=                     做業內容

                                           name=                  做業標籤

                                           user=                    用戶

                                           disabled=true|false        yes|no    禁用或者啓用

                                           state=                    默認present 啓用

                                                         absent    刪除

                             

                            示例:

                            新建計劃任務:

                                           ansible dbs -m cron -a 'minute=* job="wall hello there"  name=wall'

                            禁用計劃任務

                                           ansible dbs -m cron -a 'disabled=yes job="wall hello there"  name=wall'

                            啓用:

                                           disabled=no或false

                            刪除:

                                           ansible dbs -m cron -a 'job="wall hello there" name=wall  state=absent'

        

               

               service:服務管理

                            經常使用選項:

                                           name=                  服務名

                                           state=                           

                                                         reloaded

                                                         restarted

                                                         running

                                                         started

                                                         stopped

                                           enabled=yes|no    開機啓動

                             

                            示例:

                             啓動並設置開機啓動服務

                                           ansible dbs -m service -a 'name=httpd state=started  enabled=yes'

                            關閉:

                                           ansible dbs -m service -a 'name=httpd state=stopped  enabled=no'

                                           

               user:       用戶管理模塊

                            經常使用選項:

                                           create_home=no           不建立家目錄,默認yes

                                           comment=""                 描述信息

                                           group=                         主組

                                           groups=                       附加組

                                           home=                         手工設置家目錄位子

                                           name=                         用戶名

                                           password=                   密碼

                                           shell=                           shell類型

                                           system=yes|no              是不是系統該用戶

                                           uid=                             uid

                                           state=absent                刪除用戶,默認present

                                           remove=yes                 刪除家目錄,state=absent時使用

                            示例:

                            新建帳號:

                                           ansible dbs -m user -a 'name=lily uid=1080 home=/data/home/ comment="a  beauty girl" groups=root'

                            刪除帳號:

                                           ansible dbs -m user -a 'name=lily state=absent  remove=yes'

 

               group: 組管理模塊

                            經常使用選項:

                                          gid=                      gid

                                           name=                  組名

                                           state=absent  刪除 默認present

                                           system=yes|no      是否系統帳號,默認no

                                           

 

ansible系列命令:----------------------------------------------------------------

                            ansible  

                             ansible-doc

                            ansible-playbook  

                             ansible-vault

                             ansible-console

                            ansible-galaxy  

                            ansible-pull                       

ansible-galaxy:

               鏈接https://galaxy.ansible.com 下載相應的roles

               查看已安裝的galaxy

                            ansible-galaxy list  [role_name]

                            ansible-galaxy list  "Stouts grafana"

               安裝roles

                            ansible-galaxy  install "Stouts grafana"

               刪除roles

                            ansible-galaxy  remove "Stouts grafana"

 

 

ansible-pull:

               推送命令至遠程,效率無限提高,對運維要求較高

               

 

ansible-playbook:

               相似shell,用來解釋執行編寫playbook文件,一般是yml後綴,如:

               ansible-playbook hello.yml

                            [root@Centos6 ~]#cat hello.yml

                             ---

                            - hosts:  dbs

                              remote_user: root

                             

                              tasks:

                                   - name:  hello

                                     command: /usr/bin/wall hello  there

        

 

ansible-vault:

               功能:加密解密yml文件

               ansible-vault  [create|encrypt|decrypt|edit|view|rekey]

                            ansible-vault  encrypt hello.yml 加密

                            ansible-vault view  hello.yml         能夠查看加密文件,須要輸入密碼

                            ansible-vault  decrypt hello.yml 解密

                            ansible-vault edit  hello.yml               編輯加密文件

                            ansible-vault rekey  hello.yml             修改口令

                            ansible-vault create  new.yml             建立新文件

                    

                    

ansible-console:2.0+新增,可交互執行命令,支持tab

               

               工做臺介紹:

                            [root@Centos6 ~]#ansible-console

                            Welcome to the  ansible console.

                            Type help or ? to list commands.

 

                            root@all (5)[f:5]$

                            執行用戶@當前操做的主機組(當前組的主機數量)[f:併發數]$

               

               設置併發數:              forks n          例如:forks  10

               切換組:                     cd 主機組            例如:cd webs

               列出當前組主機列表:list

               列出全部的內置命令:?或help

               退出:                            exit

               

               示例:

                            root@dbs (2)[f:5]$ shell ls /data

                            root@dbs (2)[f:5]$ yum name=htop state=present

 

 

palybook:------------------------------------------------------------------------

 

playbook示例: 安裝並啓動httpd服務

---

- hosts: dbs

   remote_user: root

 

   tasks:

    -  name: install package

       yum: name=httpd

    -  name: tempalte conf6

       template: src=httpd.conf6.j2  dest=/etc/httpd/conf/httpd.conf

       when: ansible_distribution_major_version == "6"

       notify: reload conf

    -  name: tempalte conf7

       template: src=httpd.conf7.j2  dest=/etc/httpd/conf/httpd.conf

       when: ansible_distribution_major_version == "7"

       notify: reload conf

    -  name: test web6

       when: ansible_distribution_major_version == "6"

       shell: echo "welcome to web  centos6" > /var/www/html/index.html

    -  name: test web7                                                                           

       when: ansible_distribution_major_version == "7"

       shell: echo "welcome to web centos7" >  /var/www/html/index.html

    -  name: start service

       service: name=httpd state=started

    -  name: testnet

       shell: ping -c2 -w2 172.20.0.1

       tags: testnet

   

   handlers:

    -  name: reload conf

       service: name=httpd state=reloaded           

               

               

palybook:

               一組ansible指令的集合,相似shell腳本

               採用YAML語言編寫

               通常使用.yml 後綴 如:hello.yml

               經過ansible-playbook解釋執行,如ansible-playbook hello.yml

                             

YAML語言:

                     可讀性好

                     和腳本語言的交互性好

                     使用實現語言的數據模型

                     有一個一致的信息模型

                     易於實現

                     能夠基於流來處理

                     表達能力強,擴展性好

                     官方地址:http://www.yaml.org

               

YAML語法簡介:

               在單一檔案中,可用連續三個連字號(---)區分多個檔案。另外,還有選擇性的

               連續三個點號(...)來表示檔案結尾

               次行開始正常些playbook的內容,通常建議寫明該playbook的功能

               使用#號註釋代碼

               縮進必須是統一的,不能空格和tab混用

               縮進的級別必須一致,一樣的縮進表示一樣的級別,程序判斷配置的級別是經過縮進

               結合換行來實現

               k/v(鍵值對)的值可同行寫也能夠換行些,同行使用: 分隔

               v能夠是個字符串,也能夠是另外一個列表

               一個完整的代碼塊功能須要最少元素包括name:task

               一個name只能包括一個task

               文件後綴一般爲yml或yaml

                             

 

YAML列表:

               list:列表,其全部元素均使用 - 打頭

               列表的每一項能夠有多行,如

                            - name:

                              yum:

                              notify:

                              when:

                             

YAML字典:

               dictionary:字典,一般由多個key與value構成

               如:        

                     - {  name: install httpd,yum: name=httpd }

                             

playbook核心元素:

               hosts:           執行的遠程主機列表

               remote_user:指定用戶身份

               tasks:           任務集

               varniables:內置變量或自定義變量在playbook中調用

               templates:    模板,能夠替換模板文件中的變量並實現一些簡單邏輯的文件

               handlers:      和notify結合使用,若是notify:A當前task執行發生修改操做,

                                    則觸發執行handlers中定義的A操做

               tags:            標籤,指定某條任務執行,用於選擇運行playbook中的部分代碼。

                                    如:

                            ansible-playbook -t  install httpd.yml

                             

               注意:     多個task可使用同一個tags

                                                  

                                    

hosts:   列表必須事先定義在主機清單中

               可使用 *,:,:&,:!來定義列表

               如:

                            webs:dbs

                            webs:!dbs

               

remote_user:

               指明執行命令的用戶身份

               且支持在task中以sudo方式執行

               例如:

                     - host:  webs

                       remote_user: root

                       tasks:

                         - name: test ping

                              ping:

                              remote_user: hello

                              sudu: yes                        

                              sudu_user: lily    如不知指明,默認sudo爲root

                                           

task列表和action:

               play的主體部分是task list,task  list 中的各任務按次序逐個在host中指定

               的全部主機上執行,即在全部主機上完成第一個任務後在開始第二個。在運行自上

               而下某playbook時,若是中途發生錯誤,多有已執行任務都會回滾,所以,在更正

               playbook後從新執行一次便可

                             

               task的目的是使用指定的參數執行模塊,而在模塊參數中可使用變量,模塊執行是

               冪等的,這意味着屢次執行是安全的,由於其結果均一致

                             

               每一個task都應該有其name,用於playbook的執行結果輸出

               若是未提供name,則action的結果將用於輸出

                             

               格式:

                     1     action: module  arguments

                     2     module:  arguments

                                    

               某任務的狀態在運行後衛changed時,可經過notify通知給相應的handlers任務。

                             

               任務可經過tags打標籤,然後可在ansible-playbook命令中使用 -t 選項指定執行

                             

               若是命令或腳本的退出碼不爲零,可使用下方方式使整個playbook繼續執行,而不是回滾

                              tasks:

                              - name: test

                                   shell: false  ||/bin/true

                            或者:

                            tasks:

                              - name: test

                                   shell:  false

                                   ignore_error:  true

 

運行playbook:

               ansible-playbook name.yml

               經常使用選項:

                            --check|-C           只檢測可能發生的改變,不真正執行

                            --list-hosts   列出運行任務的主機

                            --limit                  主機列表,只針對主機列表中的主機執行

                            -v -vv -vvv   顯示詳細信息

                            -t tags          只執行tags標記的task

 

               

playbook變量:

               變量名:僅能由字母、數字和下劃線組成,且只能以字母開通

               變量來源:

                     1     ansible setup facts  遠程主機的全部變量均可直接調用

                            ansible all -m setup  list

                             

                            ansible webs -m  setup |grep cpu

                                           "ansible_processor_vcpus": 1,              cpu數量

                             

                            ansible    all -m setup|grep  distribution

                                           ansible_distribution_major_version     主版本號

                            ansible all -m setup  |grep os_family

                                           "ansible_os_family": "RedHat",             版本體系

                            ansible all -m setup  |grep memtotal

                                           "ansible_memtotal_mb": 980,                    內存大小

                                           

                    

                     2     在/etc/ansible/hosts中定義

                             普通變量:主機組中主機單獨定義,優先級高於公共變量

                                    [websrvs]

                                    192.168.99.101 http_port=8080 hname=www1

                                    192.168.99.102 http_port=80  hname=www2

                             公共(組)變量:針對主機組中全部主機定義統一變量:

                                   [websvrs:vars]

                                    http_port=808

                                   mark=「_」

                                    [websrvs]

                                    192.168.99.101 http_port=8080 hname=www1

                                    192.168.99.102 http_port=80 hname=www2

                    

                     3     經過命令行指定變量,優先級最高

                                    ansible-playbook -e varname=VALUE

                                    

                     4     在playbook中定義

                                    vars:

                                   - var1:  value1

                                   - var2:  value2

 

                     5     在role中定義

                    

                     6     使用專用變量文件:

                                    vars.yml

                                   var1:  httpd

                                   var2:  vsftpd

 

                                    test.yml

                                    ---

                                   - host:  webs

                                     remote_user: root

                                     vars_files:

                                          -  vars.yml

 

               ansible變量優先級:

                            命令行 -e --> playbook定義的變量  -->主機清單中定義的變量

 

               變量定義:

                             key=value1

                             http_port=80

               

               變量調用方式:

                            經過{{ variable_name }}調用變量,且變量名先後必須有空格,有時用

                                   "{{  variable_name }}" 才生效

                             

                            示例:

                                          vim  testvar.yml

                                           ---

                                          -  hosts: dbs

                                            remote_user: root

                                            vars:

                                                  - var1: httpd

                                                  - var2: vsftpd

                                            tasks:

                                                  - name: status

                                                    service: name={{ var1 }} state=reloaded

                                                  - name: rpm status

                                                    shell: rpm -q "{{ var2 }}"    

 

                                           ansible-playbook -e 'var1=dhcp var2=tftp'  testvar.yml

 

                     在配置文件中指定變量

                     ansible websvrs –m hostname  –a ‘name={{ hname }}{{ mark }}{{ http_port  }}’

                     在命令行執行變量

                     ansible websvrs –e  http_port=8000 –m hostname –a ‘name={{ hname }}{{ mark  }}{{ http_port }}’

                    

                    

 

templates:

               文本文件,嵌套有腳本

                            使用jinja2語言,使用字面量,有下面形式:

                                           字符串:使用單引號或雙引號

                                           數字:整數,浮點數

                                           列表:[item1,item2..]

                                           元組:(item1,item2,...)

                                           字典:{key1:value1,key2:value2,..}

                                           布爾型:true/false

                            算術運算:+,-,*,/,//,%,**

                            比較操做:==,!=,>,>=,<,<=

                            邏輯運算:and or not

                            流表達式: for if when

                             

               

               根據模塊文件動態生成對應的配置文件

               mkdir ansible/templates    

               在playbook同級的目錄中創建templates目錄,模板文件必須位於templates目錄下,後綴爲.j2

               使用時src就可使用默認路徑,src=文件名,

               template模塊只能在playbook使用,不能在ansible命令行使用

               

               使用template同步配置文件,在.j2  文件中支持使用ansible setup模塊中的全部變量

               且支持算術運算

               例如:

                            Listen {{ ansible_memtotal_mb//7 }}

                            Listen {{ ansible_memtotal_mb+6 }}

 

               注意:不支持兩個變量之間的算術運算:

                     例如:

                     Listen {{  ansible_memtotal_mb//ansible_distribution_major_version  }}

                     Listen {{  ansible_memtotal_mb+ansible_distribution_major_version  }}

 

 

when: 

               when語句使用jinja2表達式語法

               用在playbook中,只有當when:語句爲真時,此task才執行

               例如:

                     - name: tempalte  conf7

                       template: src=httpd.conf7.j2  dest=/etc/httpd/conf/httpd.conf

                       when: ansible_distribution_major_version ==  "7"

                    

               

with_items: 迭代

               當有須要重複性執行的任務時,可使用迭代機制

               對迭代項的引用,固定變量名爲"item"

               要在task中使用with_items給定要迭代的元素列表

               列表格式

                            字符串

                            字典

               

               示例:            

                            [root@Centos6  ~/ansible]#vim createuser.yml                       

                             ---

                            - hosts: dbs  

                              remote_user: root

                              tasks:                                                                                       

                                   - name:  create user

                                     user: name={{ item  }} 

                                     tags: create

                                     with_items:

                                          -  user1

                                          -  user2

                                          -  user3

                                   - name:  delete user

                                     user: name={{ item  }} state=absent remove=yes

                                     tags: delete

                                     with_items:

                                          -  user1

                                          -  user2

                                          -  user3

 

               示例2:

                            vim  test_item1.yml

                             ---

                            - hosts: dbs  

                              remote_user: root

                              tasks:

                                   - name: touch  some file

                                     file: name=/data/{{  item }} state=touch

                                     with_items:

                                          -  file1

                                          -  file2

                                          -  file3

                                     tags: touch

                                   - name:  delete some files

                                     file: name=/data/{{  item }} state=absent

                                     with_items:

                                          -  file1

                                          -  file2

                                          -  file3

                                     tags: del     

 

 

               item 嵌套:

               例如:     要求新建3個目錄dir1,dir2,dir3

                            而且新建3個空文件,file1,file2,file3分別位於對應的目錄

                            vim  test_items2.yml

                             ---

                            - hosts:  dbs

                              remote_user: root

                              tasks:

                                   - name:  mkdir

                                     file: name=/data/{{  item }} state=directory

                                     with_items:

                                          -  dir1

                                          -  dir2

                                          -  dir3

                                   - name: touch  file

                                     file: name=/data/{{  item.dir }}/{{ item.file }} state=touch

                                     with_items:

                                          -  { dir: dir1,file: file1 }

                                          -  { dir: dir2,file: file2 }

                                          -  { dir: dir3,file: file3 }

                                    

playbook中的for和if:

        說明:     使用jinja2 語法:

                     僅適合.j2 文件

                                   {% for p in  ports %}

                                    代碼段

                                   {% endfor  %}

                    

                                   {% if p is  defined %}

                                    代碼段

                                   {% endif  %}

                    

                     相似shell中的for使用,其中p能夠任意指定, ports 表明變量,須要與playbook主

                     腳本中的vars:下的變量一致

                     if 爲真  代碼段執行,反之不執行 defined :被定義

        

        示例1:

                     yml         vim for1.yml

                                    ---

                                   - hosts:  dbs

                                     remote_user: root

                                     vars:

                                          -  ports:

                                                  - 1001

                                                  - 1002

                                                  - 1003

                                     tasks:

                                          -  name: copy file

                                            template: src=for1.j2  dest=/data/for1.conf

                                    

                     j2            vim  templates/for1.j2

                                   {% for p in  ports %}

                                   server  {

                                          listen  {{ p }}

                                    }

                                   {%  endfor%}

                    

                     結果:    [root@2-centos6 /data]#cat for1.conf

                                   server  {

                                          listen  1001

                                    }

                                   server  {

                                          listen  1002

                                    }

                                   server  {

                                          listen  1003

                                    }

        

        示例2:

                     yml         vim for2.yml

                                    ---

                                   - hosts:  dbs

                                     remote_user: root

                                     vars:

                                          -  infos:

                                            - group: boy

                                                  name: tom

                                                  age: 18

                                                  likes: read

                                            - group: girl

                                                  name: lily

                                                  age: 19

                                                  likes: boy

                                            - group: man

                                                  name: big dog

                                                  age: 35

                                                  likes: girl

                                            - group: women

                                                  name: cherry

                                                  age: 41

                                                  likes: monny

                                     tasks:

                                          -  name: copy file

                                            template: src=for2.j2  dest=/data/for2.conf

                    

                     j2            vim  tempaltes/for2.conf

                                   {% for p in  infos %}

                                   group: {{ p.group }}

                                           the  winner is:

                                                         name: {{ p.name }}

                                                         age: {{ p.age }}

                                                         likes: {{ p.likes }}

                                   {% endfor  %}

 

                     結果:    [root@2-centos6 /data]#cat for2.conf

                                   group:  boy

                                          the  winner is:

                                                         name: tom

                                                         age: 18

                                                         likes: read

                                   group:  girl

                                          the  winner is:

                                                         name: lily

                                                         age: 19

                                                         likes: boy

                                   group:  man

                                          the  winner is:

                                                         name: big dog

                                                         age: 35

                                                         likes: girl

                                   group:  women

                                          the  winner is:

                                                         name: cherry

                                                         age: 41

                                                         likes: monny

 

 

        示例3:

                     yml:     vim  for3.yml

                                    ---

                                   - hosts:  dbs

                                     remote_user: root

                                     vars:

                                          -  webs:

                                                  - addr: 10.magedu.com

                                                    port: 810

                                                  - addr: 20.magedu.com

                                                    port: 820

                                                    rootdir:  /data/root20/

                                                  - addr: 30.magedu.com

                                                    port: 830

                                                    rootdir:  /data/root30/

                                     tasks:

                                          -  name: copy file

                                            template: src=for3.j2  dest=/data/for3.conf

 

                     j2:           vim templates/for3.j2  

                                   website  list:

                                   {% for p in  webs %}

                                                  website: {{ p.addr }}

                                                  port: {{ p.port }}

                                   {% if p.rootdir is defined %}

                                                  rootdir: {{ p.rootdir }}

                                   {%  endif%}

 

                                   {%  endfor%}

 

                     結果:    [root@2-centos6 /data]#cat for3.conf

                                   website  list:

                                                  website: 10.magedu.com

                                                 port: 810

 

                                                  website: 20.magedu.com

                                                  port: 820

                                                  rootdir: /data/root20/

 

                                                  website: 30.magedu.com

                                                  port: 830

                                                  rootdir: /data/root30/

                                    

 

roles:---------------------------------------------------------------------------

               將本來playbook中的各個tasks,handlers,vars,拆分紅單獨的小模塊

               而playbook主文件:

                             main.yml中使用

                                   -  include:(舊)

                                   -  import_tasks: (新)

                            調用模塊                                    

               

               目錄編排:

                            [root@Centos6  ~/ansible/roles]#tree

                             .

                            └── nginx              

                                   ├──  files          

                                   ├──  handlers   

                                   ├──  tasks

                                   ├──  templates

                                   └──  vars

               

                      roles下新建目錄即爲項目名稱:需包含如下子目錄

                     files/:             存放copy或script模塊等調用的文件

                     templates/:  template模塊查找所須要的模板文件的目錄

                     tasks/:    定義task,role的基本元素,至少應該包含一個名爲main.yml的文件,

                                           其餘的文件須要在此文件中經過include包含

                     handlers/:     至少應該包含一個名爲main.yml的文件,其餘的文件須要在此文件中經過include包含

                     vars/:             定義變量。至少應該包含一個名爲main.yml的文件

                                           其餘的文件須要在此文件中經過include包含

                     meta/:             定義當前角色的特殊設定及其依賴關係,至少應該包含一個名爲main.yml的文件

                                           其它文件需在此文件中經過include進行包含

                     default/:       設定默認變量時使用此目錄中的main.yml文件

                    

 

建立role的步驟:

               1     建立以roles命名的目錄

               2     在roles目錄中分別建立以各角色名稱命名的目錄,如nginx

               3     在每一個角色命名的目錄中分別建立files,handlers,meta,tasks,templates和vars目錄

                      如用不到的空目錄,也不可不用建立

               4     角色編輯

               5     在playbook文件中,調用各角色

 

 

role建立示例:

                     [root@Centos6  ~/ansible/roles]#tree

                     .

                     └──  nginx

                            ├──  files

                            │   └──  f1

                            ├──  handlers

                            │   └──  main.yml

                            ├──  tasks

                            │   ├──  copyfile.yml

                            │   ├──  groupadd.yml

                            │   ├──  main.yml

                            │   ├──  start.yml

                            │   ├──  templ.yml

                            │   ├──  useradd.yml

                            │   └──  yum.yml

                            ├──  templates

                            │   └── nginx.conf.j2

                            └──  vars

 

role建立:

cd roles/nginx

               cd tasks/

                            vim  groupadd.yml

                            - name: create group  nginx

                              group: name=nginx system=yes  gid=80

                             

                            vim  useradd.yml

                            - name: add user  nginx

                           user: name=nginx uid=80 system=yes  shell=/sbin/nologin

 

                            vim  yum.yml

                            - name: install  package

                              yum: name=nginx                 

 

                            vim  templ.yml

                            - name: copy  conf

                              template: src=nginx.conf.j2 dest=

                              when: ansible_distribution_major_version ==  "6"

                              notify: reload conf

 

                            vim  copyfile.yml

                            - name: copy  file

                              copy: src=f1  dest=/var/lib/nginx

 

                            vim  start.yml

                            - name: start  service

                              service: name=nginx state=started  enabled=yes

 

                            vim  main.yml

                            - import_tasks:  groupadd.yml

                            - import_tasks:  useradd.yml

                            - import_tasks:  yum.yml

                            - import_tasks:  templ.yml

                            - import_tasks:  copyfile.yml

                            - import_tasks:  start.yml     

        

               cd handlers/

                            vim  mian.yml

                            - name: reload  conf

                              service: name=nginx state=reloaded    

        

               cp /etc/nginx/nginx.conf templates/nginx.conf.j2

               vim templates/nginx.conf.j2

                            worker_processes  {{ ansible_processor_vcpus*10 }};

 

               touch files/f1

 

 

role調用:調用roles的playbook 要與roles目錄在一個目錄中       

               vim nginx.role.yml

               ---

               - hosts: dbs

                 remote_user:  root

                 roles:

                     - role:  nginx

        

引用另一個role中的單個任務,以下,使用完整路徑引用便可

                     vim  main.yml

                     - include:  group.yml

                     - include:  user.yml

                     - include:  yum.yml

                     - include:  templ.yml

                     - include:  start.yml

                    

                     - include:  roles/httpd/tasks/copyfile.yml     

        

role調用中的tags使用:

 

                     vim  some_role.yml

                     - hosts:  webs

                       remote_user: root

                       roles:

                            - { role: nginx,tags: ['web','nginx'] }

                            - { role: httpd,tags: ['web','httpd'],when:  ansible_distribution_major_version == "7" }

                            - { role: app,tags: ['app'] }

 

                     ansible-playbook -t web  some_role.yml  挑標籤執行

 

        

推薦資料:     

        http://galaxy.ansible.com

    https://galaxy.ansible.com/explore#/

    http://github.com/

    http://ansible.com.cn/

    https://github.com/ansible/ansible

    https://github.com/ansible/ansible-examples

 

筆記整理完成時間:2018年5月31日20:33:43

相關文章
相關標籤/搜索