運維自動化工具Ansible

Ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。Ansible是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,Ansible只是提供一種框架,基於ssh遠程通訊,所以不需要安裝client/agent端;

一:特點;

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

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

3、有大量常規運維操作模塊,可實現日常絕大部分操作。

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

5、支持API及自定義模塊,可通過Python輕鬆擴展;

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

7、輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;(主控端)

8、提供一個功能強大、操作性強的Web管理界面和RESTAPI接口——AWX平臺(現叫Ansible tower,收費的)

架構圖:


命令執行過程:

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核心程序。

HostInventory:記錄由Ansible管理的主機信息,包括端口、密碼、ip等。

Playbooks:“劇本”YAML格式文件,多個任務定義在一個文件中,定義主機需要調用哪些模塊來完成的功能。

CoreModules:核心模塊,主要操作是通過調用核心模塊來完成管理任務。

CustomModules:自定義模塊,完成核心模塊無法完成的功能,支持多種語言。

ConnectionPlugins:連接插件,Ansible和Host通信使用

二:配置文件解析;

主配置文件:/etc/ansible/ansible.cfg中部分參數

inventory = /etc/ansible/hosts #資源清單inventory文件的位置,即一些Ansible需要連接管理的主機列表;
library = /usr/share/ansible #指向存放Ansible模塊的目錄。Ansible的操作動作,無論是本地或遠程,都使用一小段代碼來執行,這小段代碼稱爲模塊;
forks = 5  #設置默認情況下Ansible最多能有多少個進程同時工作, 從Ansible 1.3開始,fork數量默認設置最多5個進程並行處理;
sudo_user = root #默認執行命令的用戶,也可以在playbook中重新設置這個參數;
remote_port = 22 #連接被管節點的管理端口,默認是22。(爲了防止黑客攻擊,生產中一般不用22(可在/etc/ssh/sshd_config中改Port));
host_key_checking= False #是否檢查SSH主機的密鑰。可以設置爲True或False,關閉後第一次連接沒有提示配置實例;
timeout= 60 #SSH連接的超時間隔,單位是秒;
log_path= /var/log/ansible.log #指定一個存儲Ansible日誌的文件,Ansible系統默認是不記錄日誌的,(一般建議開啓,方便審計); 
另外需要注意:
Ansible支持多個目錄方式,只要用冒號(:)隔開就可以,同時也會檢查當前執行playbook位置下的./library目錄
執行Ansible的用戶需要有寫入日誌的權限,模塊將會調用被管節點的syslog來記錄
主機清單文件:/etc/ansible/hosts如下兩種定義方式,引用時直接用名字,eg:mysql_test

#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

三: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-playbook,用法都差不多,選項很多,用ansible/ansible-play  --help或者查man幫助文檔都能看到,這裏就不過多介紹,在接下來的模塊實例中會做一些相關的操作;
用法:ansible <host-pattern> [-f forks] [-m modulename] [-a args]
<host-pattern>:主機清單列表名;
 [-f forks]:併發數;
[-m modulename]:指定模塊,默認是command;
[-a args]:模塊參數;

四:常用模塊;

1、ping:主機連通性測試
eg:ansible mysql-test -m ping

2command在遠程主機執行命令; 不支持|管道命令 ;注意command模塊很多不支持:管道|><、;、&可以用shell模塊代替;

常用選項:

chdir #在執行命令之前,先切換目錄

creates #接一個文件名,當這個文件存在,則不執行,可用於判斷

executable # 切換shell來執行命令,需要使用命令的絕對路徑

free_form # 要執行的Linux指令,一般使用Ansible的-a參數代替。

removes # 一個文件名,這個文件不存在,則該命令不執行,與creates相反的判斷

eg:ansible mysql-test -mcommand -a "ip a" #-a後面接上要在遠程主機上執行的命令;
ansible mysql-test -m command -a "chdir=/app ls" #ls查看遠程主機上的/app目錄
ansible mysql-test -m command -a"creates=/app/b  touch /app/b " #若是/app/存在文件b則後面命令不執行,若不存在,則創建之;
ansible mysql-test -m command -a"removes=/app/b  touch /app/1 "--》存在就執行,不存在就不執行

3shell在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,例如管道等 :

eg:
ansible mysql-test -m shell -a "cat /etc/passwd|grep '^root'" #遠程執行查看passwd文件內容過濾出行首是root的用戶信息;

4copy:複製文件到遠程主機,可以改權限等

常用選項:

backup:在覆蓋之前,將源文件備份,備份文件包含時間信息。有兩個選項:yes|no

content:用於替代“src”,可以直接設定指定文件的值

dest:必選項。要將源文件複製到的遠程主機的絕對路徑,如果源文件是一個目錄,那麼該路徑也必須是個目錄

directory_mode:遞歸設定目錄的權限,默認爲系統默認權限

force:如果目標主機包含該文件,但內容不同,如果設置爲yes,則強制覆蓋,如果爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes

others:所有的file模塊裏的選項都可以在這裏使用

src:被複制到遠程主機的本地文件,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞歸複製。在這種情況下,如果路徑使用“/”來結尾,則只複製目錄裏的內容,如果沒有使用“/”來結尾,則包含目錄在內的整個內容全部複製,類似於rsync 

用法:

(1) 複製文件

-a “src= dest= ”

eg:
ansible mysql-test -m copy -a "src=ip.log dest=/app/ mode=644" #還可以修改權限

(2) 給定內容生成文件

-a "content= dest= "

eg:
ansible mysql-test -m copy -a "content=hello  dest=/app/sun  mode=644" #在遠程主機上的/app/下創建一個內容是“hello”的sun文件;

5file:設置文件屬性;

常用選項:

force:需要在兩種情況下強制創建軟鏈接,一種是源文件不存在,但之後會建立的情況下;另一種是目標軟鏈接已存在,需要先取消之前的軟鏈,然後創建新的軟鏈,有兩個選項:yes|no

group:定義文件/目錄的屬組mode:定義文件/目錄的權限

owner:定義文件/目錄的屬主path:必選項,定義文件/目錄的路徑

recurse:遞歸設置文件的屬性,只對目錄有效src:被鏈接的源文件路徑,只應用於state=link的情況

dest:被鏈接到的路徑,只應用於state=link的情況

state:

directory:如果目錄不存在,就創建目錄

file:即使文件不存在,也不會被創建

link:創建軟鏈接

hard:創建硬鏈接

touch:如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在,則更新其最後修改時間

absent:刪除目錄、文件或者取消鏈接文件


創建目錄:-a “path=  state=directory”

創建鏈接文件:-a “path=  src=  state=link”

刪除文件:-a “path=  state=absent”

eg:
ansible mysql-test -m file -a "path=/app/httpd.bz2 src=/root/httpd-2.4.27 state=link" #注意src的文件遠程主機上必須有,path的路徑必須有,後面的文件可以是新創建的名;
ansible mysql-test -m file -a "dest=/app/httpd.sjjsrc=/root/httpd-2.4.27 state=link";#創建軟連接
ansible mysql-test -m file -a "path=/app/httpd.sjj state=absent";#刪除/app/httpd.sjj文件;

6fetch從遠程某主機獲取文件到本地:----》常用於對比是否有不一樣的文件

常用選項:

dest:用來存放文件的目錄,例如存放目錄爲backup,源文件名稱爲/etc/profile在主機pythonserver中,那麼保存爲/backup/pythonserver/etc/profile

src:在遠程拉取的文件,並且必須是一個file,不能是目錄

eg:
ansible mysql-test -mfetch -a 'src=/app/fdisk09.sh dest=/root'  #從web組上遠程主機中/app/fdisk09.sh拷貝到/root下,會自動生成以主機ip爲名的目錄,下面是app目錄,然後是fdisk09.sh;(自動遞歸創建)

7、cron 管理cron計劃任務-a “”: 設置管理節點生成定時任務

action:

cron backup= # 如果設置,創建一個crontab備份 【yes|no】

cron_file= #如果指定, 使用這個文件cron.d,而不是單個用戶

crontab:

day= #日應該運行的工作( 1-31, *, */2, )

hour= # 小時 ( 0-23, *, */2, )

minute= #分鐘( 0-59, *, */2, )

month= # 月( 1-12, *, /2, )

weekday # 周 ( 0-6 for Sunday-Saturday,, )

job= #指明運行的命令是什麼

name= #定時任務描述

reboot # 任務在重啓時運行,不建議使用,建議使用special_time

special_time#特殊的時間範圍,參數:reboot(重啓時),annually(每年),monthly(每月),weekly(每週),daily(每天),hourly(每小時)

state #指定狀態,present表示添加定時任務,也是默認設置,absent表示刪除定時任務

user # 以哪個用戶的身份執行

eg:
ansible mysql-test -m cron -a "name='ntpupdate every 5min' minute=*/5 job='/sbin/ntpdate 172.17.0.1 &> /dev/null'"
ansible mysql-test -m shell -a "crontab -l" #查看一下上面的定義
8、service:服務程序管理;

常用選項:

arguments #命令行提供額外的參數

enabled #設置開機啓動。

name= #服務名稱

runlevel #開機啓動的級別,一般不用指定。

sleep #在重啓服務的過程中,是否等待。如在服務關閉以後等待2秒再啓動。

state #started啓動服務, stopped停止服務, restarted重啓服務,reloaded重載配置

9、yum:安裝軟件

常用選項:

conf_file #設定遠程yum安裝時所依賴的配置文件。如配置文件沒有在默認的位置。

disable_gpg_check #是否禁止GPG checking,只用於`present‘ or`latest’。

disablerepo #臨時禁止使用yum庫。 只用於安裝或更新時;

Enablerepo  #臨時使用的yum庫。只用於安裝或更新時;

name=    #所安裝的包的名稱

state=      #present安裝, latest安裝最新的, absent 卸載軟件

update_cache #強制更新yum的緩存。 

10、user模塊管理用戶模塊,管理用戶帳號action: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 # 更新用戶密碼

eg:
ansible mysql-test -m user -a "name=tom comment='a good boy' uid=1222 shell=/bin/sh home=/home/tomhome" #遠程創建用戶
11、group用戶組模塊,添加或刪除組action:group

常用選項:

gid # 設置組的GID號

name= # 管理組的名稱

state # 指定組狀態,默認爲創建,設置值爲absent爲刪除

system # 設置值爲yes,表示爲創建系統組 

12、script:在指定節點運行服務端的腳本 ;

eg:
#在本地寫一個腳本,(加不加執行權限都一樣)
#!/bin/bash
 
date>> /tmp/sjj.log
echo"hello" >> /tmp/sjj.log
然後執行:
ansible mysql-test -m script -a "/root/shell.sh"  #在web主機列表中的主機上都會生成/tmp/sjj.log文件;

13setup模塊主要用於獲取主機信息

ansiblefacts組件採集被管理機器的信息,setup模塊可以查機器上所有facts信息,可通過filter過濾指定信息;整個facts信息被包裝在一個JSON格式的數據結構中;

facts是內建變量,經常使用的一個參數是filter參數在playbooks裏經常會用到的一個參數gather_facts

eg:
#ansible10.212.52.252 -m setup -a 'filter=ansible_*_mb'  #查看主機內存信息
#ansible10.212.52.252 -m setup -a 'filter=ansible_eth[0-2]'  #查看地接口爲eth0-2的網卡信息







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