運維自動化ansible基礎

雲計算三種服務架構

   IAAS:python

              不提供OS  只購買硬件(網絡,存儲,計算)nginx

   PAAS:web

              提供硬件和OS和開發和運行環境  只須要開發應用軟件redis

   SAAS:shell

              提供 硬件 os 軟件   至關於直接購買軟件服務器

Ansible介紹

     1.有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊 網絡

     2.部署簡單,基於python和SSH(默認已安裝),agentless 數據結構

     3.支持playbook編排任務 編排定義Ansible任務集的配置 文件,由Ansible順序依次執行,一般是JSON格式的YML文件 架構

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

 

主機清單inventory

    ansible只有首先配置好主機清單纔可以管理其它主機,若是沒有配置ansible將沒法管理任何主機

    默認的inventory file 爲   /etc/ansible/hosts

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

 

Ansible執行命令流程

 ansible命令執行過程  

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

    2. 加載本身對應的模塊文件,如command

    3. 經過ansible將模塊或命令生成對應的臨時py文件,並將該 文件傳輸至遠程服務器 的對應執行用戶$HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY文件 

    4. 給文件+x執行 

    5. 執行並返回結果 

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

    執行狀態:

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

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

         紅色:執行失敗 

Ansible的安裝和基本模塊的使用

[root@localhost ~]# yum install ansible
[root@localhost ~]# ansible --version
ansible 2.5.3
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Aug  4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]
[root@localhost ~]# vi /etc/ansible/hosts
[root@localhost ~]# ansible 192.168.231.7 -m ping -k
SSH password: 
192.168.231.7 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
[root@localhost .ssh]# ansible webservers -m ping -k
SSH password: 
192.168.231.7 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
[root@localhost .ssh]# ansible 192.168.231.7  -vvv -m ping -k
 # -vvv 輸出ansible操做的詳細信息,能夠看成調試日誌
[root@localhost .ssh]# ssh-keygen
[root@localhost .ssh]# ssh-copy-id 192.168.231.7
[root@localhost .ssh]# ansible all -m command -a 'ss -ntul'
#command模塊不支持命令管道(|),重定向(>),變量($HOSTNAME)
[root@localhost .ssh]# ansible all -m shell -a 'echo $HOSTNAME'
[root@localhost .ssh]# ansible all -m shell -a 'echo "333">1ansible.aaa'
192.168.231.7 | SUCCESS | rc=0 >>
[root@localhost .ssh]# ansible all  -a 'echo "333">1ansible.aaa'
192.168.231.7 | SUCCESS | rc=0 >>
333>1ansible.aaa
[root@localhost ~]# ansible all -m fetch -a 'src=/root/guess.sh dest=/root'
#owner  mode
#fetch 只能拉取文件,不能拉取目錄或者匹配通配符
192.168.231.7 | SUCCESS => {
    "changed": true, 
    "checksum": "656427f4ebbcbb4745fa80fbffc456b88378c4ed", 
    "dest": "/root/192.168.231.7/root/guess.sh", 
    "md5sum": "435fe28b40aa89a35f9dc63c7063b1a7", 
    "remote_checksum": "656427f4ebbcbb4745fa80fbffc456b88378c4ed", 
    "remote_md5sum": null
}
[root@localhost ~]# ansible all -m file -a 'name=/root/yxh state=directory'
#file模塊包括對文件夾的操做
#file不能刪除使用通配符批量刪除目錄下的文件,只能刪除整個目錄
[root@localhost ~]# ansible all -m shell -a 'rm -fr /data/*'
View Code

 

YAML語法簡介 

   使用#號註釋代碼

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

   縮進的級別也必須是一致的,一樣的縮進表明一樣的級別,程序判別配置的級別是經過縮進結合換行來實現的 

   YAML文件內容和Linux系統大小寫判斷方式保持一致,是區別大小寫的,k/v的值均需大小寫敏感 

   k/v的值可同行寫也可換行寫,同行使用:分隔

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

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

   一個name只能包括一個task

   YAML文件擴展名一般爲yml或yaml 

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

   Dictionary:   字典,一般由多個key與value構成      skill: Elite

   也能夠將key:value放置於{}中進行表示,   用,分隔多個key:value    {name: Example Developer, job: Developer, skill: Elite} 

   YAML的語法和其餘高階語言相似,而且能夠簡單表達清單、散列表、標量等數據結構.

   其結構(Structure)經過空格來展現,序列(Sequence)裏的項用 "-" 來表明,Map裏的鍵值對用":"分隔 

   children:       children表示一個序列,   name 和 age 表示序列中的一個數據項

     -   name: Jimmy Smith         

         age: 17       

     -   name: Jenny Smith       

        age 13        

 

 Playbook介紹

     playbook是由一個或多個  "play" 組成的列表

     play的主要功能在於將事先歸併爲一組的主機裝扮成事先經過ansible中的task定義好的角色.

     所謂task無非是調用ansible的一個module. 將多個play組織在一個playbook中,便可以讓它們聯同起來按事先編排的機制順序執行

 

    playbook變量介紹

     1.普通(主機)變量   在inventory中定義主機時爲其添加主機變量以便於在playbook中使用 

          [websrvs]

         192.168.99.101   http_port=8080  hname=www1

         192.168.99.102   http_port=80       hname=www2 

     2.組變量    組變量是指賦予給指定組內全部主機上的在playbook中可用的變量         

          [websrvs]

          www1.magedu.com

          www2.magedu.com

         [websrvs:vars]

         ntp_server=ntp.magedu.com

         nfs_server=nfs.magedu.com

 

     3.命令行指定變量       

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

 

     4.在playbook中定義

         vars:

             - var1: value1

             - var2: value2 

      5.單獨使用一個yaml文件定義全部的變量 

        vi    myvars.yaml    

              var1: httpd
              var2: vsftpd
              var3: nginx

      vi   playbook.yaml

          vars_files:

             -  myvars.yaml

          task:

             - name:  install {{  var1  }} package

      6.在role中定義 

 

    變量的優先級

           1. 經過命令行指定變量,優先級最高            ansible-playbook –e varname=value 

           2. 在playbook中定義的變量

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

           4.公共(組)變量: 針對主機組中全部主機定義統一變量   優先級最低

    變量的調用方式

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

   

