Ansible的基礎知識

為什么要學習ansible:

    ansible是自動化運維的一種工具,使用ansible可以一次性管理多臺主機,為多臺主機安裝或這執行相同或者不同的操作,省去了一臺臺主機去重復執行相同的任務,可以使用corn選項結合本機的crontab設置本主機的任務性計劃,比如,每天導出nginx的access.log和error.log到指定的主機,我們分析相應的日志,而達到監控整個網絡架構的目的。

下圖是ansible和所有軟件,操作系統之間的關系:

    

blob.png

  

file://C:\Users\sjsir\AppData\Local\Temp\ct_tmp/1.png

1.ansible的框架:
    Ansible Core:ansible的主要核心
    Modules:模塊
        Core Modules:內核模塊
        Customed Modules:相關的模塊
    Host Iventory
        Files
        CMDB
    PlayBooks
        Hosts <–> roles
    Connection Plugins
   

blob.png

 
2.特性:
    高度模塊化:調用特定的模塊,完成特定的任務;
    基于Python語言開發,由Paramiko,PyYAML和jinja2三個核心庫實現;
    部署簡單:agentless;
    支持自定義模塊,使用任意編程語言;
    強大的playbook機制;
    冪等性;  
3.安裝和使用:ansible(epel源)
    安裝:yum -y install ansible
    程序環境:
        ansible
        ansible-playbook
        ansible-doc
    配置文件:
        /etc/ansible/ansible.cfg
    主機清單:
        /etc/ansible/hosts
    插件目錄:
        /usr/share/ansible_plugins/

    安裝和基本部署ansible服務:(包括遠程主機的簡單配置)

        配置epel源

        yum -y install ansible

        ssh-keygen -t rsa -P ''

        vim /etc/ansible/hosts

        [web_server]

        192.168.1.147

        [db_server]

        192.168.1.148

        ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.1.147

        ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.1.148

        簡單測試:

            ansible all -a 'who'

4.基本使用入門:
    ansible命令:
        Usage: ansible <host-pattern> [options]
        常用選項:
            -m MOD_NAME  -a MOD_ARGS
    配置Host Inventory
        /etc/ansible/hosts
        [group_id]
        HOST_PATTERN1
        HOAT_PATTERN2
    模塊:
        獲取模塊列表:ansible-doc -l
        獲取指定模塊的使用幫助:ansible-doc -s MOD_NAME
    常用模塊:
        ping:探測目標主機是否存活;
        command:在遠程主機執行命令;(不會理解管道操作)
            ansible all -m command -a "useradd centos"
        shell: 在遠程主機上調用shell解釋器運行命令,支持shell命令的各種功能,例如管道;
            注意:command和shell模塊的核心參數直接作為命令本身;而其他模塊的參數通常為"key=value"格式;
        copy:復制文件到遠程主機;(mode,owner,group,…)
            用法:
            (1)復制文件:-a "src=  dest= "
                eg:ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=640"
            (2)給定內容生成文件:-a "content=  dest= "
                eg:ansible all -m copy -a "content='hello\nworld' dest=/tmp/test.ansible mode=640"
        file:設置文件屬性;
            用法:
            (1)創建目錄:-a "path= state=directory"
            (2)創建鏈接文件: -a "path= src= state=link"
            (3)刪除文件:-a "path= state=absent"
                eg:
                ansible all -m file -a "path=/tmp/fstab.ansible owner=centos"
                ansible all -m file -a "path=/tmp/fstab.ansible state=absent"
                ansible all -m file -a "path=/tmp/fstab.ansible.link src=/tmp/test.ansible state=link" 為遠程主機上的/tmp/fstab.ansible設置本地的軟連接
        fetch:從遠程主機上拉取文件到本地;(從遠程一臺主機上面獲取)
        cron:管理日常計劃任務
            -a "" (minute,hour,day,month,weekday,job,name,user,state={present|absent})
        hostname:設置主機名;name=
        yum:使用yum包管理器,完成包管理
            -a ""  name= state={present|latest} / name= state=absent
        service:服務管理;
            -a "" name enable runlevel state={started|stopped|restarted}
        group:組管理,添加或移除組;
            -a "" name state system gid
        user:用戶管理,管理用戶的事項;
            -a "" name group groups comment uid system shell expires home
        setup:從遠程主機上面,收集關于遠程主機的信息;
5.YAML:YAML是數據序列化格式設計的可讀性與腳本語言與互動。
    數據結構:key:value
        – item1
        – item2
        – item3
        eg:{name:jerry,age:21}
6.PlayBook:
    核心元素:
        Tasks:任務,由模塊定義的操作的列表;
        Variables:變量
        Templates:模板,即使用了模板語法的文本文件;
        Handlers:由特定條件出發的Tasks;
        Roles:角色;
    playbook的基礎組件:
        Hosts:運行指定任務的目標主機;
        remote_user:在遠程主機以哪個用于身份執行;
            sudo_user:非管理員需要用于sudo權限;
        tasks:任務列表
            模塊,模塊參數:
            格式:
                (1)action:module arguments
                (2)module:aeguments
7.運行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:指明運行指定標簽的任務
            –skip-tags=SKIP_TAGS:指明運行忽略指定標簽的任務
            –start-at-task=START_AT
