運維自動化之ansible

運維自動化之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命令執行過程

blob.png 

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地址

實現效果:無密碼連接

blob.png 


三、配置主機組:

在/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

blob.png 


利用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'  

     blob.png 

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"'

 blob.png


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'  創建目錄

  blob.png

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

 blob.png

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'   創建軟鏈接

 圖片1.png

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' 

blob.png 


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主機組對應的主機查看計劃任務

blob.png 

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

 blob.png

blob.png 


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

blob.png 


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裏的主機名)

 blob.png

項目總結:

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


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