ansible運維自動化工具

 

ansible簡介

運維工具分類:

        agent:基于專用的agent程序完成管理功能,puppet, func, zabbix, …
        agentless:基于ssh服務完成管理,ansible, fabric, … 

Ansible默認通過  SSH 協議管理機器

 
ansible 架構:
  Ansible Core:absible核心
      Modules:
           Core Modules:內鍵模塊
           Customed Modules:自定義模塊
   Host Iventory:主機清單,定義要管理的主機

            可以是Files

             可以是CMDB     

   PlayBooks:定義主機要使用的那些角色      

             Hosts
             roles
  Connection Plugins:連接插件:并發連接默認一次管理5


ansible特性:

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

                  基于Python語言開發,由Paramilo,PYYAMLJinjia2(模板庫)單個核心庫實現

                  部署簡單:agentless

                  強大的playbook機制

                  冪等性,一個playbook可以在同一臺主機使用多次,效果一樣

                  默認沒有server

                  不依賴證書

                  支持任何編程語言編寫自動義模塊


ansible安裝:

    ansible軟件包位于epel源中,配置好epel源直接安裝即可

    yum install ansible

    安裝完成后成程序:
     ansible
     ansible-playbook
     ansible-doc

    ansible主要文件:

        配置文件:
       /etc/ansible/ansible.cfg
      主機清單:
       /etc/ansible/hosts
      插件目錄:
       /usr/share/ansible_plugins/

ansible簡單使用:

    ansible命令:
       Usage: ansible <host-pattern> [options] 
   常用選項:
    -m MOD_NAME  -a MOD_ARGS


ansible配置


    1、配置基于ssh無密碼登錄要管理的主機,在ansible管理主機上生成公鑰 ssh-keygen -t rsa

        ansible運維自動化工具

       

    2、將生成的公鑰發送到要管理主機的家目錄中ssh-copy-id root@ip

        2.png

    3、編輯/etc/ansible/hosts文件,配置管理主機清單

       3.png


ansible管理遠程主機命令:

   模塊:
   獲取模塊列表:ansible-doc -l
   獲取指定模塊的使用幫助:ansible-doc -s MOD_NAME



ansible常用模塊:

    1、 ping:探測目標主機是否存活;


    ansible運維自動化工具   
 

   2、command:在遠程主機執行命令;不支持特性的命令

 

ansible運維自動化工具

ansible運維自動化工具


    
  

 3、shell:在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,例如管道等 ;

注意:command和shell模塊的核心參數直接為命令本身;而其它模塊的參數通常為“key=value”格式;

ansible運維自動化工具

  copy: 用法:
     (1) 復制文件
      -a "src=  dest=  "
     (2) 給定內容生成文件
      -a "content=  dest=  "
      
     其它參數:mode, owner, group, ...

 ansible運維自動化工具

 

file:設置文件屬性

    用法:

     (1) 創建目錄:

      -a "path=  state=directory"

     (2) 創建鏈接文件:

      -a "path=  src=  state=link"

     (3) 刪除文件:

      -a "path=  state=absent“

ansible運維自動化工具

ansible運維自動化工具

ansible運維自動化工具

fetch:從遠程主機拉去文件

ansible運維自動化工具

  
   cron:管理遠程主機自動化任務
    -a ""
     minute=
     hour=
     day=
     month=
     weekday=
     job=
     name=
     user=
     
     state={present|absent} present:新建計劃任務默認選項  absent:刪除計劃任務

ansible運維自動化工具

ansible運維自動化工具

ansible運維自動化工具

 
   hostname:管理主機名
    name=

ansible運維自動化工具

  
   yum:yum包管理    -a ""     (1) name=  state={present|latest}  安裝包可以使用present或者absent
     (2) name=  state=absent

 ansible運維自動化工具

  
  service:服務啟動管理
    -a ""
     name=
     state=
      started
      stopped
      restarted
     enabled=
     runlevel=
  
   group: A d d   o r   r e m o v e   g r o u p s
    -a ""
     name=
     state=
     system=
     gid=
     
   user:M a n a g e   u s e r   a c c o u n t s
    -a ""
     name=
     group=
     groups=
     comment=
     uid=
     system=
     shell=
     expires=
     home=
  
   setup:獲取遠程主機中信息

 

playbook 編寫:

