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


一:關於自動化咱們要知道的php

一、自動化是什麼?python

IT運維自動化是一組將靜態的設備結構轉化爲根據IT服務需求動態彈性響應的策略,目的就是實現IT運維的質量,下降成本。能夠說自動化運維必定是IT運維高層面的重要屬性之一。mysql

二、爲何要使用自動化技術?linux

當公司規模擴大,從初期的幾臺服務器發展到龐大的數據中心時,天然而然的單靠人工就沒法知足在技術、業務、管理等方面的要求,那麼標準化、自動化、架構優化、過程優化等下降IT服務成本的因素愈來愈被人們所重視。nginx

三、自動化的目的是什麼?web

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

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

一、是什麼數據庫

基於python開發的,集合了衆多運維工具(puppet、chef、func、fabric)的優勢,實現了批量系統配置、批量程序部署、批量運行命令等功能。centos

二、Ansible軟件特色

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

②默認使用SSH協議對設備進行管理; 

③有大量常規運維操做模塊,可實現平常絕大部分操做。 

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

⑤支持API及自定義模塊,可經過Python輕鬆擴展; 

⑥經過Playbooks來定製強大的配置、狀態管理; 

⑦輕量級,無需在客戶端安裝agent,更新時,只需在操做機上 進行一次更新便可; 

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

三、Ansible基本架構圖 && 核心組件說明

image.png

Ansible:Ansible核心程序。
HostInventory:記錄由Ansible管理的主機信息,包括端口、密碼 、ip等。
Playbooks:「劇本」YAML格式文件,多個任務定義在一個文件 中,定義主機須要調用哪些模塊來完成的功能。
CoreModules:核心模塊,主要操做是經過調用核心模塊來完成管 理任務。
CustomModules:自定義模塊,完成核心模塊沒法完成的功能, 支持多種語言。
ConnectionPlugins:鏈接插件,Ansible和Host通訊使用

四、ansible任務執行模式:單個命令、批量命令

ad-hoc模式:使用單個模塊,支持批量執行單條命令。 ad-hoc 命令是一種能夠快速輸入的命令,並且不須要保存起來的命令。就至關於bash中的一句話shell。

playbook模式:是Ansible主要管理方式,也是Ansible功能強大的關 鍵所在。playbook經過多個task集合完成一類功能,如Web服務的安裝部署、數據庫服務器的批量備份等。能夠簡單地把playbook理解爲經過組合多條ad-hoc進行操做的配置文件。

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

image.png

一、加載本身的配置文件 默認/etc/ansible/ansible.cfg 
二、查找對應的主機配置文件,找到要執行的主機或者組 
三、加載本身對應的模塊文件,如command 
四、經過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳 輸至遠程服務器的 
五、對應執行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件 
六、給文件+x執行 
七、執行並返回結果 
八、刪除臨時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界面可與用戶交互的命令執行工具

※命令詳解

一、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:顯示版本信息

二、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 測試主機網絡連通性 

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


command執行命令 

[root@server ~]# 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:文件存在,則命令執行,也用來作判斷

    使用示例以下:

①[root@server ~]# 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命令不執行

②[root@server ~]# 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命令(支持管道、重定向等特殊符號) 

[root@server ~]# 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模塊常見用法:

一、複製文件
-a "src= dest= "

二、生成指定內容的文件
-a "content= dest= "
copy模塊經常使用選項:
①backup=<yes|no> :覆蓋文件以前,備份原文件
②content:功能與重定向">"相同,文件存在則覆蓋文件內容(default),不能存在則建立指定內容文件
③dest:文件或目錄,必須爲絕對路徑
④src:文件或目錄,相對路徑|絕對路徑。
⑤directory_mode:遞歸設置目錄權限,默認爲系統默認權限
⑥force yes|no :設爲yes時,若目標主機包含該文件,則強制覆蓋;若爲no,則只有目標主機不存在該文件時才複製。(default:yes)
⑦others:全部file模塊裏的選項均可以在這裏面使用。


file    設置文件屬性 

常見用法:

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

二、建立連接文件
-a 'path= src= state=link'

三、刪除文件
-a 'path= state=absent'

四、常見選項:
①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:每五分鐘同步各主機時間
[root@server ~]# ansible all -m cron -a 'name="sync date per second 5 min" minute="*/5" job="/usr/sbin/ntpdate 172.17.0.1 &> /dev/null"'
[root@server ~]# 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目錄下,每臺主機的信息輸入到主機名文件中,以下爲命令執
行結果:
    [root@server ~]# ls /tmp/facts/
    172.17.214.74  172.17.214.75


四:Ansible playbook

一、playbook簡介

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

(2)經過playbook的詳細描述,執行其中一系列tasks來操控節點

(3)演員:計算機

         劇本:playbook 


二、playbook使用場景

(1)ad-doc適合執行單條命令,當命令較多時,須要playbook

(2)playbook有本身的語法格式

(3)能夠將經常使用的命令集合編寫爲playbook


三、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,運行指定命令

四、playbook運行方法

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


五、playbook字典

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


六、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


七、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
相關文章
相關標籤/搜索