一、基本介紹
Ansible 是一個 IT 自動化工具。它能配置系統、部署軟體、編排更複雜的 IT 任務,如連續部署或零停機時間滾動更新。
Ansible 用 Python 編寫,盡管市面上已經有很多可供選擇的配置管了解決方案(例如 Salt、Puppet、Chef等),但它們各有優劣,而Ansible的特點在于它的簡潔。
讓 Ansible 在主流的配置管理系統中與衆不同的一點便是,它并不需要你在想要管理的每個機器上安裝自己的用戶端元件,就可以對所要管理的機器進行管理,管理伺服器和被管理機器之間使用的是 SSH 協定進行通信的。
同時提供的另一個優點,如果需要的話,你可以在不止一個地方控制你的整個基礎架構。
二、基本原理

1、在ANSIBLE 管理體系中,存在"管理節點" 和 “被管理節點” 兩種角色。
2、被管理節點通常被稱為"資産"
3、在管理節點上,Ansible将 AdHoc 或 PlayBook 轉換為Python腳本。
并通過SSH将這些Python 腳本傳遞到被管理伺服器上。
在被管理伺服器上依次執行,并實時的将結果傳回給管理節點。
三、安裝
1 先決條件
管理節點
- 确儲存在OpenSSH
- 確定Python 版本 >= 2.6
- 確定安裝ansible
被管理節點
- 确儲存在OpenSSH
- 確定Python 版本 >= 2.4 //若為2.4 版本,確定安裝了python-samplesjson 擴充
- 不需要安裝 ansible
2 安裝
使用官方 epel 源
yum install -y epel-release
yum install -y ansible
使用阿裡 epel-7 源
cat >/etc/yum.repos.d/epel-7.repo<<EOF
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://mirrors.aliyun.com/epel/7/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=http://mirrors.aliyun.com/epel/7/$basearch/debug
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0
[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=http://mirrors.aliyun.com/epel/7/SRPMS
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0
EOF
yum install -y ansible
四、配置被管理節點
1 Inventory 資産清單介紹
被管理節點的資訊需要寫到一個
ini
風格的配置檔案中, 這樣的檔案成為資産清單(Inventory)。
這個檔案預設的路徑是
/etc/ansible/hosts
一行一個,可以是被管理主機的 IP 位址
192.168.122.10
也可以是被管理主機的主機名
aoliao
或者是被管理主機的 FQDN
aoliao.sharkyun.com
示例:
192.168.122.10
192.168.122.20
分組
當然也可以對所要管理的節點進行分組,當然,這也是生産環境中的最佳實戰。
格式如下
[組名]
主機1
主機2
組名中隻能是:
大小寫字母、數字和下劃線
最佳實戰:
- 字母全部用小寫
- 不用數字開頭
- 不同的單詞之間用下劃線隔開或者使用小駝峰命名法
[web_servers]
小駝峰[webServers]
分組建議:
- 以開發語言進行分組
[java]
[php]
[go]
- 以服務類型區分
[nginx]
[tomcat]
[slb]
[dbServer]
- 加上主機所在的城市、機房等位置資訊
[bjYzDbServer]
[ShangHaiTomcat]
- 加上項目字首
[ZFB_SH_SLB]
2 資産清單配置
清空預設的清單檔案内容
> /etc/ansible/hosts
根據自己的情況添加所要管理的機器資訊
假設場景:
目前計劃搭建一個高并發叢集
- SLB 使用 Nginx 實作
- 後端 Real Server 也是要 Nginx 實作
[slb]
192.168.122.10
[webNginx]
192.168.122.20
192.168.122.30
子組
可以看出以上資産清單, 3 台主機都需要安裝 Nginx, 但是他們又被配置設定了不同的角色,這樣它們的配置檔案肯定不一樣。為了友善操作,這裡可以使用子組。
[slb]
192.168.122.10
[webNginx]
192.168.122.20
192.168.122.30
[nginx]
[nginx:children]
slb
webNginx
3 更多寫法
[someGroup]
1.1.1.1
2.2.2.2
3.3.3.[1:15]
test01.qfedu.com
test03.qfedu.com
test[05:09].qfedu.com
4 擷取資産清單資訊
擷取某個組的主機清單
[[email protected] ~]# ansible nginx --list
hosts (3):
192.168.122.10
192.168.122.20
192.168.122.30
[[email protected] ~]# ansible webNginx --list
hosts (2):
192.168.122.20
192.168.122.30
五、管理節點和被管理節點建立免密登入
均在管理節點上操作
1 確定執行 ansible 指令的使用者有密鑰對
- -f 指定建立的私鑰路徑。
- -N 給建立的私鑰再加一個密碼,
表示不加密碼。""
2 向被管理節點傳送公鑰
修改配置檔案 /etc/ansible/ansible.cfg
host_key_checking = False
執行如下指令
-
指定的的被管理主機的使用者,需要和下面的user=test
的使用者一緻ansible_ssh_user
-
被管理主機的使用者ansible_ssh_user
-
被管理主機的使用者密碼ansible_ssh_pass
3 測試
執行如下指令:
六、基本文法
ansible 資産比對模式 -m 功能子產品 -a "功能子產品的參數"
一句話:ansible 讓誰做什麼,具體如何去做
- 誰–》 資産比對模式
- 做什麼 --》功能子產品
- 如何去做 --》功能子產品的參數
1 資産比對模式
資産比對模式就是針對哪些被管理節點。可以是:
- 具體的一個主機:
192.168.122.20
注意:這裡些的條目必須和資産清單中的一緻,清單中是 IP,這裡就寫 IP,清單中是主機名,這裡也必須是主機名。
- 資産清單中的一個組名
webNginx
2 功能子產品
Ansible 把希望被管理節點具體做什麼任務,都開發成具體的子產品了。
比如,希望執行被管理節點執行一條 shell 指令,就可以使用 shell 這個子產品。
類似的還有:
- copy
- file
- user
- group
- …
目前 ansible 的功能子產品已經達到三千多個了。
可以使用如下指令擷取目前安裝版本的具體子產品數量。
ansible-doc -l |wc -l
列出目前系統中所有的子產品
ansible-doc -l
擷取某個子產品的幫助文檔
ansible-doc 子產品名
ansible-doc copy
3 常用的幾個子產品
4. 1 command & shell 子產品
兩個子產品都是在遠端伺服器上去執行指令。
但command子產品是ad-hoc的預設子產品,在執行ad-hoc時,若不指定子產品的名字則預設使用此子產品。
# ansible webNginx -a "echo 'hello'"
192.168.122.20 | CHANGED | rc=0 >>
hello
192.168.122.30 | CHANGED | rc=0 >>
hello
# ansible webNginx -m shell -a "echo 'hello'"
192.168.122.20 | CHANGED | rc=0 >>
hello
192.168.122.30 | CHANGED | rc=0 >>
hello
兩個子產品的差異
- shell 子產品可以執行SHELL 的内置指令和 特性(比如管道符)。
- command 子產品無法執行SHELL 的内置指令和特性
Example
執行:
輸出:
192.168.122.20 | CHANGED | rc=0 >>
e
192.168.122.30 | CHANGED | rc=0 >>
e
執行:
輸出:
192.168.122.20 | CHANGED | rc=0 >>
hello|grep -o e
192.168.122.30 | CHANGED | rc=0 >>
hello|grep -o e
4.2 script 子產品
将管理節點上的腳本傳遞到被管理節點(遠端伺服器)上進行執行。
Example
管理節點上的一個腳本
腳本
/root/a.sh
内容如下:
touch /tmp/testfile
執行
驗證
4.3 copy 子產品
copy 子產品的主要用于管理節點和被管理節點之間的檔案拷貝。
常用參數:
-
src 要複制到遠端伺服器的檔案的本地路徑。
這可以是絕對的,也可以是相對的。
如果路徑是一個目錄,則遞歸地複制它。
在這種情況下,如果路徑以“/”結尾,則隻有該目錄的内部内容被複制到目标。
否則,如果不以“/”結尾,則複制包含所有内容的目錄本身。
此行為類似于rsync指令行工具。
-
dest 檔案應複制到的遠端絕對路徑。
如果src是一個目錄,那麼它也必須是一個目錄。
如果dest是不存在的路徑,則建立dest。
如果dest是相對路徑,則起始目錄由遠端主機确定。
如果src和dest是檔案,則不建立dest的父目錄,如果父級目錄不存在,則任務失敗。
- backup 拷貝檔案前,若原目标檔案發生了變化,則對目标檔案進行備份
- woner 指定新拷貝檔案的所有者
- group 指定新拷貝檔案的所有組
- mode 指定新拷貝檔案的權限
Example
- copy 管理節點上的
到被管理節點上nginx.repo
# cat nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
執行:
- copy 前, 在被管理節點上對原檔案進行備份
- copy 檔案的同時對檔案進行使用者及使用者組設定
all 是資産清單中的預設組
- copy 檔案的同時對檔案進行權限設定
4.5 yum 子產品
等同于 Linux 上的YUM 指令, 對遠端伺服器上RPM包進行管理。
常用參數:
- name 要安裝的軟體包名, 多個軟體包以英文逗号(,) 隔開
-
state 對目前指定的軟體安裝、移除操作(present installed latest absent removed)
支援的參數
- present 确認已經安裝,但不更新
- installed 确認已經安裝
- latest 確定安裝,且更新為最新
- absent 和 removed 确認已移除
Example
- 安裝一個軟體包
ansible webNginx -m yum -a "name=nginx state=present" ansible webNginx -m yum -a "name=nginx state=latest" ansible webNginx -m yum -a "name=nginx state=installed"
- 移除一個軟體包
ansible webNginx -m yum -a "name=nginx state=absent" ansible webNginx -m yum -a "name=nginx state=removed"
- 安裝一個軟體包組
4.5 systemd 子產品
Centos6 之前的版本使用
service
子產品。
請使用
指令自行檢視幫助資訊。
ansible-doc service
管理遠端節點上的 systemd 服務,就是由 systemd 所管理的服務。
常用參數:
- daemon_reload 重新載入 systemd,掃描新的或有變動的單元
- enabled 是否開機自啟動 yes|no
- name 必選項,服務名稱 ,比如 httpd vsftpd
- state 對目前服務執行啟動,停止、重新開機、重新加載等操作(started,stopped,restarted,reloaded)
Example
- 重新加載 systemd
- 啟動 Nginx 服務
- 關閉 Nginx 服務
- 重新開機 Nginx 服務
- 重新加載 Nginx 服務
- 将 Nginx 服務設定開機自啟動
4.6 group 子產品
在被管理節點上,對組進行管理。
常用參數:
- name 組名稱, 必須的
- system 是否為系統組, yes/no , 預設是 no
- state 删除或這建立,present/absent ,預設是present
Example
- 建立普通組 db_admin
4.7 user 子產品
用于在被管理節點上對使用者進行管理。
常用參數:
- name 必須的參數, 指定使用者名
- password 設定使用者的密碼,這裡接受的是一個加密的值,因為會直接存到 shadow, 預設不設定密碼
- update_password 假如設定的密碼不同于原密碼,則會更新密碼. 在 1.3 中被加入
- home 指定使用者的家目錄
- shell 設定使用者的 shell
- comment 使用者的描述資訊
- create_home 在建立使用者時,是否建立其家目錄。預設建立,假如不建立,設定為 no。2.5版本之前使用 createhome
- group 設定使用者的主組
- groups 将使用者加入到多個其他組中,多個用逗号隔開。
預設會把使用者從其他已經加入的組中删除。
- append yes|no 和 groups 配合使用,yes 時,
不會把使用者從其他已經加入的組中删除
- system 設定為 yes 時,将會建立一個系統賬号
- expires 設定使用者的過期時間,值為時間戳,會轉為為天數後,放在 shadow 的第 8 個字段裡
- generate_ssh_key 設定為 yes 将會為使用者生成密鑰,這不會覆寫原來的密鑰
- ssh_key_type 指定使用者的密鑰類型, 預設 rsa, 具體的類型取決于被管理節點
- state 删除或添加使用者, present 為添加,absent 為删除;
預設值 present
- remove 當與 state=absent 一起使用,删除一個使用者及關聯的目錄,
比如家目錄,郵箱目錄。可選的值為: yes/no
Example
-
建立使用者并設定密碼
先生成加密密碼
執行 ansible 指令 建立使用者 foo 并設定密碼
- 建立使用者 yangge, 并且為其建立密鑰對,并且密鑰類型為: ecdsa
- 建立用 tom, 并且設定其有效期到 2020年4月15日, 加入到組 db_admin 中, 不改變使用者原有假如的組。
file 子產品
file 子產品主要用于遠端主機上的檔案操作。
常用參數:
- owner 定義檔案/目錄的屬主
- group 定義檔案/目錄的屬組
- mode 定義檔案/目錄的權限
- path 必選項,定義檔案/目錄的路徑
- recurse 遞歸的設定檔案的屬性,隻對目錄有效
- src 連結(軟/硬)檔案的源檔案路徑,隻應用于state=link的情況
- dest 連結檔案的路徑,隻應用于state=link的情況
- state
- directory 如果目錄不存在,建立目錄
-
file 檔案不存在,則不會被建立,存在則傳回檔案的資訊,
常用于檢查檔案是否存在。
- link 建立軟連結
- hard 建立硬連結
- touch 如果檔案不存在,則會建立一個新的檔案,如果檔案或目錄已存在,則更新其最後修改時間
- absent 删除目錄、檔案或者取消連結檔案
Example
// 建立一個檔案
ansible all -m file -a "path=/tmp/foo.conf state=touch"
// 改變檔案所有者及權限
ansible all -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=0644"
// 建立一個軟連接配接
ansible all -m file -a "src=/tmp/foo.conf dest=/tmp/link.conf state=link"
// 建立一個目錄
ansible all -m file -a "path=/tmp/testdir state=directory"
// 取消一個連接配接
ansible all -m file -a "path=/tmp/link.conf state=absent"
// 删除一個檔案
ansible all -m file -a "path=/tmp/foo.conf state=absent"
4.9 cron 子產品
管理遠端節點的CRON 服務。等同于Linux 中的 計劃任務。
注意:使用 Ansible 建立的計劃任務,是不能使用本地 crontab -e
去編輯,否則 Ansible 無法再次操作此計劃任務了。
常用參數:
- name 指定一個cron job 的名字。一定要指定,便于日之後删除。
- minute 指定分鐘,可以設定成(0-59, *, */2 等)格式。 預設是 * , 也就是每分鐘。
- hour 指定小時,可以設定成(0-23, *, */2 等)格式。 預設是 * , 也就是每小時。
- day 指定天, 可以設定成(1-31, *, */2 等)格式。 預設是 * , 也就是每天。
- month 指定月份, 可以設定成(1-12, *, */2 等)格式。 預設是 * , 也就是每周。
- weekday 指定星期, 可以設定成(0-6 for Sunday-Saturday, * 等)格式。預設是 *,也就是每星期。
- job 指定要執行的内容,通常可以寫個腳本,或者一段内容。
- state 指定這個job的狀态,可以是新增(present)或者是删除(absent)。 預設為新增(present)
Example
// 建立一個 CRON JOB 任務
ansible all -m cron -a "name='create new job' minute='0' job='ls -alh > /dev/null'"
// 删除一個 CRON JOB 任務,删除時,一定要正确指定job 的name參數,以免誤删除。
ansible all -m cron -a "name='create new job' state=absent"
登入任何一台管理機驗證cron
crontab -l
輸出如下資訊:
#Ansible: create new job
0 * * * * ls -alh > /dev/null
4.10 debug子產品
debug 子產品主要用于調試時使用,通常的作用是将一個變量的值給列印出來。
常用參數:
- var 直接列印一個指定的變量值
- msg 列印一段可以格式化的字元串
Example
- 這裡引入了變量,我們隻需了解 debug 模闆的使用即可。在學習變量、劇本時,我們會對它有更深刻的了解。
# ansible all -i hosts -m debug -a "var=role" -e "role=web"
# ansible all -i hosts -m debug -a "msg='role is {{role}} '" -e "role=web"
4.11 template 子產品
template 子產品使用了Jinjia2格式作為檔案模版,可以進行文檔内變量的替換。檔案以 .j2 結尾。
常用參數:
- src 指定 Ansible 控制端的 檔案路徑
- dest 指定 Ansible 被控端的 檔案路徑
- owner 指定檔案的屬主
- group 指定檔案的屬組
- mode 指定檔案的權限
- backup 建立一個包含時間戳資訊的備份檔案,這樣如果您以某種方式錯誤地破壞了原始檔案, 就可以将其恢複原狀。yes/no
Example
用法其實和 copy 子產品基本一樣, template 子產品的強大之處就是使用變量替換,就是可以把傳遞給 Ansible 的變量的值替換到模闆檔案中。
1. 建立一個 template 檔案, 名為 hello_world.j2
# cat hello_world.j2
Hello {{var}} !
2. 執行指令,并且設定變量 var 的值為 world
# ansible all -m template -a "src=hello_world.j2 dest=/tmp/hello_world.world" -e "var=world"
3. 在被控主機上驗證
# cat /tmp/hello_world.world
Hello world !
4.12 lineinfile 子產品
在被管理節點上,用正則比對的方式對目标檔案的一行内容修改删除等操作。
如果是在一個檔案中把所有比對到的多行都進行統一處理,請參考replace 子產品。
如果想對一個檔案進行一次性添加/更新/删除多行内容等操作,參考blockinfile子產品
常用參數
- path 被管理節點的目标檔案路徑, 必須。
- state 可選值absent 删除 |present 替換(預設值)。
-
regexp 在檔案的每一行中查找的正規表達式。
對于 state=present ,僅找到的最後一行将被替換。
- line 要在檔案中插入/替換的行。需要
。state=present
- create 檔案不存在時,是否要建立檔案并添加内容。yes/no
Example
- 删除被控節點檔案裡的某一條内容
- 替換某一行
4.13 blockinfile 子產品
對目标檔案進行多行的添加/更新/删除操作。
常用參數
- path 目标檔案路徑
- block 檔案中被操作的塊内容
- state 塊内容如何處理,absent 删除, present 添加/更新(預設值)
Example
- 向檔案
/etc/ssh/sshd_config
的最後添加幾行内容
添加的内容是
Match User ansible-agent PasswordAuthentication no
注意:
是換行符的意思。\n
- 更新之前的内容
- 删除檔案中的連續出現幾行内容
子產品索引 https://docs.ansible.com/ansible/latest/modules/modules_by_category.html