YAML:
   YAML is a data serialization format designed for human readability and  interaction with scripting languages.
   YAML:編程語言
   程序包:PyYAML
   數據結構:

    key:value   
    - item1
    - item2
    - item3
    {name:jerry, age:21}
palybook作用:
   將遠程操作的命令通過YAML語言編寫腳本,通過執行腳本完成操作
   
PlayBook:

   核心元素:

    Tasks:任務,由模塊定義的操作的列表;

    Variables:變量

    Templates:模板,即使用了模板語法的文本文件;

    Handlers:由特定條件觸發的Tasks;

    Roles:角色;

    

 playbook的基礎組件:

   Hosts:運行指定任務的目標主機;
   remote_user:在遠程主機以哪個用戶身份執行;
   sudo_user:非管理員需要擁有sudo權限;

    
        
  運行playbook:
       運行playbook,使用ansible-playbook命令

    (1) 檢測語法

     ansible-playbook  --syntax-check  /path/to/playbook.yaml

    (2) 測試運行

     ansible-playbook -C /path/to/playbook.yaml

      --list-hosts

      --list-tasks

      --list-tags
   (3) 運行

     ansible-playbook  /path/to/playbook.yaml

      -t TAGS, --tags=TAGS  :只運行某TAGS的命令

      --skip-tags=SKIP_TAGS

      --start-at-task=START_AT    
   

      

    示例:

    - hosts: websrvs

      remote_user: root

      tasks:

      - name: install httpd package

         yum: name=httpd state=latest

       - name: install conf file

         copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf

         notify: restart httpd service

        - name: start httpd service

        service: name=httpd state=started

      handlers:

        - name: restart httpd service

       service: name=httpd state=restarted


playbook  tasks創建實例:

大寫的注意:注意腳本之間的縮進,縮進錯誤也會包語法錯誤,縮進為2個字符


 tasks:任務列表
      模塊,模塊參數:
       格式:
        (1) action: module arguments
        (2) module: arguments


 1、給webservers組中的所有主機創建grp組,和用戶mygrp ,并所屬組為grp

 

ansible運維自動化工具

2、給所有的webservers組中的主機安裝web服務,并啟動端口為8080
    注意:保障每個主機中的yum源配置
    方法一:在ansible主機中編譯httpd.conf文件,將端口改成8080,并將httpd.conf文件復制給每個主機
    (注意:此方法適應于相同版本的應用程序,否則配置文件不聽可能會出錯)
    方法二:不同版本之間可以用命令直接更改

20.png     

 

 

21.png

 

playbook  handlers介紹及實例:

  handlers:由特定條件觸發的Tasks;
    調用及定義方式:
    tasks:
    - name: TASK_NAME
      module: arguments
      notify: HANDLER_NAME
    handlers:
    - name: HANDLER_NAME
      module: arguments
3、出發操作,httpd配置文件發生變化時,執行restart命令

 

22.png

playbook  tags語法及實例:

 

tags:給指定的任務定義一個調用標識;指在tasks中定義,在handlers中定義不生效
    - name: NAME
      module: arguments
      tags: TAG_ID
              
4、定義重啟操作標簽切restart ,下次啟動時可以直接執行重啟,而不執行其他腳本中的任務

23.png24.png

 

playbook  vaiable語法以及實例:

 
 Variables:
    類型
     內建:
      (1) facts
    自定義:
      (1) 命令行傳遞;
        -e VAR=VALUE
      (2) 在hosts Inventory(清單)中為每個主機定義專用變量值;
         (a) 向不同的主機傳遞不同的變量 ;
          IP/HOSTNAME variable_name=value
       (b) 向組內的所有主機傳遞相同的變量 ;
        [groupname:vars]
        variable_name=value
      (3) 在playbook中定義
         vars:
         - var_name: value
         vars:
         - var_name: value
      (4) Inventory還可以使用參數:

       用于定義ansible遠程連接目標主機時使用的屬性,而非傳遞給playbook的變量;
        ansible_ssh_host  :指定ansible遠程連接主機使用的哪個ip地址
        ansible_ssh_port  :指定ansible遠程連接主機使用的哪個端口
        ansible_ssh_user
        ansible_ssh_pass
        ansible_sudo_pass

      (5) 在角色調用時傳遞
       roles:
       - { role: ROLE_NAME, var: value, ...}

    變量調用:
      {{ var_name }}
    注意::-e傳遞的變量值會覆蓋playbook和hosts傳遞的變量值
      
 實例:    
 5、而根據不同主機安裝和卸載不同的程序包

 

      

   
   ※編寫腳本vim /root/bin/install.yaml

    25.png

  
   ※通過執行腳本傳遞參數

