ansible 學習筆記(上)

運維工具

當前常見的運維工具(Configuration)有以下一種
puppret(ruby)
saltstack(python)
chef
cfengine
....

Command and Control;

fabricfunc

程序發佈:

手動發佈
腳本發佈
發佈程序(運維程序)

程序發佈要求:1、不能影響用戶體驗;2、系統不能停機;3、不能導致系統故障或造成系統完全不可用;

灰度發佈模型(考慮以下兩種維度):1、主機;2、用戶;

發佈思路:
/webapps/tuangou
/webapps/tuangou-1.1/webapps/tuangou-1.2將程序解壓縮,解壓縮後進行文件鏈接,近期版本不刪除,
一邊後期能夠出問題能夠進行回滾;

在調度器上先下線一批主機(標記爲維護模式)-->關閉服務-->部署新版本-->啓動服務-->在調度器上啓用這一批主機;

運維工具的分類

agent:puppet,func,...agentless(ssh):ansible,fabric

Ansible

輕量化運維工具
能夠提供Configuration和Command and Control的功能

Ansible的特性:
    模塊化:調用特定的模塊,完成特定的任務;
    基於Python語言實現,由paramiko,PyYAML和jinja2三個關鍵模塊;
    部署簡單:agentless;
    支持自定義模塊;
    支持playbook;   
    冪等性:一個命令執行一邊和多邊的效果是一樣的。

Ansible的安裝及應用:

yum的epel源,
配置文件:/etc/ansible/ansible.cfg
主機清單:/etc/ansible/hosts
主程序:
    ansible
    ansible-playbook
    ansible-doc
ansible的簡單使用格式:
    ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS
    ansible-doc -s MOD_name
ansible的常用模塊:
    獲取模塊列表:
        ansible-doc -l
        command模塊:在遠程主機運行命令,不支持“|”
            ansible websrvs -m command -a "useradd user1"
        shell模塊:遠程主機在shell進程中中運行
            ansible websrvs -m shell - a "echo magedu | password --stdin user1"
        copy模塊:複製文件至遠程主機;
            用法:(1)src= dest=
                        ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab"
                  (2)content= dest=   //直接把內容作爲數據流傳輸至文件;
                        ansible all -m copy -a "content='hello world\n' dest=/tmp/testfile"
                  owner,group,mode
        cron模塊:manage cron.d and crontab entries
            minute=
            hour=
            day=
            weekday=
            job=
            *name=    //必須有此參數            state=
                present //默認爲添加
                absent  //刪除crontab
            ansible all -m cron -a "minute=*/5 job='/sbin/ntpdate 172.16.0.1 &> /dev/null' name=Synctime"
        fetch模塊:從遠程主機拉去文件至當前機器;
        file模塊:修改文件屬性;
            *path=     //必須有此參數
            用法:(1)創建連接文件
                        ansible all -m file -a "src=/tmp/fstab path=/tmp/fstab.link state=link"
                  (2)修改屬性:path= owner= mode= group=
                  (3)創建目錄:path= state=directory
                        ansible all -m file -a "path=/tmp/tmpdir state=directory"
        hostname模塊:manage hostname
            name=
        ping模塊:
        pip模塊:用來管理Python的依賴模塊;
        yum模塊:用yum來管理程序包
            *name=:指明程序包名稱,可以帶版本號      //必須有此參數            state=
                present,latest(安裝),absent(卸載);
                ansible all -m yum -a "name=httpd state=latest"  
        service模塊:管理服務
            *name=      //必須有此參數            state=
                started,stopped,restarted;
            enabled= 1|0    //開機自啓動;
            runlevel= 
                ansible all -m service -a "name=httpd state=started"
        uri模塊:uri的訪問管理        user模塊:管理用戶賬戶;
            *name 
            system= yes|no    //yes是系統賬戶
            uid=
            shell=            group=
            groups=
            comment=
            home=
            move_home=
            remove=   //當state=agent是刪除家目錄
                ansible all -m user -a "name=user3 system=yes state=present uid=306"
        setup模塊:用於獲取facts;        group模塊:添加或刪除組
            *name=  //必須給的參數            state
            system
            gid=
        scipt模塊:把本地腳本傳遞到遠程主機後進行執行;
            ansible -m script -a "/path/to/script_file"

