1. 程式人生 > >運維自動化之ansible

運維自動化之ansible

ansible hoc 自動化

運維自動化之ansible

項目場景:

公司計劃在年底做一次大型市場促銷活動,全面沖刺下交易額,為明年的上市做準備。公司要求各業務組對年底大促做準備,運維部要求所有業務容量進行三倍的擴容,並搭建出多套環境可以共開發和測試人員做測試。

技術說明:

ansible聚集以上部署和命令執行於一身,能夠完整輕易的實現應用部署和批量命令功能,適用於主機數量中型規模,再大的規模用puppet

ansible是基於 paramiko 開發的,並且基於模塊化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。ansible不需要在遠程主機上安裝client/agents

,因為它們是基於ssh來和遠程主機通訊的。

ansible工作模式:

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

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

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

ansible特點:

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

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

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

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

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

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

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

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

Ansiblie命令執行過程

技術分享圖片

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 臨時命令執行工具,常用於臨時命令的執行。

/usr/bin/ansible-doc 模塊功能查看工具。

/usr/bin/ansible-playbook 定制自動化的任務集編排工具,即按照劇本執行命令的

常用命令示例:

查看模塊列表:ansible-doc -l

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

臨時命令執行:ansible <host-pattern> [-f forks] [-m module_name] [-a args] [-C] [-v]

Host-pattern指明單個主機或者主機組

-f 指定並發連接數

-m 指明使用的模塊

-a 指明使用的模塊參數

-C表示只是測試而不真正執行,可以用來預測

-v 顯示詳細信息,還可以使用-vv-vvv....

項目準備:

Ansible服務器node1ip172.17.13.134

主機組web:node2及node3ip172.17.13.135 172.17.13.136

項目實現:

一、安裝ansible,有兩種方式,任選一種即可

1、使用yum安裝:yum install ansible -y

2、使用pippython的包管理模塊)安裝:yum install python-pip;pip install ansible


二、配置ansible使用公鑰驗證,實現無密碼遠程連接:

雖然ansible支持其他主機認證方式,但是我們最常用的的還是基於秘鑰的認證:

1、首先生成秘鑰

ssh-keygen -t rsa -P ''

2、然後向主機分發秘鑰:

ssh-copy-id [root@]ip #@後面跟主機名或者IP地址

實現效果:無密碼連接

技術分享圖片


三、配置主機組:

在/etc/ansible/hosts文件中加入主機組

比如[web]

172.17.13.135

172.17.13.136 表示在web主機組裏配置兩個主機

組成員也可以使用通配符來匹配,如下 172.17.13.[135:137] #表示匹配從172.17.13.135-172.17.13.137的主機。

也可以直接添加主機而不需要主機組。


四、主機連通性測試:

ansible web -m ping

技術分享圖片


利用Ansible的模塊來實現運維自動化


1、Command

命令模塊接受命令名稱,後面是空格分隔的列表參數。給定的命令將在所有選定的節點上執行。它不會通過shell進行處理,比如$HOME操作和”小於”<,>, |, ;,&”等操作。

Command模塊的參數:

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

示例:切換到/tmp目錄之後再使用ls查看文件

ansible web -m command -a 'chdir=/tmp ls'

creates # 一個文件名,當這個文件存在,則該命令不執行,可以用來做判斷

示例:當/tmp存在則不執行後面的命令

ansible web -m command -a 'creates=/tmp ls'

技術分享圖片

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

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

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

示例:當/tmp存在則執行後面的命令

ansible web -m command -a 'removes=/tmp ls'


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

示例:過濾出/etc/passwd文件中的root

ansible web -m shell -a 'cat /etc/passwd |grep "root"'

技術分享圖片


3、copy:復制文件到遠程主機,可以改權限等

用法:

(1) 復制文件

-a “src= dest=

(2) 給定內容生成文件

-a 'content= dest= mode="'

相關選項如下:

backup:在覆蓋之前,將源文件備份,備份文件包含時間信息。yes|no代表備份|不備份

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

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

mode:設定權限

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

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

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

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

示例:

①對web主機組的主機創建/tmp/test.ansible文件,內容為hello\nworld,權限為666

ansible web -m copy -a 'content="hello\nworld" dest=/tmp/test.ansible mode=666'

②拷貝本機的圖片到對應主機組中主機的/data/photo,權限為644,且覆蓋之前備份:

ansible web -m copy -a 'src=/root/2345_image_file_copy_2.jpg dest=/data/photo mode=644 backup=yes'


4、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:刪除目錄、文件或者取消鏈接文件

示例:

ansible web -m file -a 'path=/data/webapp state=directory' 創建目錄

技術分享圖片

ansible web -m file -a 'path=/data/webapp state=absent' 刪除目錄

技術分享圖片

ansible web -m file -a 'path=/data/img src=/data/photo state=link' 創建軟鏈接

ansible web -m file -a 'dest=/data/img2 src=/data/photo state=link' 創建軟鏈接

技術分享圖片

ansible web -m file -a 'path=/data/haha state=touch' 創建文件


