天天看點

運維自動化好幫手:ansible軟體入門篇

一:關于自動化我們要知道的

1、自動化是什麼?

IT運維自動化是一組将靜态的裝置結構轉化為根據IT服務需求動态彈性響應的政策,目的就是實作IT運維的品質,降低成本。可以說自動化運維一定是IT運維高層面的重要屬性之一。

2、為什麼要使用自動化技術?

當公司規模擴大,從初期的幾台伺服器發展到龐大的資料中心時,自然而然的單靠人工就無法滿足在技術、業務、管理等方面的要求,那麼标準化、自動化、架構優化、過程優化等降低IT服務成本的因素越來越被人們所重視。

3、自動化的目的是什麼?

自動化作為其重要屬性之一已經不僅僅隻是代替人工操作,更重要的是深層探知和全局分析,關注的是在目前條件下如何實作性能與服務最優化,同時保障投資收益最大化。

二:自動化工具——Ansible軟體詳解

1、是什麼

基于python開發的,集合了衆多運維工具(puppet、chef、func、fabric)的優點,實作了批量系統配置、批量程式部署、批量運作指令等功能。

2、Ansible軟體特點

①部署簡單,隻需在主要端部署Ansible環境,被控端無需做任何操作; 

②預設使用SSH協定對裝置進行管理; 

③有大量正常運維操作子產品,可實作日常絕大部分操作。 

④配置簡單、功能強大、擴充性強; 

⑤支援API及自定義子產品,可通過Python輕松擴充; 

⑥通過Playbooks來定制強大的配置、狀态管理; 

⑦輕量級,無需在用戶端安裝agent,更新時,隻需在操作機上 進行一次更新即可; 

⑧提供一個功能強大、操作性強的Web管理界面和REST API接口 ——AWX平台。

3、Ansible基本架構圖 && 核心元件說明

運維自動化好幫手:ansible軟體入門篇
Ansible:Ansible核心程式。
HostInventory:記錄由Ansible管理的主機資訊,包括端口、密碼 、ip等。
Playbooks:“劇本”YAML格式檔案,多個任務定義在一個檔案 中,定義主機需要調用哪些子產品來完成的功能。
CoreModules:核心子產品,主要操作是通過調用核心子產品來完成管 理任務。
CustomModules:自定義子產品,完成核心子產品無法完成的功能, 支援多種語言。
ConnectionPlugins:連接配接插件,Ansible和Host通信使用      

4、ansible任務執行模式:單個指令、批量指令

①ad-hoc模式:使用單個子產品,支援批量執行單條指令。 ad-hoc 指令是一種可以快速輸入的指令,而且不需要儲存起來的指令。就相當于bash中的一句話shell。

②playbook模式:是Ansible主要管理方式,也是Ansible功能強大的關 鍵所在。playbook通過多個task集合完成一類功能,如Web服務的安裝部署、資料庫伺服器的批量備份等。可以簡單地把playbook了解為通過組合多條ad-hoc進行操作的配置檔案。

5、ansible執行流程 && 流程描述

運維自動化好幫手:ansible軟體入門篇
1、加載自己的配置檔案 預設/etc/ansible/ansible.cfg 
2、查找對應的主機配置檔案,找到要執行的主機或者組 
3、加載自己對應的子產品檔案,如command 
4、通過ansible将子產品或指令生成對應的臨時py檔案,并将該檔案傳 輸至遠端伺服器的 
5、對應執行使用者的家目錄的.ansible/tmp/XXX/XXX.PY檔案 
6、給檔案+x執行 
7、執行并傳回結果 
8、删除臨時py檔案,sleep 0退出      

三:Ansible常用指令及用法

※常用指令

/usr/bin/ansible               # Ansibe AD-Hoc 臨時指令執行工具,常用于臨時命 令的執行
/usr/bin/ansible-doc           # Ansible 子產品功能檢視工具
/usr/bin/ansible-galaxy        # 下載下傳/上傳優秀代碼或Roles子產品 的官網平台 ,基于網絡的
/usr/bin/ansible-playbook      # Ansible 定制自動化的任務集編排工具
/usr/bin/ansible-pull          # Ansible遠端執行指令的工具,拉取配置而非推 送配置(使用較少,海量機器時使用,對運維的架構能力要求較高)
/usr/bin/ansible-vault         # Ansible 檔案加密工具
/usr/bin/ansible-console       # Ansible基于Linux Consoble界面可與使用者互動的指令執行工具      