26.png

   
   ※通過/etc/absible/hosts傳遞參數,

ansible運維自動化工具

ansible運維自動化工具

  
  ※通過playbook中傳遞參數

30.png

 

playbook Templates 語法以及使用:

  
  什么是模板:文本文件,內部嵌套有模板語言腳本(使用模板語言編寫)
  編寫語言:jinja2
  語法:
     字面量:
     字符串:使用單引號或雙引號; 
      數字:整數、浮點數;
      列表:[item1, item2, ...] 
      元組:(item1, item2, ...) 是一個不可變類型
      字典:{key1:value1, key2:value2, ...} :以鍵值對隊存儲數據
      布爾型:true/false
  
     算術運算:
      +, -, *, /, //, %, **

     比較操作:
      ==, !=, >, <, >=, <=
     邏輯運算:and, or, not 
  
     執行模板文件中的腳本,并生成結果數據流,需要使用template模塊;
     template:
      -a ”“
       src=
       dest=
       mode=
       onwer=
       group=

     注意:此模板不能在命令行使用,而只能用于playbook;
     
     
     示例:
     題目:將nginx安裝到ngxsrvs組中的服務器中,并啟動nginx,啟動時的wordpress為cpu核心數
     思路:每臺主機的cup核心數不同,要完成操作,就必須用變量代表,ansible內嵌了ansible_process_vpus
     變量,可獲取每臺主機的cpu核心數
     步驟:  
     1、 在ansible主機中安裝nginx為了生成nginx.conf文件
     2、更改配置文件nginx.conf文件worker_processes {{ ansible_processes_vpus }};
     3、復制文件到/root/目錄下并更改名稱為/etc/nginx.conf.j2
     4、編寫腳本 :installnginx.yaml
      - hosts: ngxsrvs
      remote_user: root
      tasks:
      - name: install nginx package
      yum: name=nginx state=latest
      - name: install conf file
      template: src=/root/nginx.conf.j2 dest=/etc/nginx/nginx.conf
      tags: ngxconf
      notify: reload nginx service
      - name: start nginx service
      service: name=nginx state=started enabled=true
      handlers:
      - name: reload nginx service
      shell: /usr/sbin/nginx -s reload       

   條件測試:
    when語句:在tasks中使用,Jinja2的語法格式;
     -  hosts: all
     remote_user: root
     tasks:
     - name: install nginx package
     yum: name=nginx state=latest
     - name: start nginx service on CentOS6
     shell: service nginx start
     when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
     - name: start nginx service
     shell: systemctl start nginx.service
     when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"     

   循環:迭代,需要重復執行的任務;

    對迭代項的引用,固定變量名為"item”,使用with_item屬性給定要迭代的元素;
     元素:列表
      字符串
      字典     
   基于字符串列表給出元素示例:
    - hosts: websrvs
      remote_user: root
      tasks:
      - name: install packages
        yum: name={{ item }} state=latest
        with_items:
        - httpd
        - php
        - php-mysql
        - php-mbstring
        - php-gd

        

    基于字典列表給元素示例:
      -  hosts: all
      remote_user: root
      tasks:
      - name: create groups
      group: name={{ item }} state=present
      with_items:
      - groupx1
      - groupx2
      - groupx3
      - name: create users
      user: name={{ item.name }} group={{ item.group }} state=present
      with_items:
      - {name: 'userx1', group: 'groupx1'}
      - {name: 'userx2', group: 'groupx2'}
      - {name: 'userx3', group: 'groupx3'}

ansible roles語法和使用:

 

