1. 程式人生 > >Ansible-企業級自動化運維工具應用實戰

Ansible-企業級自動化運維工具應用實戰

自動化運維的精髓所在

所謂的運維自動化實際上就是某些運維過程的自動化,比如初始化自動化、測試/部署自動化,監控自動化,簡單報警處理自動化,業務降級/恢復自動化...,慢慢的讓系統可以承擔更多的重複勞動,減少人力投入和學習成本。

企業級自動化運維工具應用實戰-ansible

使用場景:
公司計劃在年底做一次大型市場促銷活動,全面衝刺下交易額,為明年的上市做準備。公司要求各業務組對年底大促做準備,運維部要求所有業務容量進行三倍的擴容,並搭建出多套環境可以共開發和測試人員做測試,運維老大為了在年底有所表現,要求運維部門同學儘快實現,當你接到這個任務時,有沒有更快的解決方式?
(要在短時間內快速的擴充業務容量的最快方法就是橫向擴充套件

scale out,那麼數量很多的機器,如何快速佈置呢,一臺一臺佈置效率就太低了,這時候就可以使用運維自動化工具ansible等等,只要管理一臺,其他標準化的機器就都OK了)

目前多數公司遇到的運維問題現狀:

1、硬體選型多樣化
2、系統多版本並存
3、目錄結構混亂
4、運維人員水平參差不齊
5、歷史遺留問題多
6、同一軟體出現多個版本
7、無法批量化操作
8、工作效率低,故障率高
9、專案上線操作繁瑣

日常運維工作中的重要事件:

1、新增監控,收集系統指標
2、對日誌進行歸檔以及管理
3、資料備份於恢復
4、對計劃任務進行管理
5、對軟體包進行部署和管理
6、對指令碼進行批量執行
7、對檔案進行批量複製和移動


8、設定檔案或者目錄對應的許可權
9、關閉和啟動服務
10、對程式碼程式進行上下線

ansible是什麼

ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppetcheffuncfabric)的優點,實現了批量系統配置、批量程式部署、批量執行命令等功能。

ansible是基於 paramiko 開發的,並且基於模組化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所執行的模組,ansible只是提供一種框架。ansible不需要在遠端主機上安裝client/agents,因為它們是基於ssh來和遠端主機通訊的。ansible目前已經已經被紅帽官方收購,是


自動化運維工具中大家認可度最高的,並且上手容易,學習簡單。是每位運維工程師必須掌握的技能之一。

ansible特點

1、部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;
2、預設使用SSH協議對裝置進行管理;
3、有大量常規運維操作模組,可實現日常絕大部分操作。
4、配置簡單、功能強大、擴充套件性強;
5、支援API及自定義模組,可通過Python輕鬆擴充套件;
6、通過Playbooks來定製強大的配置、狀態管理;
7、輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
8、提供一個功能強大、操作性強的Web管理介面和REST API介面 ——AWX平臺。(目前這個應該是付費專案)

ansible架構圖


AnsibleAnsible核心程式。
HostInventory:記錄由Ansible管理的主機資訊,包括埠、密碼、ip等。
(一般埠都是預設埠不用指定也行,基於ssh私鑰登入的話密碼也不用了,就指定個ip地址或者主機名就成,主機名要能被解析)
Playbooks劇本”YAML格式檔案,多個任務定義在一個檔案中,定義主機需要呼叫哪些模組來完成的功能。
(類似於shell指令碼,多條ansible命令的集合,十分注意格式。)
CoreModules:核心模組,主要操作是通過呼叫核心模組來完成管理任務。
(現在已經內嵌了多個模組,已經可以滿足我們日常運維的工作了,有特別需要了再自己定義模組)
CustomModules:自定義模組,完成核心模組無法完成的功能,支援多種語言。
ConnectionPlugins:連線外掛,AnsibleHost通訊使用

ansible任務執行模式

Ansible系統由控制主機對被管節點的操作方式可分為兩類,即ad- hocplaybook

