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 20:07
下一篇 2016-11-11 08:41

相關推薦

  • 馬哥教育網絡21期+第一周練習博客

    一、描述計算機的組成及其功能。   計算機設備是由運算器、控制器、存儲器、輸入設備和輸出設備組成。它們的功能和對應設備分別如下: 運算器(arithmetic unit):在計算機中執行各種算術和邏輯運算操作的部件。運算器包括寄存器、執行部件和控制電路3個部      &nbsp…

    Linux干貨 2016-07-12
  • vsftp通過pam_mysql做虛擬用戶認證

    vsftpd可以通過三種賬戶登錄系統: 系統賬戶:系統本地賬戶登錄系統,默認進入的目錄是用戶家目錄,可以在所有有權限的路徑切換; 匿名賬戶:匿名用戶登錄,然后映射為一個本地用戶; 虛擬賬戶:既不是系統本地用戶也不是匿名用戶,而是通過pam做第三方認證的方法,支持文件和數據庫,ldap的認證,此處通過mysql進行實驗; 一、準備實驗環境 實驗在一臺虛擬機上進…

    Linux干貨 2017-06-07
  • 馬哥教育網絡班22期+第三周課程練習

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。  who | tr -s [[:space:]] | cut -d" " -f1 | sort -u [root@localhost cdrom]# who root     pts/1     &…

    Linux干貨 2016-09-07
  • ?linux文件類型及顏色標識整理

          linux文件類型及顏色標識整理                      &…

    Linux干貨 2016-10-17
  • MySQL管理應用入門(一)

    什么是數據庫? 數據庫(Database)是按照數據結構來組織、存儲和管理數據的建立在計算機存儲設備上的倉庫。 簡單來說是本身可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。 在經濟管理的日常工作中,常常需要把某些相關的數據放進這樣的“倉庫”,并根據管理的需要進行相應的處理。 例如, 企業或事業單位的人事部…

    Linux干貨 2017-07-08
  • 自制linux系統

    本文主要通過裁剪現有Linux系統,打造一個屬于自己的Linux小系統,讓其能夠裝載網卡驅動,并配置IP地址,實現網絡功能。 自制linux系統 步驟概述: 1、新建一個硬盤2、在該新硬盤上新建兩個分區,一個當boot分區,一個當/分區3、格式化并且掛載兩個分區4、安裝grub至目標磁盤5、為grub提供配置文件6、復制內核文件和initrd文件7、創建目標…

    Linux干貨 2016-09-13
欧美性久久久久