角色:roles

   角色概念:以特定的層級目錄結構進行組織的tasks、variables、handlers、templates、files等,方便調用;
    role_name/:角色名稱,例如安裝httpd,在/etc/ansible/roles中常見httpd文件,在httpd文件中常見以下的目錄。httpd則為角色名

     files/:存儲由copy或script等模塊調用的文件; 
     tasks/:此目錄中至少應該有一個名為main.yml的文件,用于定義各task;其它的文件需要由main.yml進行“包含”調用;
     handlers/:此目錄中至少應該有一個名為main.yml的文件,用于定義各handler;其它的文件需要由main.yml進行“包含”調用;
     vars/:此目錄中至少應該有一個名為main.yml的文件,用于定義各variable;其它的文件需要由main.yml進行“包含”調用;
     templates/:存儲由template模塊調用的模板文本;
     meta/:此目錄中至少應該有一個名為main.yml的文件,定義當前角色的特殊設定及其依賴關系;其它的文件需要由main.yml進行“包含”調用;
     default/:此目錄中至少應該有一個名為main.yml的文件,用于設定默認變量;

   ansible中角色默認存放路徑為:/etc/ansible/roles中
   更改角色路徑:便捷/etc/ansible/ansible.cfg
   roles_path=/path/to/somefile
     
   在playbook中調用角色的方法:
   - hosts: HOSTS
      remote_user: USERNAME
      roles:
      - ROLE1:角色名
      - ROLE2
      - { role: ROLE3, VARIABLE: VALUE, ...} :在調用角色的同時傳遞參數
      - { role: ROLE4, when: CONDITION }:在調用角色的同時給出條件
  
  角色實用實戰:
  利用角色安裝memcache,并將啟動的內存設置為總內存的4分之一
  步驟一:
  1、創建memcache角色
    mkdir /etc/ensible/roles/memcached 
  2、在memcached創建tasks 和templates文件
  3、在tasks文件中創建main.yml文件
  4、修改memcache配置文件/etc/sysconfig/memcached文件并將文件拷貝到/etc/ansible/roles/memcahced/templates中,重名為為
  memcahced.conf.j2
  5、編寫playbook調用此角色

1、main.yml 和 playbook文件

 

ansible運維自動化工具

ansible運維自動化工具

 

原創文章,作者:wangnannan,如若轉載,請注明出處:http://www.www58058.com/57578

(1)
wangnannanwangnannan
上一篇 2016-11-10
下一篇 2016-11-11

相關推薦

  • 文件查找與壓縮-1

       1、 locate命令(非實時查找即數據庫查找) 1)、查詢系統上預建的文件索引數據庫/var/lib/mlocate/mlocate.db      依賴于事先構建的索引;索引的構建是在系統較為空閑時自動進行( 周期性任務) 或者管理員手動更新數據庫即是執行#updatedb命令;引構建過程…

    Linux干貨 2016-08-15
  • Linux簡述與部分基礎命令

    Linux簡述與基礎命令

    Linux干貨 2017-12-04
  • 那些年我們一起追過的緩存寫法(二)

    原文出處: 蘑菇先生   上次主要討論緩存讀寫這塊各種代碼實現。本篇是就上次的問題接著來,繼續看那些年我們各種緩存用法。 一:緩存預熱 上次有同學問過。在第一次加載時,我們的緩存都為空,怎么進行預熱。 單機Web情況下,一般我們使用RunTimeCache。相對于這種情況下: 1:我們可以在啟動事件里面刷新 1 2 3 4 vo…

    Linux干貨 2015-03-04
  • HAProxy實戰(一)

    實驗目的 測試基于haproxy的反代和負載均衡配置 測試keepalived高可用haproxy的效果 實驗要點 (1) 動靜分離discuzx,動靜都要基于負載均衡實現;(2) 進一步測試在haproxy和后端主機之間添加varnish緩存;(3) 給出拓撲設計;(4) haproxy的設定要求: (a) 啟動stats;(b) 自定義403、502和5…

    Linux干貨 2017-02-13
  • 馬哥教育網絡班21期+第1周課程練習

    一、計算機原理及組成部分 數學家馮·諾依曼,按不同功能把計算機分成了五大組成部分:運算器、控制器、存儲器、輸入設備、輸入出設備。 現代計算機把運算器和控制器集成在一起,稱為CPU,主要進行各種數據運算和對各種命令進行解釋;存儲器被分為兩類,一類以內存為代表的隨機存儲設備,主要特點是速度快,容量有限,斷電后信息就消失,另一類是硬盤為代表的外部存儲設備,容量大,…

    Linux干貨 2016-06-26
  • N26 第六周博客作業

    請詳細總結 vim 編輯器的使用并完成以下練習題 ## VIM 使用總結 首先 VIM 是 VI IMproved 的縮寫,是 vi 編輯器的增強型。它與 sed awk 并稱為文本處理三劍客。其主要作者 Bram Moolenaar 也是個非常有愛心的人,在 vim 的[官網](http://www.vim.org/) 和 在命令行中直接輸入 vim 的命…

    Linux干貨 2017-03-11
欧美性久久久久