·ad-hoc模式使用單個模組,支援批量執行單條命令。 ad****-hoc 命令是一種可以快速輸入的命令,而且不需要儲存起來的命令。就相當於bash中的一句話shell

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

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安裝方式

ansible安裝常用兩種方式,yum安裝和pip程式安裝
這裡提供二種安裝方式,任選一種即可
1使用yum安裝
yum install epel-release -y
yum install ansible –y
2
使用pippython的包管理模組)安裝
(與perlcpanm模式安裝類似)
pip install ansible
如果沒pip,需先安裝pip.yum可直接安裝:
yum install python-pip
pip3 install ansible

ansible程式結構

安裝目錄
配置檔案目錄:/etc/ansible/
執行檔案目錄:/usr/bin/
Lib
庫依賴目錄:/usr/lib/pythonX.X/site-packages/ansible/
Help
文件目錄:/usr/share/doc/ansible-X.X.X/
Man
文件目錄:/usr/share/man/man1/

Ansible配置檔案

設定ansible.cfg配置引數,ansible有許多引數,下面列出常用的引數:

inventory #這個引數表示資源清單inventory檔案的位置,資源清單就是

一些Ansible需要連線管理的主 機列表。這個引數的配置例項如下:

inventory = /etc/ansible/hosts      放可管理連結主機的地方

library:這個library引數就是指向存放Ansible模組的目錄。配置例項如下:

library = /usr/share/ansible            ansible平時用的模組的地方(自定義模組)

Ansible支援多個目錄方式,只要用冒號(:)隔開就可以,同時也會檢查當前執行playbook位置下的./library目錄。

forks 設定預設情況下Ansible最多能有多少個程序同時工作, Ansible 1.3開始,

fork數量預設自動設定為主機數量或者潛在的主機數量,預設設定最多5個程序並行處理。

具體需要設定多少個,可以根據控制主機的效能和被管節點的數量來確定,可能是 50100。預設值5是非常保守的值,

配置例項如下:

forks = 5         ansible能一下管理連結多少臺機器,預設5臺偏保守

sudo_user

這是設定預設執行命令的使用者,也可以在playbook中重新設定這個引數。配置例項如下:

sudo_user = root

remote_port

這是指定連線被管節點的管理埠,預設是22。除非設定了特殊的SSH埠,不然這個引數一般是 不需要修改的。

配置例項如下:

remote_port = 22

host_key_checking

這是設定是否檢查SSH主機的金鑰。可以設定為TrueFalse,關閉後第一次連線沒有提示配置例項

host_key_checking = False

timeout

這是設定SSH連線的超時間隔,單位是秒。配置例項如下:

timeout = 60

log_pathAnsible系統預設是不記錄日誌的,如果想把Ansible系統的輸出記錄到日誌檔案中,需要設定log_path

來指定一個儲存Ansible日誌的檔案。配置例項如下:

log_path = /var/log/ansible.log   建議開啟日誌

另外需要注意,執行Ansible的使用者需要有寫入日誌的許可權,模組將會呼叫被管節點的syslog來記錄

Ansible主機清單

可以直接定義一個主機資訊,也可以把多個主機放到一個機器組中,起個組名。格式如下(主機匹配還支援統配符來匹配)
1、直接指明主機地址或主機名:

## green.example.com#

# blue.example.com#

# 192.168.100.1

# 192.168.100.10

2、定義一個主機組[組名]把地址或主機名加進去

[mysql_test]

192.168.253.159

192.168.253.160

192.168.253.153

#組成員可以使用萬用字元來匹配,如下 192.168.2.[1:6]

#表示匹配從192.168.2.1——192.168.2.6的主機

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配置公私鑰

配置ansible使用公鑰驗證
雖然ansible支援其他主機認證方式,但是我們最常用的的還是基於祕
鑰的認證:
1、首先生成祕鑰
ssh-keygen -t rsa -P ‘’ 
2
、然後向主機分發祕鑰:
ssh-copy-id [email protected] #@後面跟主機名或者IP地址
3、如果出現以下情況:

# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.6.72