YAML:

YAML簡介:

YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其他多種語言,
包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Evans在2001年首次發表了這種語言,
另外Ingy dot Net 與 Ben-kiki也是這種語言的共同設計者;YAML Ain`t Markup Language,即YAML不是XML。
不過,在開發的這種語言時,YAML的意思是:“Yet Another Markup Language”(仍是一種標記語言)。
其特性:
    YAML的可讀性較好;
    YAML和腳本語言的交互性很好;
    YAML有一個一致的信息模型;
    YAML易於實現;
    YAML可以基於流來處理;
    YAML表達能力強,擴展性好;

YAML語法:

YAML的語法和其他高階語言類似,並且可以簡單表達清單、散列表、標量等數據結構。
其結構(structure)通過空格來展示,序列(Sequence)裏的項用“-”來代表,Map裏的鍵值對用“:”分隔。

Playbook:
Playbook的核心元素:
    Hosts:主機
    Tasks:任務
    variables:
    Templates:包含了模板的文本文件;
    Handlers:由特定條件出發任務;
    Roles:
    
    playbook的基礎組件
        Hosts:運行指定任務的目標主機;
        remoute_user:在遠程主機上執行任務的用戶;
            sudu_user:
        tasks:任務列表
            模塊,模塊參數;
            格式:
                (1)action:module arguments
                (2)module:arguments
        handlers:
            任務,在特定條件下觸發;
            接收到其他任務的通知時被觸發;  
        variables:
            (1)facts:可直接調用;
            (2)ansible-playbook命令行中的自定義變量;
                -e VARS,--extra-vars=VARS            
            (3)通過role傳遞變量;
            (4)Host Inventory
                (1)向不同的主機傳遞不同的變量;
                    ip/hostname varaiable=value var2=value2
                (2)向組中主機傳遞相同的變量
                    [groupname:vars]
                    variable=value
            invertory參數:
                用於定義ansible遠程連接目標主機時的參數,而非傳遞給playbook的變量;
                    ansible_ssh_host
                    ansible_ssh_port
                    ansible_ssh_user
                    ansible_ssh_pass
                    ansible_sudo_pass
                ....
        **注意:shell和command模塊後直接跟命令即可**
        **某任務的狀態在運行後爲changed時,可通過“notify”通知給相應的handlers;**
        **任務可以通過“tags”打標籤,而後可在ansible-playbook命令上使用-t指定進行調用;**
    playbook的使用方法:
        ansible-playbook在執行命令時,第一個任務執行完成後執行第二個任務,第二個執行完成後,執行第三個任務;
        ansible-playbook 
            --list-host      //顯示執行的主機列表;            
            --check          //在目標主機進行檢測可能會發生改變,但並不執行;            
            -t tags          //指明任務                
            ansible-palybook -t instconf web.yml  //進行標籤爲instconf的項目;
        playbook示例1:編寫sample.yaml
            - hosts:            remote_user:root
            tasks:
                - name: create a user user3                  
                  user: name=user3 system=true uid=307
                - name: creare a user user4                  
                  user: name=user4 system=true uid=308
        playbook示例2:編寫web.yml  
            - hosts: websrvs              remote_user: root
              tasks:
              - name: install httpd package                yum: name=httpd state=present
              - name: install configure file 
                copy: src=files/httpd.conf dest=/etc/httpd/conf/    //src爲相對路徑
                tags: instconf
                notify: restart httpd
              - name: start httpd.service 
                serivce: name=httpd state=started
              -name: execute ss command                
                shell: ss -tnl | grep 8080
            - handlers:              
              - name: restart httpd                
                service: name=httpd state=restarted


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章