※指令詳解

1、ansible-doc

(1)指令格式

ansible-doc [options] [module...]

(2)options

-h:--help  顯示指令參考API文檔

-l:--list    列出可用子產品

-M module_path:--module-path=module_path    指定子產品路徑

-s mode_name:--snippet    擷取指定子產品的使用幫助

--version:顯示版本資訊

2、ansible

(1)指令格式

①ansible [-f forks] [-m module_name] [-a args]
②ansible  <host-pattern> [options] Options      

(2)options

· -a MODULE_ARGS, --args=MODULE_ARGS :子產品的參數,如果執行預設COMMAND的子產品,即是指令參數 ,如:“date”,“pwd”等等 module arguments 子產品
參數
· -m MODULE_NAME, --module-name=MODULE_NAME:執行子產品的名字,預設使用"command" 子產品,是以如果是隻執行單一指令可以不用
· -M MODULE_PATH, --module-path=MODULE_PATH:要執行的子產品的路徑(default:/usr/share/ansible)
· -f FORKS, --forks=FORKS: 并行任務數(default:5)
· -C, --check:測試模式。測試一下會改變什麼内容,不會真正去執行;相反,試圖預測一些可能發生的變化
· -c connection,--connection=CONNECTION:連接配接類型使用(default:smart)
· -v, --verbose(-vvv,-vvvv):顯示指令執行的詳細資訊/超詳細資訊 (常和-C配合使用,用于運作前測試環節)
· -i INVENTORY, --inventory-file=INVENTORY:指定主機清單存放路徑,預設為/etc/ansible/hosts
· -S, --su :使用 su 指令
· -R SU_USER, --su-user=SU_USER 指定SU的使用者(default:root)
· -s, --sudo:以sudo方式運作(不需要密碼)
· -U SUDO_USER, --sudo-user=SUDO_USER :sudo到哪個使用者(default:root)
· -T TIMEOUT, --timeout=TIMEOUT:指定SSH預設逾時時間(default:10s)
· -u REMOTE_USER, --user=REMOTE_USER:預設連接配接到遠端主機哪個使用者(default:root)
· -k, --ask-pass:登陸密碼,提示輸入ssh密碼而不是假設基于密鑰的驗證
· -K, --ask-sudo-pass:提示密碼使用sudo,sudo表示提權操作
· -B SECONDS, --background=SECONDS:背景運作逾時時間
· -h,--help:檢視幫助 
· -o, --one-line:壓縮輸出,摘要輸出,嘗試将所有内容都在一行上輸出。
· -private-key=PRIVATE_KEY_FILE:私鑰路徑,使用這個檔案來驗證連接配接      

(3)常用子產品

①ping 測試主機網絡連通性 

[[email protected] ~]# ansible all -m ping
172.17.214.75 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
172.17.214.74 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}      

②command執行指令 

[[email protected] ~]# ansible webserver -m command -a 'ifconfig'  在webserver主機組上執行指令ifconfig      

注意:指令模式下,'' 的用法  :'指令名稱+用空格分隔的清單參數', 給定的指令将在所有指定節點上執行,但不支援shell指令模式,如下列幾種:

$arg、"<"、">"、"|"、";"、"&"等shell指令,有其特定的指令:

   · chdir=dir_name:切換目錄

   · executable:切換shell來執行指令(注意:指令要使用絕對路徑表示)

   · free_form:要執行的linux指令,一般用-a選項代替

   · creates=file_name:檔案存在,則指令不執行,隻可用來做判斷

   · removes=file_name:檔案存在,則指令執行,也用來做判斷

    使用示例如下:

①[[email protected] ~]# ansible all -m command -a 'creates=/app/hehe.w  ls'
172.17.214.74 | SUCCESS | rc=0 >>
skipped, since /app/hehe.w exists
172.17.214.75 | SUCCESS | rc=0 >>
skipped, since /app/hehe.w exists
因為兩主機都存在此檔案,是以ls指令不執行

②[[email protected] ~]# ansible all -m command -a 'removes=/app/hehe.w ls'      
172.17.214.74 | SUCCESS | rc=0 >>
172.17.214.75 | SUCCESS | rc=0 >>
兩主機檔案存在,則執行此ls指令      

③shell 遠端主機執行shell指令(支援管道、重定向等特殊符号) 

[[email protected] ~]# ansible all -m shell -a 'cat /etc/passwd | grep "root"'
172.17.214.74 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
172.17.214.75 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash      