-bash: ssh-copy-id: command not found

請嘗試:

yum -y install openssh-clientsansible

ansible常用模組:

ping模組:用於測試主機能否連通
commond模組:用於在主機上執行單條命令
shell模組:可在管理主機上執行一些複雜命令
copy模組:大多用於推送配置檔案
yum模組:批量化安裝服務包
setup模組:獲取管理的主機的配置資訊
fetch模組:從管理主機上拉取檔案
user模組:批量建立使用者
group模組:批量建立組
file模組:建立軟連結目錄什麼的
script模組:在管理機上執行指令碼,在被管理機上執行
service服務模組:服務的啟動和過載等等
cron計劃任務模組:新增計劃任務

Ansible playbook簡介

playbookansible用於配置,部署,和管理被控節點的劇本。
通過playbook的詳細描述,執行其中的一系列tasks,可以讓遠端主機達到預期的狀態。

Ansible playbook使用場景

執行一些簡單的任務,使用ad-hoc命令可以方便的解決問題,但是有時一個設施過於複雜,需要大量的操作時候,執行的ad-hoc命令是不適合的,這時最好使用playbook

就像執行shell命令與寫shell指令碼一樣,也可以理解為批處理任務,不過playbook有自己的語法格式。

使用playbook你可以方便的重用這些程式碼,可以移植到不同的機器上面,像函式一樣,最大化的利用程式碼。。

Ansible playbook格式

對我們後面書寫playbook很有幫助。以下為playbook常用到的YMAL格式。

檔案的第一行應該以 ”-” (三個連字元)開始,表明YMAL檔案的開始。
在同一行中,#之後的內容表示註釋,類似於shellpythonruby
YMAL中的列表元素以”-”開頭然後緊跟著一個空格,後面為元素內容。就像這樣

mysql.yml中,主要由三個部分組成。
hosts部分:使用hosts指示使用哪個主機或主機組來執行下面的tasks,每個playbook都必須指定hosts
remote_user:指定遠端主機中的哪個使用者來登入遠端系統,在遠端系統執行task的使用者,可以任意指定,也可以使用sudo,但是使用者必須要有執行相應task的許可權。
tasks:指定遠端主機將要執行的一系列動作。tasks的核心為ansible的模組,前面已經提到模組的用法。tasks包含name和要執行的模組,name是可選的,只是為了便於使用者閱讀,不過還是建議加上去,模組是必
須的,同時也要給予模組相應的引數。

Playbook的核心元素

Hosts:主機
Tasks:任務列表
Variables 設定方式有4
Templates:包含了模板語法的文字檔案;
Handlers:由特定條件觸發的任務;

Playbooks配置檔案的基礎元件:
Hosts:執行指定任務的目標主機;
remoute_user: 在遠端主機上執行任務的使用者;
sudo_user
tasks:任務列表
模組,模組引數;

       Host Inventory:主機清單,也就是被管理的主機列表

        Playbooksansible的劇本,可想象為將多個任務放置在一起,一塊執行

        Core Modulesansible的核心模組

        Custom Modules:自定義模組

        Connection Plugins:連線外掛,用於與被管控主機之間基於SSH建立連線關係

        Plugins:其他外掛,包括記錄日誌等

    2ansible的特性

        <1>模組化:呼叫特定的模組,完成特定任務

        <2>基於python語言實現,由Paramiko(完成基於ssh的連線)PyYAML(YAML檔案的支援)jinja2(python的模板庫)三個關鍵的模組

        <3>部署簡單:是沒有客戶端的

        <4>支援自定義模組,使用任意程式語言

        <5>支援強大的playbook

        <6>具有冪等性:一個操作在一個主機上執行一遍和執行N遍的結果是一樣的

第二章    ansible的基礎應用

    1ansible管理端的安裝

        EPEL源中,有包含ansible的軟體包安裝只需要配置好EPELyum源,yum安裝即可

 

    安裝生成的檔案

    2ansible被管控主機的定義

        對希望被管控的主機的定義需要實現在ansible管理端的針對被管理主機的配置檔案(/etc/ansible/hosts)中進行定義

    

    

    3、配置管理節點可以基於ssh祕鑰登入被管理節點

    

    4ansible命令的用法介紹

