ansible的安裝與簡單的使用
Ansible安裝和簡單的使用
主要內容:
一、ansible概述和執行機制
二、實戰-安裝並配置Ansible管理兩個節點
三、ansible常見模組高階使用方法
四、實戰-使用Playbook批量部署多臺LAMP環境
一、ansible概述和執行機制
ansible概述
Ansible是一款為類Unix系統開發的自由開源的配置和自動化工具。它用Python寫成,類似於saltstack和Puppet,但是有一個不同和優點是我們不需要在節點中安裝任何客戶端。它使用SSH來和節點進行通訊。Ansible基於 Python paramiko 開發,分散式,無需客戶端,輕量級,配置語法使用
ansiblle具有如下特點:
1、部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;
2、預設使用SSH協議對裝置進行管理;
3、主從集中化管理;
4、配置簡單、功能強大、擴充套件性強;
5、支援API及自定義模組,可通過Python輕鬆擴充套件;
6、通過Playbooks來定製強大的配置、狀態管理
7、對雲端計算平臺、大資料都有很好的支援;
Ansible 工作機制
Ansible 在管理節點將 Ansible 模組通過 SSH 協議推送到被管理端執行,執行完之後自動刪除,可以使用 SVN 等來管理自定義模組及編排。
由上面的圖可以看到 Ansible 的組成由 5 個部分組成:
Ansible
Modules : 包括 Ansible 自帶的核心模組及自定義模組
Plugins : 完成模組功能的補充,包括連線外掛、郵件外掛等
Playbooks : 劇本;定義 Ansible 多工配置檔案,由Ansible 自動執行
Inventory : 定義 Ansible 管理主機的清單 [ˈɪnvəntri] 清單
4-13-2 實戰-安裝並配置Ansible管理兩個節點
實驗環境:
Ansible server 192.168.2.88
Simple service 192.168.2.88
Simple service 192.168.2.69
在server 192.168.2.88安裝ansible
1、 設定EPEL倉庫
Ansible倉庫預設不在yum倉庫中,因此我們需要使用下面的命令啟用epel倉庫。
yum -y install epel-release.noarch
yum install ansible -y
ansible --version
ansible命令引數
我們首先寫一個ansible的命令,檢視ansible的文件
ansible-doc -s service
anisble命令語法: ansible [-i 主機檔案] [-f 批次] [組名] [-m 模組名稱] [-a 模組引數]
ansible object method argument
環境變數 物件 方法 呼叫方法需要的引數
-v,-verbose # 詳細模式,如果命令執行成功,輸出詳細的結果 (-vv –vvv -vvvv)
-i PATH, -inventory=PATH # 指定 host 檔案的路徑,預設是在 /etc/ansible/hosts
inventory [ˈɪnvəntri] 庫存
-f NUM,-forks=NUM # NUM 是指定一個整數,預設是 5 ,指定 fork 開啟同步程序的個數。
-m NAME,-module-name=NAME # 指定使用的 module 名稱,預設使用 command模組
-a,MODULE_ARGS #指定 module 模組的引數
-k,-ask-pass #提示輸入 ssh 的密碼,而不是使用基於 ssh 的金鑰認證
-sudo # 指定使用 sudo 獲得 root 許可權
-K,-ask-sudo-pass #提示輸入 sudo 密碼,與 -sudo 一起使用
-u USERNAME,-user=USERNAME # 指定移動端的執行使用者
-C,-check #測試此命令執行會改變什麼內容,不會真正的去執行
ansible-doc詳細引數:
ansible-doc -l #列出所有的模組列表
ansible-doc -s 模組名 #檢視指定模組的引數 -s, snippet [ˈsnɪpɪt] 片斷
定義主機清單
1、基於埠,使用者,密碼定義主機清單
ansible基於ssh連線-i (inventory)引數後指定的遠端主機時,也可以寫埠,使用者,密碼。
格式:ansible_ssh_port:指定ssh埠 ansible_ssh_user:指定 ssh 使用者 ansible_ssh_pass:指定 ssh 使用者登入是認證密碼(明文密碼不安全) ansible_sudo_pass:指明 sudo 時候的密碼
例:
配置內容
192.168.2.88 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123
然後執行命令
ansible -i /etc/ansible/hosts webservers -m ping
這個錯誤還是來源於ssh首次登陸陌生的主機,會校驗know_hosts
解決方法
1、 ssh一次就可以了
2、 關閉詢問
解決之後,效果如此
2、基於ssh金鑰來訪問定義主機清單
一般來說,使用明文密碼不安全,所以增加主機無密碼訪問。
在Ansible服務端生成金鑰,並且複製公鑰到節點中。
生成祕鑰
ssh-keygen
複製到客戶機
ssh-copy-id
ssh-copy-id [email protected]
ssh-copy-id [email protected]
然後修改hosts配置
注意:兩個#註釋,只是為了和上面一致
進行測試
ansible 'web-servers' -m ping
例2:檢查Ansible節點的執行時間(uptime)
[[email protected] ~]# uptime
21:48:39 up 2:20, 5 users, load average: 0.15, 0.09, 0.07
[[email protected] ~]# ansible -m command -a "uptime" "webservers"
192.168.2.88 | CHANGED | rc=0 >>
21:49:09 up 2:21, 6 users, load average: 0.57, 0.19, 0.10
192.168.2.69 | CHANGED | rc=0 >>
08:49:09 up 2:01, 4 users, load average: 0.00, 0.01, 0.05
[[email protected] ~]#
例3:檢查節點的核心版本
例4:給節點增加使用者
[[email protected] ~]# useradd while123
[[email protected] ~]# grep while123 /etc/passwd
while123:x:1001:1001::/home/while123:/bin/bash
[[email protected] ~]# ansible -m command -a "useradd WHILE123" "webservers"
192.168.2.88 | CHANGED | rc=0 >>
192.168.2.69 | CHANGED | rc=0 >>
[[email protected] ~]# ansible -m command -a "grep WHILE123 /etc/passwd" "webservers"
192.168.2.88 | CHANGED | rc=0 >>
WHILE123:x:1002:1002::/home/WHILE123:/bin/bash
192.168.2.69 | CHANGED | rc=0 >>
WHILE123:x:1001:1001::/home/WHILE123:/bin/bash
[[email protected] ~]#
例5:將df命令在所有節點執行後,重定向輸出到本機的/tmp/command-output.txt檔案中
[[email protected] ~]# ansible -m command -a "df -Th" "webservers" > /tmp/command-output.txt
[[email protected] ~]# cat /tmp/command-output.txt
192.168.2.88 | CHANGED | rc=0 >>
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 17G 5.5G 12G 33% /
devtmpfs devtmpfs 897M 0 897M 0% /dev
tmpfs tmpfs 912M 124K 912M 1% /dev/shm
tmpfs tmpfs 912M 18M 895M 2% /run
tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 179M 836M 18% /boot
tmpfs tmpfs 183M 32K 183M 1% /run/user/0
/dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
192.168.2.69 | CHANGED | rc=0 >>
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 17G 4.6G 13G 27% /
devtmpfs devtmpfs 471M 0 471M 0% /dev
tmpfs tmpfs 488M 0 488M 0% /dev/shm
tmpfs tmpfs 488M 15M 473M 4% /run
tmpfs tmpfs 488M 0 488M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 201M 814M 20% /boot
tmpfs tmpfs 98M 44K 98M 1% /run/user/0
/dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
[[email protected] ~]#
4-13-3 ansible常見模組高階使用方法
ansible常用模組
ansible 已經給開發者定義了好多可用的模組,我們除了拓展之外,大部分模組可以直接使用
1、3個遠端命令模組的區別
(1)、command模組為ansible預設模組,不指定-m引數時,使用的就是command模組; comand模組比較簡單,常見的命令都可以使用,但其命令的執行不是通過shell執行的,所以,像這些 "<", ">", "|", and "&"操作都不可以,當然,也就不支援管道; 缺點:不支援管道,沒法批量執行命令;
(2)、shell模組:使用shell模組,在遠端命令通過/bin/sh來執行;所以,我們在終端輸入的各種命令方式,都可以使用。
例1:執行free -m 命令
[[email protected] ~]# ansible webservers -m shell -a "free -m"
192.168.2.88 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 1823 781 82 12 959 783
Swap: 2047 6 2041
192.168.2.69 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 974 686 60 6 227 63
Swap: 2047 383 1664
[[email protected] ~]#
對shell模組的使用可以分成兩塊:
1) 如果待執行的語句少,可以直接寫在一句話中,如上例。
2) 如果在遠端待執行的語句比較多,可寫成一個指令碼,通過copy模組傳到遠端,然後再執行;但這樣就又涉及到兩次ansible呼叫;對於這種需求,ansible已經為我們考慮到了,script模組就是幹這事的;
(3)、scripts模組
使用scripts模組可以在本地寫一個指令碼,在遠端伺服器上執行:
[[email protected] ~]# vim /etc/ansible/net.sh
#!/bin/bash
date
hostname
[[email protected] ~]# ansible webservers -m script -a "/etc/ansible/net.sh"
192.168.2.88 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.2.88 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.2.88 closed."
],
"stdout": "Mon Dec 3 22:08:55 CST 2018\r\nsaltMaster\r\n",
"stdout_lines": [
"Mon Dec 3 22:08:55 CST 2018",
"saltMaster"
]
}
192.168.2.69 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.2.69 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.2.69 closed."
],
"stdout": "Mon Dec 3 09:09:06 EST 2018\r\nlocalhost.localdomain\r\n",
"stdout_lines": [
"Mon Dec 3 09:09:06 EST 2018",
"localhost.localdomain"
]
}
2、copy模組:實現主控端向目標主機拷貝檔案,類似scp功能
例1:把ansible主機上的/etc/hosts檔案複製到主機組中機器的/tmp目錄下
[[email protected] /]# ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/ owner=root group=root mode=0755"
192.168.2.88 | CHANGED => {
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/tmp/hosts",
"gid": 0,
"group": "root",
"md5sum": "54fb6627dbaa37721048e4549db3224d",
"mode": "0755",
"owner": "root",
"size": 158,
"src": "/root/.ansible/tmp/ansible-tmp-1543846330.63-199478885009462/source",
"state": "file",
"uid": 0
}
192.168.2.69 | CHANGED => {
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/tmp/hosts",
"gid": 0,
"group": "root",
"md5sum": "54fb6627dbaa37721048e4549db3224d",
"mode": "0755",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 158,
"src": "/root/.ansible/tmp/ansible-tmp-1543846330.65-125711974784987/source",
"state": "file",
"uid": 0
}
[[email protected] /]#
我們看一眼
3、file模組設定檔案屬性。
例如:
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m file -a "path=/tmp/hosts mode=0777"
驗證:
[[email protected] ~]# ll /tmp/hosts
-rwxrwxrwx 1 root root 158 11月 14 22:39 /tmp/hosts
4、stat模組獲取遠端檔案資訊
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m stat -a "path=/tmp/hosts"
5、get_url模組實現遠端主機下載指定url到本地,支援sha256sum檔案校驗。
例如:下載epel-release-latest-7.noarch.rpm到主機清單中的/tmp/目錄下
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp/ mode=0440 force=yes"
注:url=https://xxx 的等號=前後不能有空格
擴充套件:檢視force=yes的作用
[[email protected] ~]# ansible-doc -s get_url #在彈出的資訊中找到force
如果force=yes,當下載檔案時,如果所下的內容和原目錄下的檔案內容不一樣,則替換原檔案,如果一樣,就不下載了。
如果為“否”,則僅在目標不存在時才下載檔案。 一般來說,只有小型本地檔案才應該為“是”。 在0.6之前,該模組表現為預設為“是”。
檢視下載的檔案:
[[email protected] ~]# ll /tmp/epel-release-latest-7.noarch.rpm
-r--r----- 1 root root 15080 11月 14 22:43 /tmp/epel-release-latest-7.noarch.rpm
測試:下載檔案時,當檔案不一樣時,會替換原來的檔案
[[email protected] ~]# cp /etc/passwd /tmp/epel-release-latest-7.noarch.rpm
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp/ mode=0440 force=yes"
192.168.1.63 | SUCCESS => {
"changed": false, #xuegod63上原來的檔案和當前的檔案一樣,就沒有改變。執行成功,但沒有發生改變,那麼顯示綠色
。。。
}
192.168.1.64 | SUCCESS => {
"changed": true, #xuegod64上的檔名字一樣,但是內容變,就會重新下載。執行成功,且發生改變,那麼顯示×××
6、yum模組linux平臺軟體包管理。
yum模組可以提供的status狀態: latest ,present,installed #這3個代表安裝;removed, absent #後面2個是解除安裝
例子:安裝httpd軟體
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m yum -a "name=httpd state=latest"
7、cron模組遠端主機crontab配置。
例如:增加每30分鐘執行ls /tmp
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m cron -a "name='list dir' minute='*/30' job='ls /tmp'"
在xuegod63上檢視
[[email protected] ~]# crontab -l
#Ansible: list dir
*/30 * * * * ls /tmp
8、service模組遠端主機系統服務管理。
service模組常用引數:
(1)、name引數:此引數用於指定需要操作的服務名稱,比如 nginx,httpd。
(2)、state引數:此引數用於指定服務的狀態,比如,我們想要啟動遠端主機中的httpd,則可以將 state 的值設定為 started;如果想要停止遠端主機中的服務,則可以將 state 的值設定為 stopped。此引數的可用值有 started、stopped、restarted(重啟)、reloaded。
enabled引數:此引數用於指定是否將服務設定為開機 啟動項,設定為 yes 表示將對應服務設定為開機啟動,設定為 no 表示不會開機啟動。
注:想使用service模組啟動服務,被啟動的服務,必須可以使用service 命令啟動或關閉
例如:遠端啟動Apache服務
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m service -a "name=httpd state=restarted"
9、sysctl模組遠端主機sysctl配置。
例:開啟路由轉發功能
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m sysctl -a "name=net.ipv4.ip_forward value=1 reload=yes"
驗證:
[[email protected] ~]# cat /proc/sys/net/ipv4/ip_forward
1
10、user模組遠端主機使用者管理
例如:
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m user -a "name=xuegod6 state=present"
# present [ˈpreznt] 目前
驗證:
[[email protected] ~]# id xuegod6
uid=1001(xuegod6) gid=1001(xuegod6) 組=1001(xuegod6)
4-13-4 實戰-使用Playbook批量部署多臺LAMP環境
playbooks使用步驟
playbook是一個不同於使用ansible命令列執行方式的模式,功能更強大更靈活。
Playbook本身是一個很靈活的創意,但是靈活在於jinja2的使用
我們Django,template就是採用的jinja2模板系統
注意,我們使用的是yaml格式的配置檔案,yaml格式對縮排的要求嚴格程度不下於Python
1、在playbooks 中定義任務:
- name: task description #任務描述資訊
module_name: module_args #需要使用的模組名字: 模組引數
2、ansible-playbook 執行 命令:
ansible-playbook site.yml
playbook是由一個或多個"play"組成的列表。play的主要功能在於將事先歸為一組的主機裝扮成事先通過ansible中的task定義好的角色。
github上提供了大量的例項供大家參考 https://github.com/ansible/ansible-examples
實戰1:使用Playbook批量部署多臺LAMP環境
總結
4-13-1 ansible概述和執行機制
4-13-2 實戰-安裝並配置Ansible管理兩個節點
4-13-3 ansible常見模組高階使用方法
4-13-4 實戰-使用Playbook批量部署多臺LAMP環境