④copy    複制檔案到遠端主機 

copy子產品常見用法:

1、複制檔案
-a "src= dest= "

2、生成指定内容的檔案
-a "content= dest= "
copy子產品常用選項:
①backup=<yes|no> :覆寫檔案之前,備份原檔案
②content:功能與重定向">"相同,檔案存在則覆寫檔案内容(default),不能存在則建立指定内容檔案
③dest:檔案或目錄,必須為絕對路徑
④src:檔案或目錄,相對路徑|絕對路徑。
⑤directory_mode:遞歸設定目錄權限,預設為系統預設權限
⑥force yes|no :設為yes時,若目标主機包含該檔案,則強制覆寫;若為no,則隻有目标主機不存在該檔案時才複制。(default:yes)
⑦others:所有file子產品裡的選項都可以在這裡面使用。      

⑤file    設定檔案屬性 

常見用法:

1、建立目錄
-a 'path= state=directory'

2、建立連結檔案
-a 'path= src= state=link'

3、删除檔案
-a 'path= state=absent'

4、常見選項:
①force yes|no:強制建立軟連結。第一,源檔案不存在,但稍後會建立;第二,目标軟連結已存在,需要先取消之前的連結關系,建立新的軟連結。
②group:定義檔案/目錄的屬組 mode:定義檔案/目錄權限
③owner:定義檔案/目錄的屬主 path:定義檔案/目錄路徑(必選項)
④recurse:遞歸設定檔案屬性
⑤src:被連結的源檔案路徑,隻應用于state=link
⑥dest:被連結的檔案路徑,隻應用于state=link
⑦state:
    directory:若目錄不存在,則建立目錄
    file:檔案不存在也不建立
    link:建立軟連接配接
    hard:建立硬連結
    touch:若檔案不存在,則會建立一個新檔案, 若存在,則更新時間戳
    absent:删除檔案、目錄、連結檔案      

⑥fetch    從遠端某主機擷取檔案到本地

dest:本機用來存放拉過來的檔案或目錄的目錄
src:遠端檔案。(隻能為檔案)      

⑦cron    管理計劃任務 

常見action:
    cron backup=<yes|no>:建立一個crontab備份
    cron_file=file_name:如果使用,使用這個cron.d,而不是單個使用者
常見時間選項:
    day= #日應該運作的工作( 1-31, *, */2, ) 
    hour= # 小時 ( 0-23, *, */2, ) 
    minute= #分鐘( 0-59, *, */2, ) 
    month= # 月( 1-12, *, /2, ) 
    weekday # 周 ( 0-6 for Sunday-Saturday)
常用選項:
    jod=""    :指明執行的指令
    name="":任務描述
    reboot    任務在重新開機時運作。(不建議使用,建議使用special_time)
    special_time="":特殊的時間範圍,參數有:reboot(重新開機時),annually(每年),monthly(每月),weekly (每周),daily(每天),hourly(每小時)
    state="":指定狀态,常見狀态有present(添加定時任務)、absent(删除定時任務)
    user="":以哪個使用者身份去運作
eg:每五分鐘同步各主機時間
[[email protected] ~]# ansible all -m cron -a 'name="sync date per second 5 min" minute="*/5" job="/usr/sbin/ntpdate 172.17.0.1 &> /dev/null"'
[[email protected] ~]# ansible all -m shell -a 'crontab -l'    #檢視計劃任務添加情況      

⑧yum    安裝軟體 

name=                  #所安裝的包的名稱
state=                 #present(安裝), latest(安裝最新的), absent(解除安裝軟體)。
update_cache           #強制更新yum的緩存。
conf_file              #設定遠端yum安裝時所依賴的配置檔案。如配置檔案沒有在預設的位置。
disable_gpg_check      #是否禁止GPG checking,隻用于`present‘ or `latest’。
disablerepo            #臨時禁止使用yum庫。 隻用于安裝或更新時
enablerepo             #臨時使用的yum庫。隻用于安裝或更新時。      

⑨service    服務管理 

arguments     #指令行提供額外的參數 
enabled=<true|false>     #設定開機啟動。 
name=       #服務名稱 
runlevel    #開機啟動的級别,一般不用指定。 
sleep       #在重新開機服務的過程中,是否等待。如在服務關閉以後等待2秒再啟動。 
state       #started啟動服務, stopped停止服務, restarted重新開機服務, reloaded重載配置      