ansible HOST-PATTERN [-f FORKS] [-m MOD_NAME] [-a MOD_ARGS]

            HOST_PATTERN:指明對哪些被管控主機進行操作

            -f FORKS:表示一批處理幾臺主機,也就是當被管控主機很多時,ansible不是對所有主機同時發起管理操作,而是一批處理幾臺,然後再換一批,直到所有主機被處理完成,如果不指定,則預設是5

            -m MOD_NAME:指明呼叫哪個模組執行操作,各個模組所能實現的功能不同,如果不指定,預設是用-m command模組

            -a MOD_ARGS:指明使用該模組的執行操作時的引數

第三章    ansible常用模組介紹

    1、獲取常用模組的列表和對應模組的使用幫助資訊

        可用ansible-doc -l  來檢視所有可用的模組列表

        可用ansible-doc -s MOD_NAME  來檢視對應模組的幫助資訊

    2command模組

        在遠端主機執行命令,不支援管道,重定向等shell的特性

        常用引數有:

        chdir=   表示指明命令在遠端主機上哪個目錄下執行,也就是在命令執行前切換到哪個目錄下

        creates=   在命令執行時建立一個檔案,如果檔案已存在,則不會執行建立任務

        removes=   在命令執行時移除一個檔案,如果檔案不存在,則不會執行移除任務

        executeble=   指明執行命令的shell程式

    3shell模組

        在遠端主機執行命令,相當於呼叫遠端主機的shell程序,然後在該shell下開啟一個子shell執行命令

        支援shell特性,如管道,重定向等

        注意:commandshell模組的核心引數直接為命令本身,而其他模組的核心引數一般是"key=value"格式

        常見引數有:

        chdir=   表示指明命令在遠端主機上哪個目錄下執行

        creates=   在命令執行時建立一個檔案,如果檔案已存在,則不會執行建立任務

        removes=  在命令執行時移除一個檔案,如果檔案不存在,則不會執行移除任務

        executeble=   指明執行命令的shell程式

    4copy模組

        拷貝ansible管理端的檔案到遠端主機的指定位置

        常見引數有:

        dest=   指明拷貝檔案的目標目錄位置,使用絕對路徑,如果源是目錄,則目標也要是目錄,如果目標檔案已存在,會覆蓋原有內容

        src=   指明本地路徑下的某個檔案,可以使用相對路徑和絕對路徑,支援直接指定目錄,如果源是目錄,則目標也要是目錄

        mode=   指明覆制時,目標檔案的許可權

        owner=   指明覆制時,目標檔案的屬主

        group=   指明覆制時,目標檔案的屬組

        content=  指明覆制到目標主機上的內容,不能與src一起使用,相當於複製content指明的資料,到目標檔案中

    

    

    5cron模組

        管理計劃任務的模組

        常見引數有:

        minute=  指明計劃任務的分鐘,支援格式:0-59**/2等,與正常cron任務定義的一樣的語法,省略時,預設為*,也就是每分鐘都執行

        hour=  指明計劃任務的小時,支援的語法:0-23**/2等,省略時,預設為*,也就是每小時都執行

        day=  指明計劃任務的天,支援的語法:1-31**/2等,省略時,預設為*,也就是每天都執行

        month=  指明計劃任務的月,支援的語法為:1-12**/2等,省略時,預設為*,也就是每月都執行

        weekday=  指明計劃任務的星期幾,支援的語法為:0-6*等,省略時,預設為*,也就是每星期幾都執行

        reboot  指明計劃任務執行的時間為每次重啟之後

        name=   給該計劃任務取個名稱,必須要給明。每個任務的名稱不能一樣。刪除任務時,只需要給明任務的名稱即可

        job=  執行的任務是什麼,當state=present時才有意義

        state=present|absent   表示這個任務是建立還是刪除,present表示建立,absent表示刪除,預設是present

    6fetch模組

        從遠端主機拉取檔案到本地

        一般情況下,只會從一個遠端節點拉取資料

        常見引數有:

        dest=  從遠端主機上拉取的檔案存放在本地的位置,一般只能是目錄

        src=   指明遠端主機上要拉取的檔案,只能是檔案,不能是目錄

    7file模組

        用於設定遠端主機上的檔案屬性

        常見引數有:

        path=   指明對哪個檔案修改其屬性

        src=   指明path=指明的檔案是軟連結檔案,其對應的原始檔是誰,必須要在state=link時才有用

        state=directory|link|absent   表示建立的檔案是目錄還是軟連結

        owner=   指明檔案的屬主

        group=   指明檔案的屬組

        mode=   指明檔案的許可權

        建立軟連結的用法:

            src=  path=  state=link

        修改檔案屬性的用法:

            path=  owner=  mode=  group=

        建立目錄的用法:

            path=  state=directory

        刪除檔案:

            path= state=absent

    

    

    

    

    

    8hostname模組

        管理遠端主機上的主機名

        常用引數有

        name=  指明主機名

    

    9yum模組

        基於yum機制,對遠端主機管理程式包

        常用引數有:

        name=   指明程式包的名稱,可以帶上版本號,不指明版本,就是預設最新版本。

        state=present|latest|absent   指明對程式包執行的操作,present表示安裝程式包,latest表示安裝最新版本的程式包,absent表示解除安裝程式包

        disablerepo=    在用yum安裝時,臨時禁用某個倉庫,倉庫的ID

        enablerepo=    在用yum安裝時,臨時啟用某個倉庫,倉庫的ID

        conf_file=   指明yum執行時採用哪個配置檔案,而不是使用預設的配置檔案

        diable_gpg_check=yes|no  是否啟用gpg-check 

    

    

    

    

    10service模組

        用來管理遠端主機上的服務的模組

        常見引數有:

        name=   被管理的服務名稱

        state=started|stopped|restarted   表示啟動或關閉或重啟

        enabled=yes|no  表示要不要設定該服務開機自啟動

        runlevel=   如果設定了enabled開機自動啟動,則要定義在哪些執行級別下自動啟動

    

 

    

    11uri模組

        如果遠端是web伺服器,可以利用ansible直接請求某個網頁

        常見引數有:

        url=  指明請求的url的路徑,如:http://10.1.32.68/test.jpg

        user=  如果請求的url需要認證,則認證的使用者名稱是什麼

        password=  如果請求的url需要認證,則認證的密碼是什麼

        method=  指明請求的方法,如GETPOST…

        body=   指明報文中實體部分的內容,一般是POST方法或PUT方法時用到

        HEADER_   自定義請求報文中的新增的首部

    

    12user模組

        管理遠端主機上的使用者的賬號

        常見引數有:

        name=   指明要管理的賬號名稱

        state=present|absent   指明是建立賬號還是刪除賬號,present表示建立,absent表示刪除

        system=yes|no   指明是否為系統賬號

        uid=   指明使用者UID

        group=   指明使用者的基本組

        groups=   指明使用者的附加組

        shell=   指明預設的shell

        home=   指明使用者的家目錄

        move_home=yes|no   home設定了家目錄,如果要建立的家目錄已存在,是否將已存在的家目錄進行移動

        password=   指明使用者的密碼,最好使用加密好的字串

        comment=   指明使用者的註釋資訊

        remove=yes|no   state=absent時,也就是刪除使用者時,是否要刪除使用者的而家目錄

    

    

    

    13group模組

        用來新增或刪除遠端主機的使用者組

        常見引數有:

        name=   被管理的組名

        state=present|absent   是新增還是刪除,不指名預設為新增

        gid=   指明GID

        system=yes|no   是否為系統組

    

 

    14script模組

        將管理端的某個指令碼,移動到遠端主機(不需要指明傳遞到遠端主機的哪個路徑下,系統會自動移動,然後執行),然後執行