8.Playbook核心元素詳解:
    (1)handlers:由特定條件觸發的Tasks;
        調用以及定義方式:
            tasks:
            – name:TASK_NAME
              module:arguments
             notify:HANDLER_NAME
            handlers:
            – name:HANDLER_NAME
             module:arguments
    (2)tags:給指定的任務定義一個調用標識;
            – name:NAME
             module:arguments
             tags:TAG_ID
    (3)Variables:變量
        類型:
            內建變量:facts
            自定義變量:
                a.命令行傳遞:
                    -e VAR=VALUE
                b.在hosts Inventory中為每個主機定義專用變量值:
                    ①向不同的主機傳遞不同的變量;
                        IP/HOSTNAME variable_name=value
                    ②向組內的所有主機傳遞相同的變量;
                        [groupname:vars]
                        variable_name=value
                c.在playbook中定義:
                    vars:
                        – var_name:value
                        – var_name:value
                d.Inventory還可以使用參數:
                    用于定義ansible遠程連接目標主機時使用的屬性,而非傳遞給playbook變量:
                        ansible_ssh_host
                        ansible_ssh_port
                        ansible_ssh_user
                        ansible_ssh_pass
                        ansible_sudo_pass
                        …
                e.在角色調用時傳遞:
                    roles:
                        – { roles: ROLE_NAME,var: value,….}
        變量的調用:
            {{ var_name }}
    (4)Templates:模板:文本文件,內部嵌套有模板語言腳本(使用模板語言編寫)      
        Jinja2 is a template engine written in pure Python.  It provides a  Django inspired non-XML syntax but supports inline expressions and an optional sandboxed environment.
        jinja2是模板引擎用純Python。它提供了一個Django啟發非XML語法但支持內聯表達式和一個可選的沙箱環境。
        語法:
            字面量:
                字符串:使用單引號或雙引號;
                數字:整數、浮點數;
                列表:[item1, item2, …]
                元組:(item1, item2, …)
                字典:{key1:value1, key2:value2, …}
                布爾型:true/false
            運算類:
                算術運算:+, -, *, /, //, %, **
                比較操作:==, !=, >, <, >=, <=
                邏輯運算:and, or, not
    執行模板文件中的腳本,并生成結果數據流,需要使用template模塊;
        template:
            -a "" (src dest mode owner group)
        注意:此模板不能在命令行使用,而只能用于playbook;
        條件測試:
            when語句:在tasks中使用,Jinja2的語法格式;
            循環:迭代,需要重復執行的任務;
            對迭代項的引用,固定變量名為"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'}
    (5)roles:角色
        以特定的層級目錄結構進行組織的tasks、variables、handlers、templates、files等;
            role_name/
                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的文件,用于設定默認變量;
        在playbook中調用角色的方法:
            – hosts: HOSTS
             remote_user: USERNAME
             roles:
                 – ROLE1
                 – ROLE2
                  – { role: ROLE3, VARIABLE: VALUE, …}
                 – { role: ROLE4, when: CONDITION }       

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

(1)
sjsirsjsir
上一篇 2016-11-02
下一篇 2016-11-03

相關推薦

  • lvm簡要及基本操作

        LVM( Logical Volume Manage,邏輯 邏輯卷管理)LVM將一個或多個硬盤的分區在邏輯上集合,相當于一個大硬盤來使用,當硬盤的空間不夠使用的時候,可以繼續將其它的硬盤的分區加入其中,這樣可以實現磁盤空間的動態管理,相對于普通的磁盤分區有很大的靈活性。  &nbs…

    Linux干貨 2016-05-23
  • 路徑操作&StringIO/BytesIO

    Edit 路徑操作&StringIO/BytesIO 路徑操作 路徑操作模塊: 3.4版本以前os.path模塊 In [1]: from os import path In [2]: p = path.join(‘/etc’,’sysconfig’,’network’)#將字符…

    Linux干貨 2017-10-30
  • 三次握手,四次揮手

    TCP/IP協議的詳細信息參看《TCP/IP協議詳解》三卷本。 在談及TCP建立連接和釋放連接過程,先來簡單認識一下TCP報文段首部格式的的幾個名詞(這里只是簡單說明,具體請查看相關教程)下面是TCP報文格式圖:     序列號seq:占4個字節,用來標記數據段的順序,TCP把連接中發送的所有數據字節都編上一個序號,第一個字節的…

    2017-09-03
  • 深入理解java嵌套類和內部類

    一、什么是嵌套類及內部類   可以在一個類的內部定義另一個類,這種類稱為嵌套類(nested classes),它有兩種類型:靜態嵌套類和非靜態嵌套類。靜態嵌套類使用很少,最重要的是非靜態嵌套類,也即是被稱作為內部類(inner)。嵌套類從JDK1.1開始引入。其中inner類又可分為三種:  其一、在一個類(外部類)中直接定義的內部類;  其二、在一個方法…

    Linux干貨 2015-04-07
  • VMware虛擬機設置網絡(包含簡單安裝)

    1.下載VMware虛擬機 2.創建一個虛擬機,選擇下載好的linux系統,我這里選擇的是CentOS版本,之后一直按著步驟設置一般都選擇默認就好                               &…

    2017-09-02
  • ./././

    ./././

    Linux干貨 2016-08-04
欧美性久久久久