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

自動化安裝流程:

選硬件---系統安裝----系統的初始化----服務的安裝和配置----機器的管理(日誌的收集,軟件包的上下線,服務的管理等等)

自動化運維的精髓所在

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

自動化運維常用工具

安裝系統 工具pxe/cobbler 用途:安裝系統
虛擬化系統 KVM/xen/vmware 用途:虛擬機
應用部署 puppet/ansible/saltstack 中大型規模
命令執行 Ansible/fabric/func/shell腳本 中小型規模

介紹下puppet

Puppet:更多的體現在配置文件的管理上,實現定期server會和master進行通信,通信過後master會把各種配置定期推送到agent的節點上。
比如,如果要修改nginx配置文件,只要在master上修改,然後master會把配置文件推送到agent端,適用於大型環境

企業級自動化運維工具應用實戰-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開發,集合了衆多運維工具(puppet、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。

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架構圖

企業級自動化運維工具應用實戰-ansible
Ansible:Ansible核心程序。
HostInventory:記錄由Ansible管理的主機信息,包括端口、密碼、ip等。
(一般端口都是默認端口不用指定也行,基於ssh私鑰登錄的話密碼也不用了,就指定個ip地址或者主機名就成,主機名要能被解析)
Playbooks:“劇本”YAML格式文件,多個任務定義在一個文件中,定義主機需要調用哪些模塊來完成的功能。
(類似於shell腳本,多條ansible命令的集合,十分注意格式。)
CoreModules:核心模塊,主要操作是通過調用核心模塊來完成管理任務。
(現在已經內嵌了巨多模塊,已經可以滿足我們日常運維的工作了,有特別需要了再自己定義模塊)
CustomModules:自定義模塊,完成核心模塊無法完成的功能,支持多種語言。
ConnectionPlugins:連接插件,Ansible和Host通信使用

ansible任務執行模式

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

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

·playbook模式是Ansible主要管理方式,也是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 使用pip(python的包管理模塊)安裝
(與perl的cpanm模式安裝類似)
pip install ansible
如果沒pip,需先安裝pip.yum可直接安裝:
yum install python-pip
pip 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配置文件的查找順序

(1).檢查環境變量ANSIBLE_CONFIG指向的路徑文件(export
ANSIBLE_CONFIG=/etc/ansible.cfg)
(2).~/.ansible.cfg,檢查當前目錄下的ansible.cfg配置文件
(3)./etc/ansible.cfg 檢查etc目錄的配置文件
先找到哪個,哪個生效。

Ansible配置文件

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

inventory: #這個參數表示資源清單inventory文件的位置,資源清單就是
一些Ansible需要連接管理的主 機列表。這個參數的配置實例如下:
inventory = /etc/ansible/hosts      放可管理鏈接主機的地方
library:Ansible的操作動作,無論是本地或遠程,都使用一小段代碼來執行,這小段代碼稱爲模塊,這個library參數就是指向存放Ansible模塊的目錄。配置實例如下:
library = /usr/share/ansible            放ansible平時用的模塊的地方(自定義模塊)
Ansible支持多個目錄方式,只要用冒號(:)隔開就可以,同時也會檢查當前執行playbook位置下的./library目錄。
forks: 設置默認情況下Ansible最多能有多少個進程同時工作, 從Ansible 1.3開始,
fork數量默認自動設置爲主機數量或者潛在的主機數量,默認設置最多5個進程並行處理。
具體需要設置多少個,可以根據控制主機的性能和被管節點的數量來確定,可能是 50或100。默認值5是非常保守的值,
配置實例如下:
forks = 5         ansible能一下管理鏈接多少臺機器,默認5臺偏保守
sudo_user:
這是設置默認執行命令的用戶,也可以在playbook中重新設置這個參數。配置實例如下:
sudo_user = root
remote_port:
這是指定連接被管節點的管理端口,默認是22。除非設置了特殊的SSH端口,不然這個參數一般是 不需要修改的。

配置實例如下:
remote_port = 22
host_key_checking:
    這是設置是否檢查SSH主機的密鑰。可以設置爲True或False,關閉後第一次連接沒有提示配置實例
host_key_checking = False
timeout:
這是設置SSH連接的超時間隔,單位是秒。配置實例如下:
timeout = 60
log_path:Ansible系統默認是不記錄日誌的,如果想把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-doc命令

一般用法:

ansible-doc -l 獲取模塊信息
ansible-doc -s MOD_NAME 獲取指定模塊的使用幫助

ansible-doc
-h Usage: ansible-doc [options] [module...]
Options: 
-h, --help show this help message and exit # 顯示命令參數API文檔
-l, --list List available modules #列出可用的模塊
-M MODULE_PATH, --module-path=MODULE_PATH #指定模塊的路徑
specify path(s) to module library (default=None) 
-s, --snippet Show playbook snippet for specified module(s) #顯示playbook制定模塊的用法
--version show program's version number and exit # 顯示ansible-doc的版本號查看模塊列表:
ion
# ansible-doc -l

Ansible命令詳解
命令格式:
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
我們可以通過 ansible -h查看幫助
Usage: ansible <host-pattern> [options] Options: 
-a MODULE_ARGS, --args=MODULE_ARGS 模塊的參數,如果執行默認COMMAND的模塊,即是命令參數,如:“date”,“pwd”等等 module arguments 模塊參數
-k, --ask-pass ask for SSH password 登錄密碼,提示輸入SSH密碼而不是假設基於密鑰的驗證
--ask-su-pass su切換密碼
-K, --ask-sudo-pass 提示密碼使用sudo,sudo表示提權操作
--ask-vault-pass ask for vault password
-B SECONDS, --background=SECONDS 後臺運行超時時間 (default=N/A)
-C, --check don‘t make any changes; instead, try to predict some of the changes that may occur 只是測試一下會改變什麼內容,不會真正去執行;相反,試圖預測一些可能發生的變化
-c CONNECTION, --connection=CONNECTION 連接類型使用。(default=smart)
-f FORKS, --forks=FORKS 並行任務數。NUM被指定爲一個整數,默認是5
-h, 打開幫助文檔API
-i INVENTORY, 指定庫存主機文件的路徑,默認爲/etc/ansible/hosts
-m MODULE_NAME, --module-name=MODULE_NAME 執行模塊的名字,默認使用 command 模塊,所以如果是隻執行單一命令可以不用 -m參數 (default=command)
-M MODULE_PATH, --module-path=MODULE_PATH 要執行的模塊的路徑,默認爲/usr/share/ansible/ (default=/usr/share/ansible/)
-o, --one-line condense output 壓縮輸出,摘要輸出.嘗試一切都在一行上輸出。
-P POLL_INTERVAL, --poll=POLL_INTERVAL 調查背景工作每隔數秒。需要- b (default=15)
-private-key=PRIVATE_KEY_FILE 私鑰路徑,使用這個文件來驗證連接
-S, --su run operations with su 用 su 命令
-R SU_USER, --su-user=SU_USER 指定SU的用戶,默認是root用戶
-U SUDO_USER, --sudo-user=SUDO_USER sudo到哪個用戶,默認爲 root
-T TIMEOUT, --timeout=TIMEOUT 指定SSH默認超時時間, 默認是10S
-t TREE, --tree=TREE log output to this directory 將日誌內容保存在該輸出目錄,結果保存在一個文件中在每臺主機上。
-u REMOTE_USER, --user=REMOTE_USER 遠程用戶, 默認是root用戶
-v, --verbose verbose mode (-vvv for more, -vvvv to enable 詳細信息
--version show program's version number and exit 輸出ansible的版本

Ansible配置公私鑰

配置ansible使用公鑰驗證
雖然ansible支持其他主機認證方式,但是我們最常用的的還是基於祕
鑰的認證:
1、首先生成祕鑰
ssh-keygen -t rsa -P ‘’
2、然後向主機分發祕鑰:
ssh-copy-id root@ #@後面跟主機名或者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簡介

playbook是ansible用於配置,部署,和管理被控節點的劇本。
通過playbook的詳細描述,執行其中的一系列tasks,可以讓遠端主機達到預期的狀態。playbook就像Ansible控制器給被控節點列出的的一系列to-do-list,而被控節點必須要完成。也可以這麼理解,playbook 字面意思,即劇本,現實中由演員按照劇本表演,在Ansible中,這次由計算機進行表演,由計算機安裝,部署應用,提供對外服務,以及組織計算機處理各種各樣的事情

簡單的說,就是可以把多條點對點的單條命令集合到一起來實現一整套的操作,比如安裝一個服務,推送配置文件到指定目錄,再啓動服務三個步驟。其中可以調用notify通知機制和tags標籤機制,這樣就使劇本playbook更加靈活了。

Ansible playbook使用場景

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

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

使用playbook你可以方便的重用這些代碼,可以移植到不同的機器上面,像函數一樣,最大化的利用代碼。在你使用Ansible的過程中,你也會發現,你所處理的大部分操作都是編寫playbook。可以把常見的應用都編寫成playbook,之後管理服務器會變得十分簡單。

Ansible playbook格式

playbook由YMAL語言編寫。YAML( /ˈjæməl/ )參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822,Clark Evans在2001年5月在首次發表了這種語言,另外Ingy döt Net與Oren
Ben-Kiki也是這語言的共同設計者。YMAL格式是類似於JSON的文件格式,便於人理解和閱讀,同時便於書寫。首先學習瞭解一下YMAL的格式,對我們後面書寫playbook很有幫助。以下爲playbook常用到的YMAL格式。

文件的第一行應該以 ”-” (三個連字符)開始,表明YMAL文件的開始。
在同一行中,#之後的內容表示註釋,類似於shell,python和ruby。
YMAL中的列表元素以”-”開頭然後緊跟着一個空格,後面爲元素內容。就像這樣

  • apple
  • banana
  • orange
    等價於JSON的這種格式 [ “apple”, “banana”, “orange” ]
    同一個列表中的元素應該保持相同的縮進。否則會被當做錯誤處理。
    play中hosts,variables,roles,tasks等對象的表示方法都是鍵值中間以”:”分隔表示,”:”後面還要增加一個空格。
    house:
    family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
    address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 12345 }

在mysql.yml中,主要由三個部分組成。
hosts部分:使用hosts指示使用哪個主機或主機組來運行下面的tasks,每個playbook都必須指定hosts,hosts也可以使用通配符格式。主機或主機組在inventory清單中指定,可以使用系統默認的/etc/ansible/hosts,也可以自己編輯,在運行的時候加上-i選項,指定清單的位置即可。在運行清單文件的時候,–list-hosts選項會顯示那些主機將會參與執行task的過程中。
remote_user:指定遠端主機中的哪個用戶來登錄遠端系統,在遠端系統執行task的用戶,可以任意指定,也可以使用sudo,但是用戶必須要有執行相應task的權限。
tasks:指定遠端主機將要執行的一系列動作。tasks的核心爲ansible的模塊,前面已經提到模塊的用法。tasks包含name和要執行的模塊,name是可選的,只是爲了便於用戶閱讀,不過還是建議加上去,模塊是必
須的,同時也要給予模塊相應的參數。
企業級自動化運維工具應用實戰-ansible

Playbook的核心元素

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

Playbooks配置文件的基礎組件:
Hosts:運行指定任務的目標主機;
remoute_user: 在遠程主機上執行任務的用戶;
sudo_user:
tasks:任務列表
模塊,模塊參數;
格式:
(1) action: module arguments
(2) module: arguments
注意:shell和command模塊後面直接跟命令,而非key=value類的參數列表;
(1) 某任務的狀態在運行後爲changed時,可通過“notify”通知給相應的handlers;
(2) 任務可以通過“tags“打標籤,而後可在ansible-playbook命令上使用-t指定進行調用;

Playbook完整配置文件

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

ansible高級用法--角色定製:roles

對於以上所有的方式有個弊端就是無法實現複用假設在同時部署Web、db、ha 時或不同服務器組合不同的應用就需要寫多個yml文件。很難實現靈活的調用。roles 用於層次性、結構化地組織playbook。roles 能夠根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用
roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變量(vars)、文件(file)、任務(tasks)、模塊(modules)及處理器(handlers)放置於單獨的目錄中,並可以便捷地include它們的一種機制。角色一般用於基於主機構建服務的場景中,但也可以是用於構建守護進程等場景中。
(大致就是把playbook中的各個配置段分開了存放到/etc/roles下對應的目錄下,這樣在playbook的配置文件中只要調用角色roles就行了,在一個playbook的配置文件中,可以調用多個roles角色,這樣就更加方便靈活了。)

roles目錄結構

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

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的文件,用於設定默認變量;

具體過程:

1、在roles目錄下生成對應的目錄結構
mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}

2、定義/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
(把要推送的包放到files目錄下,模板文件放到template目錄下)

3、修改邊變量文件
vars/main.yml 添加變量nginx_port: “8888”

4、定義handlers文件
handlers/main.yml - name: new conf to reload
service: name=nginx state=restarted

5、定義/etc/ansible/nginx.yml的playbook文件
- hosts: nginx
remote_user: root
roles: - nginx

6、可以通過roles傳遞變量
- hosts: nginx
remote_user: root
roles: - { role: nginx, nginxport: 12345 }

7、也可以配置多個角色
roles: 
# - { role: nginx, nginxport: 12345 } 
- { role: memcached
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章