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通信使用
二:配置文件解析;
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幫助文檔都能看到,這裏就不過多介紹,在接下來的模塊實例中會做一些相關的操作;四:常用模塊;
2、command:在遠程主機執行命令; 不支持|管道命令 ;注意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 "--》存在就執行,不存在就不執行
3、shell:在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,例如管道等 :
eg:
ansible mysql-test -m shell -a "cat /etc/passwd|grep '^root'" #遠程執行查看passwd文件內容過濾出行首是root的用戶信息;
4、copy:複製文件到遠程主機,可以改權限等
常用選項:
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文件;
5、file:設置文件屬性;
常用選項:
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文件;
6、fetch從遠程某主機獲取文件到本地:----》常用於對比是否有不一樣的文件
常用選項:
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文件;
13、setup模塊,主要用於獲取主機信息;
ansible中facts組件採集被管理機器的信息,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的網卡信息