ansible簡單用法

  • Ansible簡介:

    • ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。

  • Ansible主要組成部分:

    • USER,普通用戶,即SYSTEM ADMINISTRATOR
    • CMDB(資產管理系統) API 調用
    • PUBLIC/PRIVATE CLOUD API調用
    • USER-> Ansible Playbook -> Ansibile
    • 利用ansible實現管理的方式:
      • Ad-Hoc 即ansible命令,主要用於臨時命令使用場景
      • Ansible-playbook 主要用於長期規劃好的,大型項目的場景,需要有前提的規劃

  • Ansible配置文件

    /etc/ansible/ansible.cfg    主配置文件,配置ansible工作特性
    /etc/ansible/hosts       主機清單
    /etc/ansible/roles/       存放角色的目錄


  • Ansible程序

    /usr/bin/ansible       主程序,臨時命令執行工具
    /usr/bin/ansible-doc      查看配置文檔,模塊功能查看工具
    /usr/bin/ansible-galaxy     下載/上傳優秀代碼或Roles模塊的官網平臺
    /usr/bin/ansible-playbook    定製自動化任務,編排劇本工具
    /usr/bin/ansible-pull       遠程執行命令的工具
    /usr/bin/ansible-vault     文件加密工具
    /usr/bin/ansible-console     基於Console界面與用戶交互的執行工具


  • Ansible配置文件

  • Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默認)
    ansible簡單用法

  • Ansible主機清單inventory

    • /etc/ansible/hosts文件格式
    • inventory文件遵循INI文件風格,中括號中的字符爲組名。
    • 可以將同一個主機同時歸併到多個不同的組中;此外,當如若目標主機使用了非默認的SSH端口,還可以在主機名稱之後使用冒號加端口號來標明
    • 例:
      ansible簡單用法

  • Ansible系列命令

    ansible                                  #主程序命令,臨時執行命令用
    ansible-doc                           #顯示模塊幫助
    ansible-playbook                  #將一系列的任務寫在一起,稱爲:劇本
    ansible-vault              #管理加密、解密yml文件
    ansible-console                   #2.0+版本新增,可交互執行命令,支持tab
    ansible-galaxy        #連接 https://galaxy.ansible.com 下載相應的roles
    ansible-pull                          #推送命令至遠程,效率無限提升,對運維要求較高
    • ansible
      ansible簡單用法
    • ansible-doc
      ansible簡單用法

    • ansible-vault
      ansible簡單用法
    • ansible-console
      ansible簡單用法

  • Ansible常用模塊

    • Command:在遠程主機執行命令,默認模塊,可忽略-m選項
      ansible srvs -m command -a 'service vsftpd start'
      ansible srvs -m command -a 'echo bigboss | passwd --stdin wang' #執行失敗
      #此模塊不支持 $VARNAME < > | ; & 等,用shell模塊實現
    • Shell:和command相似,用shell執行命令
      (1)ansible srv -m shell -a 'echo bigboss |passwd –stdin wang'
      (2)調用bash執行命令
      #類似 cat /tmp/stanley.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt
      #這些複雜命令,即使使用shell也可能會失敗,解決辦法:寫到腳本時,copy到遠程,執行,再把需要的結果拉回執行命令的機器
    • Script:運行腳本
      ansible all -script -a "/PATH/TO/SCRIPT_FILE"
      ansible all -m script -a test.sh
    • Copy:從服務器複製文件到客戶端
      ansible srv -m copy -a 'src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes'
      #如目標存在,默認覆蓋,backup=yes 指定先備份
      ansible srv -m copy -a "content='test content\n' dest=/tmp/f1.txt"
      #利用內容,直接生成目標文件
    • Cron:計劃任務
      #支持時間:minute,hour,day,month,weekday
      ansible srv -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' name=Synctime" #創建任務
      ansible srv -m cron -a 'state=absent name=Synctime' #刪除任務
    • Fetch:從客戶端取文件至服務器端,copy相反,拉取目錄可先tar打包
      ansible srv -m fetch -a 'src=/root/a.sh dest=/data/scripts'

    • File:文件管理
      ansible all -m file -a 'name=/app/a.txt state=touch'
      ansible srv -m file -a "path=/root/a.sh owner=wang mode=755"
      ansible web -m file -a 'src=/app/testfile dest=/app/testfile-link state=link'
    • Hostname:管理主機名
      ansible all -m hostname -a "name=websrv"

    • Yum:管理包
      ansible srv -m yum -a 'name=httpd state=latest' #安裝
      ansible srv -m yum -a 'name=httpd state=absent' #刪除

    • Service:管理服務
      ansible srv -m service -a 'name=httpd state=stopped' #停止
      ansible srv -m service -a 'name=httpd state=started' #啓動
      ansible srv –m service –a 'name=httpd state=reloaded' #重讀配置文件
      ansible srv -m service -a 'name=httpd state=restarted' #重啓

    • User:管理用戶
      ansible srv -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
      ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 '
      ansible srv -m user -a 'name=user1 state=absent remove=yes'
      #刪除用戶及家目錄等數據

    • Group:管理組
      ansible srv -m group -a "name=testgroup system=yes"
      ansible srv -m group -a "name=testgroup state=absent"

    • Setup: 遠程主機信息變量

  • Ansible的playbook

    • playbook是由一個或多個"play"組成的列表
    • play的主要功能在於將事先歸併爲一組的主機裝扮成事先通過ansible中的task定義好的角色。
    • 從根本上來講,所謂task無非是調用ansible的一個module。
    • 將多個play組織在一個playbook中,即可以讓它們聯同起來按事先編排的機制同唱一臺大戲

    • Playbook採用YAML語言編寫
    • 運行playbook

                ansible-playbook &lt;filename.yml&gt; ... [options]
                選項:
                        --check         只檢測可能會發生的改變,但不真正執行操作
                        --list-hosts    列出運行任務的主機
                        --limit         主機列表 只針對主機列表中的主機執行
                        -v,-vv,-vvv     顯示過程,更詳細    
                例:
                        ansible-playbook file.yml --check   #只檢測不運行
                        ansible-playbook file.yml
                        ansible-playbook file.yml --limit websrvs   
    • YAML語法簡介

      • (1)在單一檔案中,可用連續三個連字號(——)區分多個檔案。另外,還有選擇性的連續三個點號( ... )用來表示檔案結尾
      • (2)次行開始正常寫Playbook的內容,一般建議寫明該Playbook的功能
      • (3)使用#號註釋代碼
      • (4)縮進必須是統一的,不能空格和tab混用
      • (5)縮進的級別也必須是一致的,同樣的縮進代表同樣的級別,程序判別配置的級別是通過縮進結合換行來實現的
      • (6)YAML文件內容和Linux系統大小寫判斷方式保持一致,是區別大小寫的,k/v的值均需大小寫敏感
      • (7)k/v的值可同行寫也可換行寫。同行使用:分隔
      • (8)v可是個字符串,也可是另一個列表
      • (9)一個完整的代碼塊功能需最少元素需包括 name: task
      • (10)一個name只能包括一個task
      • (11)YAML文件擴展名通常爲yml或yaml **
    • Playbook核心元素

      • Hosts    #執行的遠程主機列表
      • Tasks     #任務集
      • Varniables  #內置變量或自定義變量在playbook中調用
      • Templates   #模板,可替換模板文件中的變量並實現一些簡單邏輯的文件
      • Handlers   #和notity結合使用,由特定條件觸發的操作,滿足條件方纔執行,否則不執行
      • tags     #標籤 指定某條任務執行,用於選擇運行playbook中的部分代碼。ansible具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼爲測試其確實沒有發生變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷
    • Hosts
    • playbook中的每一個play的目的都是爲了讓某個或某些主機以某個指定的用戶身份執行任務。
    • hosts用於指定要執行指定任務的主機,須事先定義在主機清單中
    • 可以是如下形式:

        www.bigboss.com
        www.bigboss1.com:www.bigboss2.com
        192.168.1.2
        192.168.1.*
        web:db      #兩個組的交集
        web:&db     #兩個組的並集
        web:!db     #在web組但不在db組中
        例:
                - host: web:db
    • remote_user:
    • 可用於Host和task中。也可以通過指定其通過sudo的方式在遠程主機上執行任務,其可用於play全局或某任務
    • 此外,甚至可以在sudo時使用sudo_user指定sudo時切換的用戶

        - hosts: websrvs
            remote_user: root
            tasks:
                - name: test connection
                    ping:
                    remote_user: bigboss
                    sudo: yes                             #默認sudo爲root
                    sudo_user:wang                #sudo爲wang
    • tasks:任務列表
    • 格式:
      • (1) action: module arguments
      • (2) module: arguments 建議使用
    • 注意:shell和command模塊後面跟命令,而非key=value
    • 某任務的狀態在運行後爲changed時,可通過"notify"通知給相應的handlers
    • 任務可以通過"tags"打標籤,而後可在ansible-playbook命令上使用-t指定進行調用
  • 例:

      tasks:
           - name: disable selinux
             command: /sbin/setenforce 0
      #如果命令或腳本的退出碼不爲零,可以使用如下方式替代
      tasks:
          - name: run this command and ignore the result
            shell: /usr/bin/somecommand || /bin/true
      #或者使用ignore_errors來忽略錯誤信息:
      tasks:
        - name: run this command and ignore the result
          shell: /usr/bin/somecommand
          ignore_errors: True
  • handlers和notify結合使用觸發條件:

      - hosts: websrvs 
           remote_user: root 
           tasks: 
             - name: Install httpd 
                 yum: name=httpd state=present 
             - name: Install configure file 
                 copy: src=files/httpd.conf dest=/etc/httpd/conf/ 
                 notify: restart httpd            #當copy動作實現時,就會執行handlers的動作
             - name: ensure apache is running
              service: name=httpd state=started enabled=yes
    
          handlers:
             - name: restart httpd
               service: name=httpd status=restarted
  • tags使用:
      http.yml
      - hosts: web
        remote_user: root
        task:
          - name: Install httpd
             yum: name=httpd 
    
      - name: copy configure file
            copy: src=file/httpd.conf dest=/etc/httpd/conf/
            tags: conf       #設置tags名爲conf
    
          - name: start httpd
            tags:service
            service: name=httpd state=started enabled=yes
    
      ansible-playbook -t conf httpd.yml    #調用名爲conf的tags

  • 模板Templates

    文本文件,嵌套有腳本(使用模板編程語言編寫)
    Jinja2語言,使用字面量,有下面形式
     字符串:使用單引號或雙引號
     數字:整數,浮點數
     列表:[item1, item2, ...]
     元組:(item1, item2, ...)
     字典:{key1:value1, key2:value2, ...}
     布爾型:true/false
    算術運算:+, -, *, /, //, %, **
    比較操作:==, !=, >, >=, <, <=
    邏輯運算:and, or, not
    流表達式:For If When

  • templates功能:根據模塊文件動態生成對應的配置文件

    • templates文件必須存放於templates目錄下,且命名爲 .j2 結尾
    • yaml/yml 文件需和templates目錄平級,目錄結構如下:
      ansible簡單用法

    • 例:利用templates 同步nginx配置文件

      [root@centos7 ~]# cat nginx.conf.j2
      user nginx;
      worker_processes {{ ansible_processor_vcpus*2 }};
      #setup模塊中ansible_processor_vcpus變量爲CPU核心數,

      [root@centos7 ~]# vim temnginx.yml

      - hosts: web
        remote_user: root
      
        tasks:
          - name: template config to hosts
            template: src=nginx.conf.j2  dest=/etc/nginx/nginx.conf 

      ansible-playbook temnginx.yml

  • when: 條件測試

    • 如果需要根據變量、facts或此前任務的執行結果來做爲某task執行與否的前提時要用到條件測試,通過when語句實現,在task中使用,jinja2的語法格式在task後添加when子句即可使用條件測試;when語句支持Jinja2表達式語法

    • 例:

      #當setup模塊中ansible_os_family等於RedHat時執行關機
      tasks:

      • name: shutdown redhat system
        command: /sbin/shutdown -h now
        when: ansible_os_family == 'RedHat'

        #根據系統版本來安裝軟件
        tasks:

      • name: install nginx to centos7
        yum: name=nginx
        when: ansible_distribution_major_version == '7'
      • name: install httpd to centos6
        yum: name=httpd
        when: ansible_distribution_major_version == '6'
  • 迭代:with_items

    • 迭代:當有需要重複性執行的任務時,可以使用迭代機制
    • 對迭代項的引用,固定變量名爲”item“
    • 要在task中使用with_items給定要迭代的元素列表
    • 列表格式:
    • 字符串
    • 字典
    • 例:
      ansible簡單用法
  • 迭代嵌套子變量:
    ansible簡單用法

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