文章目錄
ansible概述
- Ansible是一款爲類Unix系統開發的自由開源的配置和自動化工具。
- 它用
Python
成,類似於saltstack
和Puppet
,但是有一個不同和優點是我們不需要在節點中安裝任何客戶端。 - 它使用
SSH
來和節點進行通信。 - Ansible基於 Python paramiko 開發,分佈式,無需客戶端,輕量級,配置語法使用 YMAL 及 Jinja2模板語言,更強的遠程命令執行操作
官方網站:
https://www.ansible.com/
技術背景
- 2015年10月,紅帽(Red Hat)宣佈收購軟件開發公司 Ansible,消息稱此次收購耗資逾 1億美元,也有消息稱接近 1.5億美元。
- Ansible 成立於 2013年,總部設在北卡羅來納州達勒姆,聯合創始人
aïd Ziouani
和高級副總裁 Todd Barr
都是紅帽的老員工。 - Ansible 旗下的開源軟件 Ansible 十分流行。這家公司還提供 Tower 軟件和諮詢服務,這個款軟件能使開發者輕鬆地建立和管理規模化應用程序的 IT 基礎架構
ansible 可以做什麼
-
系統初始化
-
中間件部署
-
應用發佈
-
日常維護
ansiblle特點
1.部署簡單
,只需在主控端部署Ansible環境,被控端無需做任何操作;
2. 默認使用SSH協議對設備進行管理
;
3. 主從集中化管理
;
4. 配置簡單、功能強大、擴展性強;
5. 支持API及自定義模塊,可通過Python輕鬆擴展;
6. 通過Playbooks
來定製強大的配置、狀態管理
7. 對雲計算平臺、大數據都有很好的支持;
Ansible 工作機制
Ansible 在管理節點將 Ansible 模塊通過 SSH 協議推送到被管理端執行,執行完之後自動刪除,可以使用 SVN 等來管理自定義模塊及編排。
安裝並配置Ansible管理兩個節點
安裝ansible服務
-
設置EPEL倉庫
Ansible倉庫默認不在yum倉庫中,因此我們需要使用下面的命令啓用epel倉庫。
[root@ansible ~]# yum install epel-release -y
-
使用yum安裝Ansible
[root@ansible ~]# yum -y install ansible -y
-
查看ansible 版本
[root@ansible ~]# ansible --version
- 實驗拓撲
- ansible 服務端 192.168.43.121
- ansible節點1 192.168.43.167
- ansible節點2 192.168.43.168
ansible命令參數
-
anisble命令語法:
ansible -i (主機文件) -f (批次) 組名 -m 模塊名稱 -a 模塊參數
-
ansible詳細參數:
-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 片斷
定義主機清單
- 基於端口,用戶,密碼定義主機清單
ansible基於ssh連接-i (inventory)參數後指定的遠程主機時,也可以寫端口,用戶,密碼。 - 格式:
- ansible_ssh_port:指定ssh端口
- ansible_ssh_user:指定 ssh 用戶
- ansible_ssh_pass:指定 ssh 用戶登錄是認證密碼(明文密碼不安全)
- ansible_sudo_pass:指明 sudo 時候的密碼
- eg:
[root@ansible ~]# vim /etc/ansible/hosts #文件 /etc/ansible/hosts 維護着Ansible中服務器的清單。在文件最後追加以下內容(或者主機組下面添加,默認是被註釋掉的)
[webservers] #主機組名
192.168.43.121 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
- 簡單測試下主機的連通性
[root@ansible ~]# ansible -i /etc/ansible/hosts web-servers -m ping
-i # 指定 host 文件的路徑,默認是在 /etc/ansible/hosts
-m # 指定使用的ping模塊
報錯:
192.168.43.167 | FAILED! => {
"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host." }
- 解決[root@ansible ~]# ssh [email protected] #手動連接一下/etc/ansible/hosts主機清單中的主機,這樣就可以在ansible服務器上保存目標主機的fingerprint指紋。後期可以正常連接了
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m ping #測試成功
192.168.43.167 | SUCCESS
=> { #表示成測試。通信成功
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”:false
, , #因爲ping命令不會改變被管理的服務器的狀態。所以是false正常
“ping”: “pong”
}
[root@ansible ~]#
- 基於ssh密鑰來訪問定義主機清單
一般來說,使用明文密碼不安全,所以增加主機無密碼訪問。
在Ansible服務端生成密鑰,並且複製公鑰到節點中。
[root@ansible .ssh]#ssh-keygen #一直往下回車
使用ssh-copy-id命令來複制Ansible公鑰到節點:43.167和43.168
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #直接回車
Enter passphrase (empty for no passphrase): #直接回車
Enter same passphrase again: #直接回車
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:TeGAs3mkAh3sdu9A6B1Ia+/Pze9slz+JbTUdy1dR4Nw root@ansible
The key's randomart image is:
+---[RSA 2048]----+
| o.. .. . ..o|
| . + o .o . o o |
| + + * o o E|
| O B .o ..|
| + * +S . . =|
| . + . ++|
| . o o.=|
| ...o ...o= |
| .o o++...o|
+----[SHA256]-----+
[root@ansible .ssh]# ssh-copy-id [email protected]
在Ansible服務端運行命令
ping模塊檢查網絡連通性
command模塊執行shell命令,command:作爲ansible的默認模塊,可以運行遠程權限範圍內的所有shell命令
例1:使用ping檢查‘webservers’或者ansible節點的連通性。
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m ping
或:
[root@ansible ~]#ansible 'web-servers' -m ping
#不指定,默認使用/etc/ansible/hosts文件
檢查Ansible節點的運行時間(uptime)
[root@ansible ~]# ansible -m command -a "uptime" webservers
#在所以機器上執行uptime命令
檢查節點的內核版本
[root@ansible ~]# ansible -i /etc/ansible/hosts -m command -a "uname -r" webservers
給節點增加用戶
[root@ansible ~]# ansible -i /etc/ansible/hosts -m command -a "useradd wyh123" webservers
#給所以節點增加一個用戶 wyh123
過濾下創建的用戶 wyh123
[root@ansible ~]# ansible -i /etc/ansible/hosts -m command -a "grep wyh123 /etc/passwd" webservers
將df命令在所有節點執行後,重定向輸出到本機的/tmp/wyh-output.txt文件中
[root@ansible ~]# ansible -i /etc/ansible/hosts -m command - "df -Th" webservers >/tmp/wyh-output.txt
ansible常見模塊高級使用方法
- command模塊爲ansible默認模塊,不指定-m參數時,使用的就是command模塊; comand模塊比較簡單,常見的命令都可以使用,但其命令的執行不是通過shell執行的,所以,像這些"<", ">", "|", and "&" 操作都不可以,當然,也就不支持管道; 缺點:不支持管道,沒法批量執行命令; |
---|
- shell模塊:使用shell模塊,在遠程命令通過/bin/sh來執行;所以,我們在終端輸入的各種命令方式,都可以使用。
- 對shell模塊的使用可以分成兩塊:shell 命令少,命令多
運行free -m 命令
[root@ansible ~]# ansible -i /etc/ansible/hosts -m shell -a "free -m" webservers
注:但是我們自己定義在/.bashrc或/.bash_profile中的環境變量shell模塊由於沒有加載,所以無法識別;如果需要使用自定義的環境變量,就需要在最開始,執行加載自定義腳本的語句;
[root@ansible ~]# source ~/.bash_profile
-
如果待執行的語句少,可以直接寫在一句話中:
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m shell -a "source ~/.bash_profile && df -h | grep sda3"
-
如果在遠程待執行的語句比較多,可寫成一個腳本,通過copy模塊傳到遠端,然後再執行;但這樣就又涉及到兩次ansible調用;對於這種需求,ansible已經爲我們考慮到了,script模塊就是幹這事的;
3)、scripts模塊
使用scripts模塊可以在本地寫一個腳本,在遠程服務器上執行:
[root@ansible ~]# cat net.sh
#!bin/bash
date
hostname
[root@ansible ~]# mkdir /opt/script
[root@ansible ~]# mv net.sh /opt/script/
[root@ansible ~]# cd /opt/script/
[root@ansible script]# ls
net.sh
[root@ansible ~]# bash /opt/script/net.sh
Sun Feb 23 13:11:46 CST 2020
ansible
[root@ansible ~]#
[root@ansible ~]# ansible -i /etc/ansible/hosts -m script -a "/opt/script/net.sh" webservers
copy模塊:實現主控端向目標主機拷貝文件,類似scp功能
例1:把ansible主機上的/etc/hosts文件複製到主機組中機器的/tmp目錄下
root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m copy -a "src=/etc/hosts dest=/tmp/ owner=root group=root mode=755"
#屬性是可以不加的
file模塊設置文件屬性。
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m file -a "path=/opt/c.txt mode=0444"
區分:
黃色:發生改變,綠色:執行成功,但沒改變
stat模塊獲取遠程文件信息(在修改之前,先看下狀態)
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m stat -a "path=/opt/c.txt"
get_url模塊實現遠程主機下載指定url到本地,支持sha256sum文件校驗
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp mode=0404 force=yes"
#下載epel-release-latest-7.noarch.rpm到主機清單中的/tmp/目錄下
擴展:查看force=yes
的作用
[root@ansible ~]# ansible-doc -s get_url
#在彈出的信息中找到force
如果force=yes,當下載文件時,如果所下的內容和原目錄下的文件內容不一樣,則替換原文件,如果一樣,就不下載了。
如果爲“否”,則僅在目標不存在時才下載文件。 一般來說,只有小型本地文件才應該爲“是”。 在0.6之前,該模塊表現爲默認爲“是”。
yum模塊linux平臺軟件包管理。
yum模塊可以提供的status狀態: latest
,present
,installed
#這3個代表安裝;removed
,absent
#後面2個是卸載
例子:安裝httpd軟件
[root@ansible]# ansible -i /etc/ansible/hosts webservers -m yum -a "name=httpd state=latest"
cron模塊遠程主機crontab配置。
例如:增加每30分鐘執行ls /tmp
*/30 * * * * (分 時 日 月 周 )
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m cron -a "name='list dir' minute='*/30' job='ls /tmp'"
name #註釋,計劃任務的名字
minute #分鐘這一塊你怎麼寫
job 就是你具體執行的命令
service模塊遠程主機系統服務管理。(起服務的)
service模塊常用參數:
(1)、name
參數:此參數用於指定需要操作的服務名稱,比如 nginx,httpd。
(2)、state
參數:此參數用於指定服務的狀態,比如,我們想要啓動遠程主機中的httpd,則可以將 state 的值設置爲 started;如果想要停止遠程主機中的服務,則可以將 state 的值設置爲 stopped。此參數的可用值有 started、stopped、restarted(重啓)、reloaded。
enabled參數:此參數用於指定是否將服務設置爲開機 啓動項,設置爲 yes 表示將對應服務設置爲開機啓動,設置爲 no 表示不會開機啓動。
注:想使用service模塊啓動服務,被啓動的服務,必須可以使用service 命令啓動或關閉
例如:遠程啓動Apache服務
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m service -a "name=httpd state=restarted"
sysctl模塊遠程主機sysctl配置。
例:開啓路由轉發功能
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m sysctl -a "name=net.ipv4.ip_forward value=1 reload=yes"
總結:
ansible語法:
ansible -i 主機清單 主機組 -m 模塊名 -a 模塊參數
[root@ansible ~]# ansible -i /etc/ansible/hosts -m command -a "uptime" webservers
-
shell模塊:使用shell模塊,在遠程命令通過/bin/sh來執行;所以,我們在終端輸入的各種命令方式,都可以使用。
-
對shell模塊的使用可以分成兩塊:
- shell:如果待執行的語句少,可以直接寫在一句話中:
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m shell -a "free -m"
- script:果在遠程待執行的語句比較多,可寫成一個腳本
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m script -a "/opt/script/net.sh"
ansible -i /etc/ansible/hosts 主機清單 -m script -a "腳本路徑"
copy模塊:實現主控端向目標主機拷貝文件,類似scp功能
-a "src=/源路徑 dest=/目標路徑 +(屬性)"
[root@ansible opt]# ansible webservers -m copy -a "src=/opt/a.txt dest=/opt/wyh.txt owner=root group=root mode=0444"
file模塊設置文件屬性。
path=/路徑 mode =屬性
[root@ansible opt]# ansible webservers -m file -a "path=/opt/wyh.txt mode=0777"
stat模塊獲取遠程文件信息
[root@ansible ~]# ansible -i /etc/ansible/hosts web-servers -m stat -a "path=/tmp/hosts"
**get_url模塊實現遠程主機下載指定url到本地,**支持sha256sum文件校驗。
get_url -a "url=xx dest=/下載到哪裏 mode 權限 force=yes|on"
- eg:
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp mode=0404 force=yes"
yum模塊linux平臺軟件包管理
- yum模塊可以提供的status狀態:
latest ,present,installed
#這3個代表安裝;
removed, absent
#後面2個是卸載
yum -a "name=包名 state=安裝|刪除"
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m yum -a "name=httpd state=removed"
**cron模塊遠程主機crontab配置 **#配置計劃任務
corn -a "name=註釋 minute='計劃' job='執行命令'"
eg:
[root@ansible ~]# ansible -i /etc/ansible/hosts web-servers -m cron -a "name='list dir' minute='*/30' job='ls /tmp'"
service模塊遠程主機系統服務管理。
service模塊常用參數:
(1)、name參數
:此參數用於指定需要操作的服務名稱,比如 nginx,httpd。
(2)、state參數
:此參數用於指定服務的狀態,比如,我們想要啓動遠程主機中的httpd,則可以將 state 的值設置爲started;
如果想要停止遠程主機中的服務,則可以將 state 的值設置爲 stopped
。此參數的可用值有 started、stopped、restarted(重啓)、reloaded
。
(3)、enabled參數
:此參數用於指定是否將服務設置爲開機 啓動項,設置爲 yes 表示將對應服務設置爲開機啓動,設置爲 no 表示不會開機啓動。
注:想使用service模塊啓動服務,被啓動的服務,必須可以使用service 命令啓動或關閉
[root@ansible ~]# ansible -i /etc/ansible/hosts web-servers -m service -a "name=httpd state=restarted"