⑩user    使用者和賬号管理

comment    # 使用者的描述資訊 
createhome # 是否建立家目錄 
force      # 在使用state=absent時, 行為與userdel –force一緻. 
group      # 指定基本組 groups # 指定附加組,如果指定為(groups=)表示删除所有組 
home       # 指定使用者家目錄 move_home # 如果設定為home=時, 試圖将使用者主目錄移動到指定的目錄 
name       # 指定使用者名 
non_unique # 該選項允許改變非唯一的使用者ID值 
password   # 指定使用者密碼 
remove     # 在使用state=absent時, 行為是與userdel –remove一緻 
shell      # 指定預設shell 
state      # 設定帳号狀态,不指定為建立,指定值為absent表示删除 
system     # 當建立一個使用者,設定這個使用者是系統使用者。這個設定不能更改現有使用者 
uid        # 指定使用者的uid
update_password   # 更新使用者密碼      

⑪group 組管理,添加或删除組

gid       #設定組的GID号 
name=     #組名 
state     #指定組狀态,預設為建立(present),設定值為absent為删除 
system    #設定值為yes,表示為建立系統組      

⑫script 運作伺服器端腳本

ansible all -m script -a '/root/test.sh'      

⑬setup 檢視機器所有facts資訊

※facts是什麼?

facts是一個内建變量。每個主機的各種資訊,cpu顆數、記憶體大小等。會存在facts中的某個變量中。調用後傳回很多對應主機的資訊,在後面的操作中可以根據不同的資訊來做不同的操作。如redhat系列用yum安裝,而debian系列用apt來安裝軟體。

※setup子產品主要功能

setup子產品,主要用于擷取主機資訊,在playbooks裡經常會用到的一個參數gather_facts就與該子產品相關。 setup子產品下經常使用的一個參數是filter參數,具體使用示例如下(由于輸出結果較多,這裡隻列指令不寫結果):

setup常用指令格式:
#ansible web -m setup     //檢視主機所有變量
#ansible 10.212.52.252 -m setup -a 'filter=ansible_*_mb'      //檢視主機記憶體資訊 
#ansible 10.212.52.252 -m setup -a 'filter=ansible_eth[0-2]'  //檢視地接口為eth0-2的網卡資訊
#ansible all -m setup --tree /tmp/facts         //将所有主機的資訊輸入到/tmp/facts目錄下,每台主機的資訊輸入到主機名檔案中,如下為指令執
行結果:
    [[email protected] ~]# ls /tmp/facts/
    172.17.214.74  172.17.214.75      

四:Ansible playbook

1、playbook簡介

(1)playbook是ansible用于配置,部署,和管理被控節點的劇本

(2)通過playbook的較長的描述,執行其中一系列tasks來操控節點

(3)演員:計算機

         劇本:playbook 

2、playbook使用場景

(1)ad-doc适合執行單條指令,當指令較多時,需要playbook

(2)playbook有自己的文法格式

(3)可以将常用的指令集合編寫為playbook

3、playbook編寫詳解

(1)文法格式

①開頭:檔案的第一行應該以 ”—” (三個連字元)開始,表明YMAL檔案的開始。
②注釋:在同一行中,#之後的内容表示注釋,類似于shell,python和ruby。
③清單元素:YMAL中的清單元素以”-”開頭然後緊跟着一個空格,後面為元素内容。
eg:- apple - banana - orange  等價于python清單    ["apple","banana","orange"]
④常用對象指定:play中hosts,variables,roles,tasks等對象的表示方法都是鍵值中間以":"分隔表示,":"後面還要增加一個空格。      

(2)playbook元件詳解

①Hosts:運作指定任務的目标主機
    (a)主機清單預設為/etc/ansible/hosts,也可自己指定檔案,通過-i file_name指定
        (b) ansible --list-hosts 顯示哪些主機參與到task的執行中
②remote_user:遠端主機上執行任務的使用者
③sudo_user:切換遠端主機上執行任務的使用者
④tasks:    任務清單,配合各子產品使用才有功能。
    module_name: modile arguments
注意:shell和command子產品後可直接跟指令,而非key=value參數清單
⑤handlers 任務,在特定條件下被觸發,接收到其他任務的通知時被觸發
格式:
      tasks:
        - name: restart httpd service
          service: name=httpd states=stopped
          notify: httpd_manager
          handlers:
        - name: httpd_manager
          service: name=httpd states=started