5、fetch 從遠程某主機獲取文件到本地:

dest:用來存放文件的目錄

例如存放目錄為backup,源文件名稱為/etc/profile,在主機pythonserver中,那麽保存為/backup/pythonserver/etc/profile

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

示例:

ansible web -m fetch -a 'src=/data/photo dest=/data/photo'

技術分享圖片


6、cron 管理cron計劃任務:

-a “”: 設置管理節點生成定時任務

action:

cron backup= # 如果設置,則根據其值(yes|no)確定是否創建一個crontab備份

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

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 # 以哪個用戶的身份執行

示例:每天同步一次時間:

ansible web -m cron -a 'name="ntp" special_time=daily job="/sbin/ntpdate 172.17.0.1 &>/dev/null"'

每五分鐘同步一次時間:

ansible web -m cron -a 'name="ntp update" minute="*/5" job="/sbin/ntpdate 172.17.0.1 &>/dev/null"'

web主機組對應的主機查看計劃任務

技術分享圖片

ansible web -m cron -a 'name="ntp update" minute="*/5" job="/sbin/ntpdate 172.17.0.1 &>/dev/null" state=absent' 刪除計劃任務


7、yum 安裝軟件

conf_file #設定遠程yum安裝時所依賴的配置文件。

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

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

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

name= #所安裝的包的名稱,可以是軟件,也可以是rpm

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

update_cache #強制更新yum的緩存。

示例:

ansible web -m yum -a 'name=htop state=present disable_gpg_check=yes' 安裝htop

ansible web -m yum -a 'name=htop state=absent disable_gpg_check=yes' 卸載htop

技術分享圖片

技術分享圖片


8、service: 服務程序管理

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

enabled #設置開機啟動,true|falseyes|no

name= #服務名稱

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

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

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

示例:啟動nginx服務並設置開機自啟動:

ansible web -m service -a 'name=nginx state=started enabled=true'

重啟nginx服務,在服務關閉兩秒後再啟動:

ansible web -m service -a 'name=nginx state=restarted sleep=2s'


9、user 用戶模塊,管理用戶帳號action: user

comment # 用戶的描述信息

createhome # 是否創建家目錄

force # 在使用state=absent, 行為與userdel force一致.

group # 指定基本組

groups # 指定附加組,如果指定為(groups=)表示刪除所有組

home # 指定用戶家目錄

move_home # 如果設置為home=, 試圖將用戶主目錄移動到指定的目錄

name # 指定用戶名

non_unique # 該選項允許改變非唯一的用戶ID

password # 指定用戶密碼.指定完之後使用openssh加密,將加密密碼寫進/etc/shadow

remove # 在使用state=absent, 行為與userdel remove一致

shell # 指定默認shell

state # 設置帳號狀態,不指定為創建,指定值為absent表示刪除

system # 當創建一個用戶,設置這個用戶是系統用戶。這個設置不能更改現有用戶

uid # 指定用戶的uid

示例:創建用戶tom,密碼123456uid1066,默認shell/bin/bash

ansible web -m user -a 'name=tom password=123456 uid=1066 shell=/bin/bash'

創建用戶tom並指明uid,主組,附加組,默認shell,家目錄

ansible web -m user -a 'name=tom comment="tom is tom" uid=1066 group=tom groups=wheel

shell=/bin/zshell home=/home/tomhome'


10、group 用戶組模塊,添加或刪除組

action: group

gid # 設置組的GID

name= # 管理組的名稱

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

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

示例:創建名為tom的組

ansible web -m group -a 'name=tom state=present'


11、script 在指定節點運行服務端的腳本

vim test.sh

#/bin/bash

touch /tmp/test.sh.log

echo “hello>> /tmp/test.sh.log

加執行權限:chmod +x test.sh

執行:ansible web -m script -a ‘/root/test.sh’

查看效果:ansible web -m shell -a ‘cat /tmp/test.sh.log

技術分享圖片


12、setup模塊

facts組件是Ansible用於采集被管機器設備信息的一個功能,我們可以使用setup模塊查機器的所有facts信息,可以使用filter來查看指定信息。整個facts信息被包裝在一個JSON格式的數據結構中,ansible_facts是最上層的值。

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

setup模塊,主要用於獲取主機信息,在playbooks裏經常會用到的一個參數gather_facts就與該模塊相關。setup模塊下經常使用的一個參數是filter參數。

示例:

ansible web -m setup 獲取web主機組裏主機的所有信息

ansible web -m setup -a 'filter=ansible_*_mb' //查看主機內存信息

ansible web -m setup -a 'filter=ansible_eth[0-2]' //查看接口為eth0-2的網卡信息

ansible all -m setup --tree /tmp/facts //將所有主機的信息輸入到/tmp/facts目錄下,每臺主機的信息輸入到對應主機名文件中(/etc/ansible/hosts裏的主機名)

技術分享圖片

項目總結:

以上都是命令行式的操作,操作比較繁瑣,而且不容易排錯與維護,所以我們可以使用Ansible playbook來實現。具體用法參看博客:


運維自動化之ansible