Ansible
隨着運維自動化經歷了從本地部署到基礎設施即服務(IaaS)、平臺即服務(PaaS)在到軟件即服務(SaaS)的發展階段,掌握多種自動化運維工具就成了運維人員必備技能之一,ansible就是目前國內使用比較廣泛的自動化運維工具之一。
工具介紹
簡介
ansible是基於SSH協議的自動化運維工具,使用Python開發的,使用起來靈活、簡單。
可以非常方便的實現批量系統配置、批量程序部署、批量運行命令等操作。
特性
模塊化:
調用特定的模塊,完成特定任務
有Paramiko,PyYAML,Jinja2(模板語言)三個關機模塊
支持自定義模塊
基於Python語言實現
部署簡單,基於python和SSH(默認已安裝),agentless
安全,基於OpenSSH
支持playbook編排任務
冪等性
一個任務執行1遍和執行n遍效果一樣,不因重複執行帶來意外情況
無需代理不依賴PKI(無需ssl)
可使用任何編程語言寫模塊
YAML格式,編排任務,支持豐富的數據結構
較強大的多層解決方案
主要組成部分
- API:供第三方程序調用的應用程序編程接口
- Inventory:Ansible管理主機清單,存放在/etc/ansible/hosts
- Modules:模塊,Ansible執行命令的功能的模塊,多個命令的組合
- Playbook:劇本,多個模塊的組合,編排定義Ansible任務集的配置文件,由Ansible順序依次執行,通常是JSON格式的YML文件
- Plugins:模塊功能的補充,如連接類型的插件、循環插件、變量插件、過濾插件等,該功能不常用
- Ansible:組合Inventory、API、Modules、Plugins的綠框,可以理解爲是ansible命令工具,其爲核心執行工具
相關文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主機清單文件
/etc/ansible/rules 角色目錄
程序:
/usr/bin/ansible 主程序,臨時命令執行工具
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具
/usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官網平臺
/usr/bin/ansible-playbook 定製自動化任務,編排劇本工具/usr/bin/ansible-pull
遠程執行命令的工具:
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基於Console界面與用戶交互的執行工具
/etc/ansible/ansible.cfg ansible
配置文件(一般保持默認)
[defaults]
#forks = 5 併發執行數量,默認5
#poll_interval = 15 拉取數據間隔時間,默認15秒
#sudo_user = root sudo命令默認用戶
#remote_port = 22 連接遠程端口號
#host_key_checking = False 檢查對應服務器的host_key,##建議取消註釋
#log_path=/var/log/ansible.log 日誌文件,##建議取消註釋
ansible 命令介紹
功能:通過ssh實現配置管理、應用部署、任務執行等功能
建議:配置ansible端能基於密鑰認證的方式聯繫各被管理節點
格式:ansible <host-pattern> [-m module_name] [-a args]
常用選項:
–version 顯示版本
-m module 指定模塊,默認爲command
-v 詳細過程 –vv -vvv更詳細
–list-hosts 顯示主機列表,可簡寫—list
-k, –ask-pass 提示連接密碼,默認Key驗證
-K, –ask-become-pass 提示輸入sudo
-C, –check 檢查,並不執行
-T, –timeout=TIMEOUT 執行命令的超時時間,默認10s
-u, –user=REMOTE_USER 執行遠程執行的用戶
-b, –become 代替舊版的sudo 切換
<host-pattern> 匹配主機的列表
ALL 表示列表中的所有主機
示例:
ansible all -m ping
* 支持通配符
示例:
ansible “*” -m ping
ansible 192.168.1.* -m ping
ansible “*srvs” -m ping
或關係
示例:
ansible “websrvs:appsrvs” -m ping
ansible “192.168.1.10:192.168.1.20” -m ping
邏輯與
ansible “websrvs:&dbsrvs” -m ping
在websrvs組,但不在dbsrvs組中的主機
邏輯非
ansible ‘websrvs:!dbsrvs’ -m ping
綜合邏輯
ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ -m -ping
正則表達式
ansible “websrvs:&dbsrvs” -m ping
ansible “~(web|db).*\.magedu\.com” -m ping
常用模塊
簡單介紹常用模塊如何使用,模塊的參數僅是常用的參數,完整具體的參數,請參考ansible文檔,或者使用ansible-doc
命令查看模塊的幫助文檔。
command 執行命令
ansible的默認模塊,因此可以省略-m
參數。
ansible lanyulei -m command -a "hostname"
ansible lanyulei -a "hostname"
shell 執行shell命令
與上面的command基本相同,但shell模塊兼容性更好。
例如:當命令中需要管道操作的時候,則不能使用command模塊,需要使用shell模塊來執行命令。
ansible lanyulei -m shell -a "ps -ef |grep ansible" -f 1
-f 參數表示每次返回多少條結果
yum 安裝軟件
推送腳本文件到遠程主機,並遠程執行腳本文件
ansible lanyulei -m yum -a "name=httpd state=installed"
參數介紹
name 指定要安裝的軟件包的名稱
state 指定使用yum的方式
installed, present 安裝軟件包
removed, adsent 移除軟件包
latest 安裝目前最新的軟件包
copy 推送文件
將本地文件推送到客戶端
ansible lanyulei -m copy -a "src=/etc/hosts dest=/tmp/test.txt"
在推送覆蓋遠程主機文件時,對遠程主機已有的文件進行備份,按照時間備份
ansible lanyulei -m copy -a "src=/etc/hosts desc=/tmp/test.txt backup=yes"
直接想遠程機器文件內寫入數據,並且直接覆蓋遠程文件內原有的數據
ansible lanyulei -m copy -a "content='bgx' dest=/tmp/test.txt"
參數介紹
src 要推送數據的源文件信息
dest 要推送到目標機器的啥路徑
backup 對推送過去的文件,進行備份
content 直接在遠程主機上對文件進行原地修改
group 推送文件的時候,指定文件屬組
owner 推送文件的時候,指定文件屬主
mode 推送文件的時候,指定文件權限
fetch 拉取文件
文件拉取模塊主要是將遠程主機中的文件拷貝到本機中,和copy模塊的作用剛剛相反,並且在保存的時候使用hostname來進行保存,當文件不存在的時候,會出現錯誤,除非設置了選項fail_on_missing爲yes
ansible lanyulei -m fetch -a "dest=/opt src=/tmp/cron.txt"
詳細參數可參考
ansible-doc -s fetch
service 啓停服務
啓動或者停止服務
ansible lanyulei -m service -a "name=httpd state=stopped enabled=yes"
參數介紹
name 定義要啓停的服務名稱
state 指定服務狀態,停止或者啓動
started 啓動
stopped 停止
restarted 重啓
reloaded 重載
enabled 是否讓服務開機自啓動
script 執行腳本文件
在本地運行模塊,等同於在遠程執行,不需要將腳本文件進行文件推送,就可以執行
ansible lanyule -m script -a "/tmp/test.sh"
user 用戶管理
操作系統的用戶
創建用戶,並配置對應的用戶密碼(-1 表示使用MD5進行加密)
passwd=`echo "lanyulei" | openssl passwd -1 -stdin`
ansible lanyulei -m user -a "name=lanyulei password='$passwd'"
創建用戶,設置uid爲888, 並加入gid爲888的組
ansible lanyulei -m user -a "name=lanyulei uid=888 group=888 shell=/sbin/nologin create_home=no"
參數介紹
uid 指定用戶的uid
group 指定用戶組名稱
groups 指定附加組名稱
password 設置用戶密碼
shell 指定用戶登陸的shell
create_home 是否創建家目錄
group 組管理
操作系統的用戶組
創建組
ansible lanyulei -m group -a "name=lanyulei gid=888"
參數介紹
name 指定創建的組名
gid 指定組的gid
state
absent 移除遠程主機的組
present 創建遠程主機的組
file 目錄及文件操作
對目錄及文件進行操作
創建目錄
ansible lanyulei -m file -a "path=/tmp/lanyulei state=diretory"
創建文件
ansible lanyulei -m file -a "path=/tmp/lanyulei state=touch mode=555 owner=root group=root"
創建鏈接文件
ansible lanyulei -m file -a "src=/tmp/lanyulei path=/tmp/lanyulei_link state=link"
參數介紹
path 指定遠程主機目錄或者文件信息
recurse 遞歸授權
state
directory 在遠程主機上創建目錄
touch 在遠程主機上創建文件
link/hard 在遠程主機上給文件或者目錄創建鏈接文件
absent 刪除遠程主機上的目錄或者文件
mode 設置遠程主機上文件或者目錄的權限
owner 設置遠程主機上文件或者目錄的屬主
group 設置遠程主機上文件或者目錄的屬組
cron 定時任務
操作crontab定時任務
創建一個定時任務
ansible lanyulei -m cron -a "minute=* hour=* day=* month=* weekday=* job='/bin/sh /tmp/test.sh'"
默認全都是*,因此可以寫成如下:
ansible lanyulei -m cron -a "job='/bin/sh /tmp/test.sh'"
設置定時任務註釋信息,防止重複,name設定
ansible lanyulei -m cron -a "name='cron2' job='/bin/sh /tmp/test.sh'"
刪除相應的定時任務
ansible lanyulei -m cron -a "name='ansible cron2' minute=0 hour=0 job='/bin/sh /tmp/test.sh' state=absent"
註釋相應的定時任務,使定時任務失效
ansible lanyulei -m cron -a "name='ansible cron2' minute=0 hour=0 job='/bin/sh /tmp/test.sh' disabled=no"
mount 掛載
用於掛載的模塊
ansible lanyulei -m mount -a "path=/backup src=192.168.1.131:/data fstype=nfs opts=defautls,noatime state=mounted"
參數介紹
state
present 開機掛載,僅將掛載配置寫入/etc/fstab,但是不會執行掛載的操作
mounted 掛載設備,並將配置寫入/etc/fatab
unmounted 臨時卸載設備,不會清除/etc/fstab寫入的配置
absent 卸載設備,會清理/etc/fstab寫入的配置