1. 程式人生 > >Ansible---常用模組:Python自動化運維

Ansible---常用模組:Python自動化運維

一、ansible 介紹

1. Ansible自動化運維工具,基於Python開發,集合了眾多運維工具的優點,實現了批量系統配置、批量程式部署、批量執行命令等功能。ansible是基於模組工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所執行的模組,ansible只是提供一種框架。

2.特點

(1)  no agents:不需要在被管控主機上安裝任何客戶端;

(2)  no server:無伺服器端,使用時直接執行命令即可;

(3)  modules in any languages:基於模組工作,可使用任意語言開發模組;

(4)  yaml,not code:使用yaml語言定製劇本playbook;

(5)  ssh by default:基於SSH工作;

(6)  strong multi-tier solution:可實現多級管理。

3.優勢

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

(2)  批量任務執行可以寫成指令碼,而且不用分發到遠端就可以執行;

(3)  使用python編寫,維護更簡單;

(4)  支援sudo。

4.工作機制

  • Ansible :     核心

  • Modules :    包括 Ansible 自帶的核心模組及自定義模組

  • Plugins :      完成模組功能的補充,包括連線外掛、郵件外掛等

  • Inventory :    定義 Ansible 管理主機的清單

  • Playbooks :   劇本;定義 Ansible 多工配置檔案,由Ansible 自動執行

5.工作流程

二、Ansible安裝

先安裝EPEL源後再安裝Ansible

wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm 
yum -y install epel-release-latest-6.noarch.rpm
yum  -y install ansible 
測試 ansible --version
ansible 2.6.4
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.6.6 (r266:84292, Jul 23 2015, 15:22:56) [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)]

Ansible配置檔案

/etc/ansible/ansible.cfg    主配置檔案
/etc/ansible/hosts          Inventory
/usr/bin/ansible-doc        幫助檔案
/usr/bin/ansible-playbook   指定執行任務檔案

三、實驗:環境準備

1)準備工作 一臺主控主機:172.16.253.253 (centos6.8) 一臺被控主機:172.16.253.219 (centos6.8)   172.16.253.57(centos 7.2)   10.68.71.54(centos7.2)

主控與被控可以相互通訊!!

安裝要求: 控制主機:需要安裝 Python2.6/2.7 安裝方法見上 管理主機:需要安裝 Python2.4 以上版本,關閉selinux              

centos6.8預設python版本為2.6.6

centos7.2預設python版本為2.7.5

2)配置主機清單 vim /etc/ansible/hosts 172.16.253.219 172.16.253.57 10.68.71.54

3)配置控制主機SSH金鑰 在控制主機中生成ssh金鑰對 ssh-keygen -t rsa   #一路回車預設

4)將公鑰拷貝到管理主機中.ssh/authorized_keys檔案中,實現免密碼登入遠端管理主機

ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

(ssh-copy-id命令會自動將id_rsa.pub檔案的內容追加到遠端主機root使用者下.ssh/authorized_keys檔案中)

5)ansible配置

vi /etc/ansible/   # +61 +102取消註釋

host_key_checking = False   # 禁用每次執行ansbile命令檢查ssh key host
log_path = /var/log/ansible.log   #開啟日誌記錄

測試:主控機

四、常用模組使用 1)setup 檢視遠端主機基本資訊 ansible all -m setup

2)ping 測試遠端主機執行狀態 ansible all  -m ping

3)file

設定檔案屬性
相關選項:
group:定義檔案/目錄的屬組
mode:定義檔案/目錄的許可權
owner:定義檔案/目錄的屬主
path:必選項,定義檔案/目錄的路徑
recurse:遞迴設定檔案的屬性,只對目錄有效
src:被連結的原始檔路徑,只應用於state=link的情況
dest:被連結到的路徑,只應用於state=link的情況
force:需要在兩種情況下強制建立軟連結,一種是原始檔不存在,但之後會建立的情況下;另一種是目標軟連結已存在,需要先取消之前的軟鏈,然後建立新的軟鏈,有兩個選項:yes|no
state:
       directory:如果目錄不存在,就建立目錄
       file:即使檔案不存在,也不會被建立
       link:建立軟連結
       hard:建立硬連結
       touch:如果檔案不存在,則會建立一個新檔案,如果檔案或目錄已存在,則更新其最後修改時間
       absent:刪除目錄、檔案或者取消連結檔案