yaml文件中的縮進是很是重要的,同一級別的必須寫到同一個縮進,不然程序沒法運行
yaml裏面的task是按照次序依次執行,不會出現執行順序不一樣的問題
一個name只能包含一個task(命令模塊)
#按照指定的task的順序依次執行
#ansible的task中相對路徑是相對於當前yaml文件的所在目錄
[root@localhost playbook]# ansible-playbook test2.yaml 

PLAY [webservers] ***************************************************************************************

TASK [Gathering Facts] **********************************************************************************
ok: [192.168.231.7]

TASK [create new file] **********************************************************************************
changed: [192.168.231.7]

TASK [create new user] **********************************************************************************
changed: [192.168.231.7]

TASK [copy file] ****************************************************************************************
changed: [192.168.231.7]

TASK [start httpd] **************************************************************************************
changed: [192.168.231.7]

PLAY RECAP **********************************************************************************************
192.168.231.7              : ok=5    changed=4    unreachable=0    failed=0   

[root@localhost playbook]# ansible-playbook test2.yaml --list-tasks

playbook: test2.yaml

  play #1 (webservers): webservers    TAGS: []
    tasks:
      create new file    TAGS: []
      create new user    TAGS: []
      copy file    TAGS: []
      start httpd    TAGS: []
[root@yxh6 conf]# netstat -ntlp | grep httpd
tcp        0      0 :::9527                     :::*                        LISTEN      8013/httpd   



---
- hosts: webservers
  remote_user: root

  tasks:
    - name: install httpd pagckage
      yum: name=httpd
      tags: installhttpd
    - name: copy conf file action
      copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
      notify: restart httpd service
    - name: start httpd service
      service: name=httpd state=started enabled=yes
      tags: rshttpd
playbook執行順序
#tags inshttpd,rshttpd
#經過ansible命令單獨執行指定標籤的task action命令,而不是執行整個playbook.
#多個action能夠共用一個標籤
[root@localhost playbook]# ansible-playbook -t inshttpd,rshttpd handler.yaml

---
- hosts: webservers
  remote_user: root

  tasks:
    - name: install httpd pagckage
      yum: name=httpd
      tags: installhttpd
    - name: copy conf file action
      copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
      notify: restart httpd service
    - name: start httpd service
      service: name=httpd state=started enabled=yes
      tags: rshttpd
playbook標籤
#ansible收集主機信息,同時也能夠作爲變量傳遞給playbook中
[root@localhost playbook]# ansible webservers -m setup
[root@localhost playbook]# ansible webservers -m setup -a 'filter=*address*'
#playbook中自定義變量{{ bialiangmin }}
  tasks:
    - name: install {{ packname }}  pagckage
      yum: name={{ packname }}
      tags: installhttpd

#執行的時候傳遞變量值
[root@localhost playbook]# ansible-playbook -e 'packname=vsftpd' bianliang.yaml 
[root@localhost playbook]# ansible-playbook -e 'packname=vsftpd packname2=redis' bianliang.yaml 

PLAY [webservers] ***************************************************************************************

TASK [Gathering Facts] **********************************************************************************
ok: [192.168.231.6]

TASK [install vsftpd  pagckage] *************************************************************************
changed: [192.168.231.6]

PLAY RECAP **********************************************************************************************
192.168.231.6              : ok=2    changed=1    unreachable=0    failed=0   

變量使用的第二種方式:
- hosts: webservers
  remote_user: root
  vars:
    - packname: httpd
    - packname2: vsftpd

變量使用的第三種方式
  在/etc/ansible/hosts中定義
playbook變量
 1 ---
 2 - hosts: webservers
 3   remote_user: root
 4 
 5   tasks:
 6     - name: install httpd pagckage
 7       yum: name=httpd
 8       tags: installhttpd
 9     - name: copy conf file action
10       copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
11       notify: restart httpd service
12     - name: start httpd service
13       service: name=httpd state=started enabled=yes
14       tags: rshttpd
15 
16   #handlers必須和notify配合使用,二者不能分開使用
17   handlers:
18     - name: restart httpd service
19       service: name=httpd state=restarted
20     - name: testaction
21       shell: ls            
playbook案例
相關文章
相關標籤/搜索