由淺入深學習Ansible工具
Ansible是新出現的自動化運維工具,基於python開發,實現批量系統配置、批量程序部署、批量運行命令等功能。
Ansible是基於模塊工作的,本身沒有批量部署能力。真正具有批量部署的是Ansible所運行的模塊。
Ansible的特性
模塊化:調用特定的模塊,完成特定任務
有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊
支持自定義模塊
基於Python語言實現
部署簡單,基於python和SSH(默認已安裝),agentless
安全,基於OpenSSH
支持playbook編排任務
冪等性:一個任務執行1遍和執行n遍效果一樣,不因重複執行帶來意外情況
無需代理不依賴PKI(無需ssl)
可使用任何編程語言寫模塊
YAML格式,編排任務,支持豐富的數據結構
較強大的多層解決方案
Ansible的架構
Core Modules:內建模塊
Custom Modules自定義模塊:讓用戶完成自定義任務的核心組件
Connection Plugins連接插件:默認ssh連接
Host Inventory主機清單:列在清單中的主機才能進行管理
email、logging、other插件:實現記錄日誌,發送郵件等功能
核心組件Playbooks:類似於劇本的存在,定義主機角色,將劇本扔給角色
Ansible工作原理
Ansible主要組成部分
ANSIBLE PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序依次執行,通常是JSON格式的YML文件
INVENTORY:Ansible管理主機的清單/etc/anaible/hosts
MODULES:Ansible執行命令的功能模塊,多數爲內置核心模塊,也可自定義
PLUGINS:模塊功能的補充,如連接類型插件、循環插件、變量插件、過濾插件等,該功能不常用
API:供第三方程序調用的應用程序編程接口
ANSIBLE:組合INVENTORY、 API、 MODULES、 PLUGINS的綠框,可以理解爲是ansible命令工具,其爲核心執行工具
Ansible命令執行來源
- USER,普通用戶,即SYSTEM ADMINISTRATOR
- CMDB(配置管理數據庫) API 調用
- PUBLIC/PRIVATE CLOUD API調用
- USER-> Ansible Playbook -> Ansibile
利用Ansible實現管理的方式
- Ad-Hoc 即ansible命令,主要用於臨時命令使用場景
- Ansible-playbook 主要用於長期規劃好的,大型項目的場景,需要有前提的規劃
Ansible-playbook(劇本)執行過程
- 將已有編排好的任務集寫入Ansible-Playbook
- 通過ansible-playbook命令分拆任務集至逐條ansible命令,按預定規則逐條執行
Ansible主要操作對象
- HOSTS主機
- NETWORKING網絡設備
注意事項
1. 執行ansible的主機一般稱爲主控端,中控,master或堡壘機
2. 主控端Python版本需要2.6或以上
3. 被控端Python版本小於2.4需要安裝python-simplejson
4. 被控端如開啓SELinux需要安裝libselinux-python
5. windows不能做爲主控端
Ansible的安裝方式
rpm包安裝:EPEL源
yum install ansible
編譯安裝
yum -y install python-jinja2 PyYAML python-paramiko python-babel
python-crypto
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
Git方式安裝
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
pip安裝:pip是安裝Python包的管理器,類似yum
yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip install --upgrade pip
pip install ansible --upgrade
確認安裝
[root@Ansible ~]#ansible --version
ansible 2.7.0
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
Ansible的相關文件
相關配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主機清單
/etc/ansible/roles/ 存放角色的目錄
相關程序文件
/usr/bin/ansible 主程序,臨時命令執行工具
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具
/usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官網平臺
/usr/bin/ansible-playbook 定製自動化任務,編排劇本工具/usr/bin/ansiblepull 遠程執行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基於Console界面與用戶交互的執行工具
主機清單/etc/ansible/hosts文件格式
主機清單文件遵循INI文件風格,中括號中的字符爲組名。可以將同一個主機同時歸併到多個不同的組中;此外,當如若目標主機使用了非默認的SSH端口,還可以在主機名稱之後使用冒號加端口號來標明
eg:
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com
如果主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機
[websrvs]
www[01:100].example.com
[dbsrvs]
db-[a:f].example.com
Ansible配置文件
Ansible 配置文件爲/etc/ansible/ansible.cfg (一般保持默認)
[defaults] #inventory = /etc/ansible/hosts # 主機列表配置文件 #library = /usr/share/my_modules/ # 庫文件存放目錄 #remote_tmp = $HOME/.ansible/tmp #臨時py命令文件存放在遠程主機目錄 #local_tmp = $HOME/.ansible/tmp # 本機的臨時命令執行目錄 #forks = 5 # 默認併發數 #sudo_user = root # 默認sudo 用戶 #ask_sudo_pass = True #每次執行ansible命令是否詢問ssh密碼 #ask_pass = True #remote_port = 22 #host_key_checking = False # 檢查對應服務器的host_key,建議取消註釋 #log_path=/var/log/ansible.log #日誌文件 #module_name = command #默認模塊
Ansible命令
ansible通過ssh實現配置管理、應用部署、任務執行等功能,建議配置ansible端能基於密鑰認證的方式聯繫各被管理節點
ansible-doc:顯示模塊幫助文檔
ansible-doc –l 列出所有模塊
ansible-doc ping 查看指定模塊幫助用法
ansible-doc –s ping 查看指定模塊幫助用法
ansible命令格式
ansible <host-pattern> [-m module_name] [-a args]
--version 顯示版本
-m module 指定模塊,默認爲command
-v 詳細過程 –vv -vvv更詳細
--list-hosts 顯示主機列表,可簡寫 --list
-k, --ask-pass 提示輸入ssh連接密碼,默認Key驗證
-K, --ask-become-pass 提示輸入sudo時的口令
-C, --check 檢查,並不執行
-T, --timeout=TIMEOUT 執行命令的超時時間,默認10s
-u, --user=REMOTE_USER 執行遠程執行的用戶
-b, --become 代替舊版的sudo 切換
--become-user=USERNAME 指定sudo的runas用戶,默認爲root
Ansible的Host-pattern
All表示所有主機清單中的所有主機
ansible all –m ping
邏輯與
在websrvs組並且在dbsrvs組中的主機
ansible “websrvs:&dbsrvs” –m ping
邏輯或
在websrvs組,但不在dbsrvs組中的主機
ansible 'websrvs:!dbsrvs' –m ping
正則表達式
ansible “websrvs:&dbsrvs” –m ping
ansible “~(web|db).*.magedu.com” –m ping
Ansible命令執行過程
1. 加載自己的配置文件 默認/etc/ansible/ansible.cfg
2. 加載自己對應的模塊文件,如command
3. 通過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器的對應執行用戶$HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY文件
4. 給文件+x執行
5. 執行並返回結果
6. 刪除臨時py文件,sleep 0退出
Ansible命令執行狀態
綠色:執行成功並且不需要做改變的操作
×××:執行成功並且對目標主機做變更
紅色:執行失敗
Ansible基於祕鑰認證連接目標主機
-
祕鑰認證,生成祕鑰文件
[root@Ansible ~]# ssh-keygen -t rsa -P "" Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): 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: fe:e7:77:ab:0a:af:9c:34:80:13:95:11:e6:c1:52:fb root@Ansible The key's randomart image is: +--[ RSA 2048]----+ | oB+ | | .+oo | | ..o | | o . | | o .SE | | ... | | .+ | | o.= . . .| | +o=oo.o.| +-----------------+
- 將生成的公鑰文件傳送到目標主機上
[root@Ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
The authenticity of host '192.168.36.37 (192.168.36.37)' can't be established.
RSA key fingerprint is 81:e7:91:36:23:aa:e0:db:7e:35:f1:d2:81:cf:97:9a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.36.37' (RSA) to the list of known hosts.
[email protected]'s password:
Now try logging into the machine, with "ssh '[email protected]'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
Ansible使用示例
探測目標主機是否可達
Ansible常用模塊
Ansible有許多模塊,這裏僅列出最常用的幾種模塊進行練習
Command:在遠程主機執行命令,默認模塊,可忽略-m選項
ansible srvs -m command -a 'service vsftpd start'
ansible srvs -m command -a 'echo magedu |passwd --stdin wang'
此命令不支持 $VARNAME < > | ; & 等,用shell模塊實現
command模塊缺陷:(當字符串輸出,command在執行時,不使用shell解析)
查看遠程主機名
Shell:和command相似,用shell執行命令
ansible srv -m shell -a 'echo magedu |passwd –stdin wang'
調用bash執行命令 類似 cat /tmp/stanley.md | awk -F'|' '{print $1,$2}'&> /tmp/example.txt 這些複雜命令,即使使用shell也可能會失敗,解決辦法:寫到腳本時,copy到遠程,執行,再把需要的結果拉回執行命令的機器
遠程主機用戶添加密碼
Script:在遠程主機上運行ansible服務器上的腳本
-a "/PATH/TO/SCRIPT_FILE“
ansible websrvs -m script -a /data/f1.sh
Copy:從主控端複製文件到遠程主機
ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh
owner=wang mode=600 backup=yes”
如目標存在,默認覆蓋,此處指定先備份
ansible srv -m copy -a “content='test content\n' dest=/tmp/f1.txt”
指定內容,直接生成目標文件
複製ansible服務器文件到遠程主機,並設置權限爲600
遠程主機查看
Fetch:從遠程主機提取文件至主控端,copy相反,目錄可先tar
ansible srv -m fetch -a 'src=/root/a.sh dest=/data/scripts'
複製遠程主機文件到ansible服務器
ansible服務器查看複製過來的文件
File:設置文件屬性
ansible srv -m file -a "path=/root/a.sh owner=wang mode=755“
ansible web -m file -a 'src=/app/testfile dest=/app/testfile-link state=link'
設置遠程主機文件所屬用戶爲Darius,權限爲666
設置遠程主機文件的鏈接文件
查看遠程主機文件
Hostname:管理主機名
ansible node1 -m hostname -a “name=websrv”
直接修改主機名,主機名的配置文件同時也進行修改
查看主機名稱以及主機配置文件
Cron:計劃任務
支持時間:minute,hour,day,month,weekday
ansible srv -m cron -a “minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' name=Synctime” 創建任務
ansible srv -m cron -a 'state=absent name=Synctime' 刪除任務
添加每五分鐘同步一次時間的計劃任務
刪除計劃任務
Yum:管理包
ansible srv -m yum -a 'name=httpd state=present' 安裝
ansible srv -m yum -a 'name=httpd state=absent' 刪除
安裝軟件包
查看包是否安裝
卸載軟件包
查看包是否卸載
Service:管理服務
ansible srv -m service -a 'name=httpd state=stopped' # 停止服務
ansible srv -m service -a 'name=httpd state=started enabled=yes' # 啓動服務並設置開機自啓動
ansible srv -m service -a 'name=httpd state=reloaded' # 重新加載配置文件
ansible srv -m service -a 'name=httpd state=restarted' # 重啓服務
遠程啓動服務,查看端口號看是否啓動成功
停止服務
User:管理用戶
ansible srv -m user -a 'name=user1 comment=“test user” uid=2048 home=/app/user1 group=root'
ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 '
ansible srv -m user -a 'name=user1 state=absent remove=yes'
刪除用戶及家目錄等數據
創建用戶user1,uid=2048,所屬組爲root,家目錄爲/app/user1,備註爲test user1
刪除用戶並刪除用戶家目錄
Group:管理組
ansible srv -m group -a "name=testgroup system=yes“
ansible srv -m group -a "name=testgroup state=absent"
創建組
刪除組