⑥變量 Variables
方法1)facts:可直接調用
注意:可使用setup子產品直接擷取目标主機的facters;
方法2)使用者自定義變量
    (a)指令行定義:ansible-playbook   *.yml  -e  var1=value1
        eg:①定義變量名
                    tasks:
        - name: stop httpd service
          service: name={{ service_name }} states=stopped  ##定義變量service_name
                ②指令行引用變量
                    ansible-playbook web.yml -e service_name=httpd       ##關閉httpd服務
    (b).yml檔案中定義:
        vars:
        - var1: value1
        - var2: value2
注意:vars位置為hosts之下,tasks之外,與tasks等級相同
方法3)通過roles傳遞變量
方法4)Host Inventory         主機清單檔案自中定義
    (a) 向不同主機傳遞不同的變量:
            ip/hostname var1=value1 var2=value2
    (b)向組中的主機傳遞相同變量
            [group_name:vars]    //原樣輸入即可
            var1=value1          //指定變量及變量值

⑦tags:為單個執行指令打标簽
1)修改yml檔案
tasks:
        - name: restart httpd service
          service: name=httpd states=stopped
          tags: restart-httpd
2)指令行引用tags,運作單獨task
absible-playbook  web.yml  -t  restart-httpd     ”-t“ 引用tag,運作指定指令      

4、playbook運作方法

(1)試運作
ansible-playbook --check/-C      #測試運作yml檔案,不執行真正操作,用來檢視是否有錯誤
ansible-playbook --list-hosts    #列出執行task所用主機
ansible-playbook 
(2)直接運作
ansible-playbook  *.yml      

5、playbook字典

文法示例:
- name: add some users
   user: name={{ item.name }} group={{ item.group }} state=present
   with_items:
   - { name:'user11',group:'group11' }
   - { name:'user22',group:'group22' }      

6、playbook條件測試

(1)條件測試:when
用法:在task中使用,jinja2的文法格式
eg:
        tasks: 
            - name: install conf file to centos7 
              template: src=files/nginx.conf.c7.j2 
              when: ansible_distribution_major_version == "7" 
            - name: install conf file to centos6 
               template: src=files/nginx.conf.c6.j2 
               when: ansible_distribution_major_version == "6"
               (2)循環:疊代,需要重複執行的任務
用法:①對疊代項的引用,固定變量名為    "item"
           ②而後,要在task中使用with_items給定要疊代的元素清單
eg:
    - hosts: web
    remote_user: root
    tasks:   
      - name: uninstall web packages
        yum: name={{ item }} state=absent       
        with_item:      
        - httpd
        - php
        - php-mysql
        - php-fpm      

7、roles 角色定制

(1)功能
roles 用于層次性、結構化地組織playbook。roles 能夠根據層次型結構自動裝載變量檔案、tasks以及handlers等。roles就是通過分别将變量(vars)、文
件(file)、任務(tasks)、子產品 (modules)及處理器(handlers)放置于單獨的目錄中,并可以便捷 地include它們的一種機制。角色一般用于基于主機建構
服務的場 景中,但也可以是用于建構守護程序等場景中。要使用 roles隻需要在playbook中使用include指令即可。

(2)角色集合
①mysql/
②httpd/
③nginx/
④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的檔案,用于設定預設變量;

(3)角色定制操作步驟
①在role目錄下生成對應的目錄結構
mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}
②定義/tasks/main.yml的配置檔案 
- name: cp 
   copy: src=nginx-1.10.2-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.2- 1.el7.ngx.x86_64.rpm 
- name: install 
   yum: name=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm state=latest 
- name: conf template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 
  tags: nginxconf 
  notify: new conf to reload 
  name: start service 
  service: name=nginx state=started enabled=true
③修改變量檔案
  vars/main.yml     添加變量nginx_port: “8888”
④定義handlers檔案
    handlers/main.yml 
    - name: new conf to reload 
       service: name=nginx state=restarted
⑤定義/etc/ansible/nginx.yml的playbook檔案
    - hosts: nginx 
      remote_user: root 
      roles: 
        - nginx
⑥可以通過roles傳遞變量
- hosts: nginx 
  remote_user: root 
  roles: 
    - { role: nginx, nginxport: 12345 }
⑦也可以配置多個角色
roles: 
 # - { role: nginx, nginxport: 12345 } 
     - { role: memcached      

轉載于:https://blog.51cto.com/13172823/2049192

繼續閱讀