一、Ansible概述
1.1 Ansible是什么
Ansible是一個基于Python開發(fā)的配置管理和應用部署工具,現(xiàn)在也在自動化管理領域大放異彩。它融合了眾多老牌運維工具的優(yōu)點,Pubbet和Saltstack能實現(xiàn)的功能,Ansible基本上都可以實現(xiàn)。
市面上其他自動化工具:pupet(ruby語言) saltstack(python) chef(C/S模式)等
Ansible能批量配置、部署、管理上千臺主機。比如以前需要切換到每個主機上執(zhí)行的一或多個操作,使用Ansible只需在固定的一臺Ansible控制節(jié)點上去完成所有主機的操作。
Ansible是基于模塊工作的,它只是提供了一種運行框架,它本身沒有完成任務的能力,真正執(zhí)行操作的是Ansible的模塊, 比如copy模塊用于拷貝文件到遠程主機上,service模塊用于管理服務的啟動、停止、重啟等。
1.2 Ansible的特性
(1)特性一
Ansible其中一個比較鮮明的特性是Agentless,即無Agent的存在,它就像普通命令一樣,并非C/S軟件,也只需在某個作為控制節(jié)點的主機上安裝一次Ansible即可,通常它基于ssh連接來控制遠程主機,遠程主機上不需要安裝Ansible或其它額外的服務。
使用者在使用時,在服務器終端輸入命令或者playbooks,會通過預定好的規(guī)則將playbook拆解為play,再組織成ansible可以識別的任務,調用模塊和插件,根據(jù)主機清單通過SSH將臨時文件發(fā)給遠程的客戶端執(zhí)行并返回結果,執(zhí)行結束后自動刪除
(2)特性二
Ansible的另一個比較鮮明的特性是它的絕大多數(shù)模塊都具備冪等性(idempotence)。所謂冪等性,指的是多次操作或多次執(zhí)行對系統(tǒng)資源的影響是一致的。比如執(zhí)行 systemctl stop xxx
命令來停止服務,當發(fā)現(xiàn)要停止的目標服務已經(jīng)處于停止狀態(tài), 它什么也不會做,所以多次停止的結果仍然是停止,不會改變結果,它是冪等的,而 systemctl restart xxx
是非冪等的。
Ansible的很多模塊在執(zhí)行時都會先判斷目標節(jié)點是否要執(zhí)行任務,所以,可以放心大膽地讓Ansible去執(zhí)行任務,重復執(zhí)行某個任務絕大多數(shù)時候不會產(chǎn)生任何副作用。
1.3 Ansible的特點
- 部署簡單,只需在主控端部署Ansible環(huán)境, 被控端無需做任何操作
- 默認使用SSH協(xié)議設備進行管理;
- 主從集中化管理
- 配置簡單、功能強大、擴張性強;
- 支持API及自定義模塊,可以通過Pyhton輕松擴展
- 通過playbooks 來定制強大的配置、狀態(tài)管理
- 對云計算平臺、大數(shù)據(jù)都有很好的支持
1.4 Ansible數(shù)據(jù)流向
Host Inventory:記錄Ansible管理的主機信息,包含端口、密碼、IP等
Playbooks:劇本 YMAL 格式文件,多個任務定義在一個文件中,定義主機需要調用哪些模塊來完成的功能
Core Modules:核心模塊 主要操作是通過調用核心模塊來完成任務
Connection Plugins:連接主機,是插件,ansible和 Host (主機) 通信使用
Custom Modules:自動定義模塊,完成核心模塊無法完成的功能,支持多種語言
二、Ansible 環(huán)境安裝部署
IP | 服務 | |
---|---|---|
管理端 | 192.168.147.105 | ansible |
被管理端 | 192.168.147.106 | 無 |
被管理端 | 192.168.147.107 | 無 |
//管理端安裝 ansible
yum install -y epel-release //先安裝 epel 源
yum install -y ansible
//ansible 目錄結構
/etc/ansible/
├── ansible.cfg #ansible的配置文件,一般無需修改
├── hosts #ansible的主機清單,用于存儲需要管理的遠程主機的相關信息
└── roles/ #公共角色目錄
//配置主機清單
cd /etc/ansible
vim hosts
[webservers] #配置組名
192.168.147.106 #組里包含的被管理的主機IP地址或主機名(主機名需要先修改/etc/hosts文件)
[dbservers]
192.168.147.107
//配置密鑰對驗證
ssh-keygen
#生成公鑰,輸入命令輸入4個回車即可
cd ~/.ssh
ssh-copy-id -i 192.168.147.106
ssh-copy-id -i 192.168.147.107
#進入生成的公鑰路徑將公鑰傳輸給備管理的服務器,傳輸需要輸入每臺備管理服務的root密碼
//進行驗證
ssh 192.168.147.106
三、Ansible 命令行模塊
命令格式
ansible <組名> -m <模塊> -a <參數(shù)列表>
ansible <主機IP> -m <模塊> -a <參數(shù)列表>
ansible <主機名> -a <參數(shù)列表> #不加-m指定模塊默認使用command
#選項解釋
-m: 指定模塊
-a: 指定命令
ansible-doc -l #列出所有已安裝的模塊,按q退出
(1)command 模塊
在遠程主機執(zhí)行命令,不支持管道,重定向等shell的特性。
ansible-doc -s command #-s 列出指定模塊的描述信息和操作動作
ansible 192.168.147.106 -m command -a 'date' #指定 ip 執(zhí)行 date
ansible webservers -m command -a 'date' #指定組執(zhí)行 date
ansible dbservers -m command -a 'date'
ansible all -m command -a 'date' #all 代表所有 hosts 主機
ansible all -a 'ls /' #如省略 -m 模塊,則默認運行 command 模塊
//常用的參數(shù):
chdir:在遠程主機上運行命令前提前進入目錄
creates:判斷指定文件是否存在,如果存在,不執(zhí)行后面的操作
removes:判斷指定文件是否存在,如果存在,執(zhí)行后面的操作
ansible all -m command -a "chdir=/home ls ./"
(2)shell 模塊
在遠程主機執(zhí)行命令,相當于調用遠程主機的shell進程,然后在該shell下打開一個子shell運行命令(支持管道符號等功能)
ansible-doc -s shell
免交互修改用戶密碼
ansible dbservers -m shell -a 'echo 123456 | passwd --stdin test'
過濾ens33網(wǎng)卡地址
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print $2}") | cut -d " " -f2'
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print \$2}")'
(3)cron 模塊
在遠程主機定義任務計劃。其中有兩種狀態(tài)(state):present表示添加(可以省略),absent表示移除。
ansible-doc -s cron #按 q 退出
//常用的參數(shù):
minute/hour/day/month/weekday:分/時/日/月/周
job:任務計劃要執(zhí)行的命令
name:任務計劃的名稱
每分鐘輸出一次“helloworld”,任務名稱為test crontab
ansible webservers -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test crontab"'
ansible webservers -a 'crontab -l' #查看目標主機的計劃任務
ansible webservers -m cron -a 'name="test crontab" state=absent' #移除計劃任務,假如該計劃任務沒有取名字,name=None即可
(4)user 模塊
//用戶管理的模塊
ansible-doc -s user
常用的參數(shù):
參數(shù) | 說明 |
---|---|
name | 用戶名,必選參數(shù) |
state = present 或 absent | 創(chuàng)建賬號或者刪除賬號,present表示創(chuàng)建,absent表示刪除 |
system = yes 或 no | 是否為系統(tǒng)賬號 |
uid | 用戶uid |
group | 用戶基本組 |
shell | 默認使用的shell |
move_home = yes 或 no | 如果設置的家目錄已經(jīng)存在,是否將已經(jīng)存在的家目錄進行移動 |
password | 用戶的密碼,建議使用加密后的字符串 |
comment | 用戶的注釋信息 |
remove = yes 或 no | 當state=absent時,是否刪除用戶的家目錄 |
ansible dbservers -m user -a 'name="test01"' #創(chuàng)建用戶test01
ansible dbservers -m command -a 'tail /etc/passwd'
ansible dbservers -m user -a 'name="test01" state=absent' #刪除用戶test01
(5)group 模塊
//用戶組管理的模塊
ansible-doc -s group
ansible dbservers -m group -a 'name=mysql gid=306 system=yes' #創(chuàng)建mysql組
ansible dbservers -a 'tail /etc/group'
ansible dbservers -m user -a 'name=test01 uid=306 system=yes group=mysql' #將test01用戶添加到mysql組中
ansible dbservers -a 'tail /etc/passwd'
ansible dbservers -a 'id test01'
(6)copy 模塊
//用于復制指定主機文件到遠程主機的
ansible-doc -s copy
常用的參數(shù):
參數(shù) | 說明 |
---|---|
dest | 指出復制文件的目標及位置,使用絕對路徑,如果是源目錄,指目標也要是目錄,如果目標文件已經(jīng)存在會覆蓋原有的內容 |
src | 指出源文件的路徑,可以使用相對路徑或絕對路徑,支持直接指定目錄,如果源是目錄則目標也要是目錄 |
mode | 指出復制時,目標文件的權限 |
owner | 指出復制時,目標文件的屬主 |
group | 指出復制時,目標文件的屬組 |
content | 指出復制到目標主機上的內容,不能與src一起使用 |
ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'
ansible dbservers -a 'ls -l /opt'
ansible dbservers -a 'cat /opt/fstab.bak'
ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt' #將helloworld寫入/opt/hello.txt文件中
ansible dbservers -a 'cat /opt/hello.txt'
(7)file 模塊
//設置文件屬性
ansible-doc -s file
常用參數(shù):
參數(shù) | 說明 |
---|---|
path | 指定遠程服務器的路徑,也可以寫成"dest",“name” |
state | 狀態(tài),可以將值設定為directory表示創(chuàng)建目錄,設定為touch表示創(chuàng)建文件,設定為link表示創(chuàng)建軟鏈接,設定為hard表示創(chuàng)建硬連接,設定為absent表示刪除目錄文件或鏈接 |
mode | 文件復制到遠程并設定權限,默認file=644,directory=755 |
owner | 文件復制到遠程并設定屬主,默認為root |
group | 文件復制到遠程并設定屬組,默認為root |
recurese | 遞歸修改 |
src | 指的是目標主機上的源文件。與copy模塊不同。 |
ansible dbservers -m file -a 'owner=test01 group=mysql mode=644 path=/opt/fstab.bak' #修改文件的屬主屬組權限等
ansible dbservers -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link' #設置/opt/fstab.link為/opt/fstab.bak的鏈接文件
ansible dbservers -m file -a "path=/opt/123.txt state=touch" #創(chuàng)建一個文件
ansible dbservers -m file -a "path=/opt/123.txt state=absent" #刪除一個文件
(8)hostname 模塊
//用于管理遠程主機上的主機名
ansible dbservers -m hostname -a "name=mysql01"
(9)ping 模塊
//檢測遠程主機的連通性
ansible all -m ping
(10)yum 模塊
//在遠程主機上安裝與卸載軟件包
ansible-doc -s yum
ansible webservers -m yum -a 'name=httpd' #安裝服務
ansible webservers -m yum -a 'name=httpd state=absent' #卸載服務
(11)service/systemd 模塊
//用于管理遠程主機上的管理服務的運行狀態(tài)
ansible-doc -s service
常用的參數(shù):
參數(shù) | 說明 |
---|---|
name | 被管理的服務名稱 |
state=started / stopped / restarted | 動作包含啟動關閉或者重啟 |
enabled=yes / no | 表示是否設置該服務開機自啟 |
runlevel | 如果設定了enabled開機自啟去,則要定義在哪些運行目標下自啟動 |
ansible webservers -a 'systemctl status httpd' #查看web服務器httpd運行狀態(tài)
ansible webservers -m service -a 'enabled=true name=httpd state=started' #啟動httpd服務
(12)script 模塊
//實現(xiàn)遠程批量運行本地的 shell 腳本
ansible-doc -s script
vim test.sh
#!/bin/bash
echo "hello ansible from script" > /opt/script.txt
chmod +x test.sh
ansible webservers -m script -a 'test.sh'
ansible webservers -a 'cat /opt/script.txt'
(13)setup 模塊
//facts 組件是用來收集被管理節(jié)點信息的,使用 setup 模塊可以獲取這些信息
ansible-doc -s setup
ansible dbservers -m setup #獲取mysql組主機的facts信息
ansible dbservers -m setup -a 'filter=*ipv4' #使用filter可以篩選指定的facts信息
四、inventory 主機清單
Inventory支持對主機進行分組,每個組內可以定義多個主機,每個主機都可以定義在任何一個或多個主機組內。文章來源:http://www.zghlxwxcb.cn/news/detail-692494.html
如果是名稱類似的主機,可以使用列表的方式標識各個主機。文章來源地址http://www.zghlxwxcb.cn/news/detail-692494.html
vim /etc/ansible/hosts
[webservers]
192.168.147.106:2222 #冒號后定義遠程連接端口,默認是 ssh 的 22 端口
192.168.147.10[2:5]
[dbservers]
db-[a:f].example.org #支持匹配 a~f
inventory 中的變量
變量名 | 含義 |
---|---|
ansible_host | ansible連接節(jié)點時的IP地址 |
ansible_port | 連接對方的端口號,ssh連接時默認為22 |
ansible_user | 連接對方主機時使用的主機名。不指定時,將使用執(zhí)行ansible或ansible-playbook命令的用戶 |
ansible_password | 連接時的用戶的ssh密碼,僅在未使用密鑰對驗證的情況下有效 |
ansible_ssh_private_key_file | 指定密鑰認證ssh連接時的私鑰文件 |
ansible_ssh_common_args | 提供給ssh、sftp、scp命令的額外參數(shù) |
ansible_become | 允許進行權限提升 |
ansible_become_method | 指定提升權限的方式,例如可使用sudo/su/runas等方式 |
ansible_become_user | 提升為哪個用戶的權限,默認提升為root |
ansible_become_password | 提升為指定用戶權限時的密碼 |
(1)主機變量
[webservers]
192.168.147.105 ansible_port=22 ansible_user=root ansible_password=abc1234
(2)組變量
[webservers:vars] #表示為 webservers 組內所有主機定義變量
ansible_user=root
ansible_password=abc1234
[all:vars] #表示為所有組內的所有主機定義變量
ansible_port=22
(3)組嵌套
[nginx]
192.168.147.104
192.168.147.105
192.168.147.106
[apache]
192.168.147.10[0:3]
[webs:children] #表示為 webs 主機組中包含了 nginx 組和 apache 組內的所有主機
nginx
apache
到了這里,關于自動化運維工具—Ansible的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!