例項: 遠端檔案連結建立 ansible  [HostGroup or IP]  -m file -a "src=/etc/resolv.conf dest=/tmp/resolv.conf state=link"

被控機上檢視:

遠端檔案連結刪除

ansible all  -m file -a "path=/tmp/resolv.conf state=absent"

4)copy

複製檔案到遠端主機
相關選項:
backup:在覆蓋之前,將原始檔備份,備份檔案包含時間資訊。有兩個選項:yes|no
content:用於替代“src”,可以直接設定指定檔案的值
dest:必選項。要將原始檔複製到的遠端主機的絕對路徑,如果原始檔是一個目錄,那麼該路徑也必須是個目錄
directory_mode:遞迴設定目錄的許可權,預設為系統預設許可權
force:如果目標主機包含該檔案,但內容不同,如果設定為yes,則強制覆蓋,如果為no,則只有當目標主機的目標位置不存在該檔案時,才複製。預設為yes
others:所有的file模組裡的選項都可以在這裡使用
src:被複制到遠端主機的本地檔案,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞迴複製。在這種情況下,如果路徑使用“/”來結尾,則只複製目錄裡的內容,如果沒有使用“/”來結尾,則包含目錄在內的整個內容全部複製,類似於rsync。

例項: 將本地檔案“/root/1.txt ”複製到遠端伺服器

ansible all -m copy -a "src=/root/1.txt dest=/tmp/1.txt owner=root group=root mode=0644"

5)command

在遠端主機上執行命令
相關選項如下:
creates:一個檔名,當該檔案存在,則該命令不執行
free_form:要執行的linux指令
chdir:在執行指令之前,先切換到該目錄
removes:一個檔名,當該檔案不存在,則該選項不執行
executable:切換shell來執行指令,該執行路徑必須是一個絕對路徑

例項: ansible all -m command -a "uptime" #執行命令不寫入history

遠端檔案資訊檢視 ansible  all  -m command -a "ls –l /tmp/1.txt"

6)shell 切換到shell執行指定的指令,引數與command相同。 與command不同的是,此模組可以支援命令管道,同時還有另一個模組也具備此功能:raw

例項: 先在本地建立一個SHELL指令碼 vim /tmp/test.sh

#!/bin/sh
date +%F_%H:%M:%S

chmod +x /tmp/test.sh 將建立的指令碼檔案分發到遠端 ansible all  -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh owner=root group=root mode=0755"

遠端執行 ansible all  -m shell -a "/tmp/test.sh"

7)cron

建立和刪除計劃任務
ansible [HostGroup or IP] -m cron -a "name='....' job='.....' $time"
-m 跟模組,使用的是 cron 模組
name= 指定計劃任務的名字,方便日後管理
job= 指定具體的任務
$time 指定具體的執行時間,minute分鐘,hour小時,day 天,month 月份。weekday 0 或者 7 代表週末。
state= 選項用來指定 name 並刪除

增加計劃任務 ansible all -m cron -a "name='test cron' job='/bin/bash /tmp/test.sh' weekday=6"

# 被控機檢視

刪除計劃任務 ansible all   -m cron -a "name='test cron' state=absent"

8)安裝 rpm 包 -m 使用 yum 模組 state= installed  removed ,不加state選項預設是 installed  ansible all -m yum -a "name=tree" ansible all  -m yum -a "name=wget state=removed"

9)管理服務 -m service 模組 name= 系統服務,可以用 chkconfig --list 檢視 enabled= 是否開機啟動,yes| no。 ansible all  -m service -a "name=httpd state=started enabled=no" ansible all  -m service -a "name=httpd state=stopped enabled=yes"

10)其他模組使用幫助

# ansible-doc -l                列出ansible所有的模組
# ansible-doc -s MODULE_NAME    檢視指定模組具體適用