一.關(guān)于什么是Ansible?
1.Ansible即:自動(dòng)化部署工具.
2.Ansible 介紹和架構(gòu);
公司計(jì)劃在年底做一次大型市場(chǎng)促銷活動(dòng),全面沖刺下交易額猾漫,為明年的上市做準(zhǔn)備纽甘。公司要求各業(yè)務(wù)組對(duì)年底大促做準(zhǔn)備傻寂,運(yùn)維部要求所有業(yè)務(wù)容量進(jìn)行三倍的擴(kuò)容帽揪,并搭建出多套環(huán)境可以共開發(fā)和測(cè)試人員做測(cè)試雾狈,運(yùn)維老大為了在年底有所表現(xiàn),要求運(yùn)維部門同學(xué)盡快實(shí)現(xiàn)母怜,當(dāng)你接到這個(gè)任務(wù)時(shí)余耽,有沒有更快的解決方案?
2.1 Ansible發(fā)展史
作者:Michael DeHaan( Cobbler 與 Func 作者)
ansible 的名稱來自科幻小說《安德的游戲》中跨越時(shí)空的即時(shí)通信工具苹熏,使用它可以在相距數(shù)光年的距離碟贾,遠(yuǎn)程實(shí)時(shí)控制前線的艦隊(duì)?wèi)?zhàn)斗。
2012-03-09轨域,發(fā)布0.0.1版袱耽,2015-10-17,Red Hat宣布1.5億美元收購(gòu)
官網(wǎng):https://www.ansible.com/
官方文檔:https://docs.ansible.com/
2.2 Ansible 特性
模塊化:調(diào)用特定的模塊完成特定任務(wù)干发,支持自定義模塊朱巨,可使用任何編程語(yǔ)言寫模塊
Paramiko(python對(duì)ssh的實(shí)現(xiàn)),PyYAML枉长,Jinja2(模板語(yǔ)言)三個(gè)關(guān)鍵模塊基于Python語(yǔ)言實(shí)現(xiàn)
部署簡(jiǎn)單冀续,基于python和SSH(默認(rèn)已安裝),agentless必峰,無需代理不依賴PKI(無需ssl)安全洪唐,基于OpenSSH
冪等性:一個(gè)任務(wù)執(zhí)行1遍和執(zhí)行n遍效果一樣,不因重復(fù)執(zhí)行帶來意外情況支持playbook編排任務(wù)吼蚁,YAML格式凭需,編排任務(wù)肝匆,支持豐富的數(shù)據(jù)結(jié)構(gòu)
較強(qiáng)大的多層解決方案 role.
2.3 Ansible 架構(gòu)
2.3.1 Ansible 組成
組合INVENTORY粒蜈、API、MODULES旗国、PLUGINS的綠框枯怖,為ansible命令工具,其為核心執(zhí)行工具
INVENTORY:Ansible管理主機(jī)的清單/etc/anaible/hosts
MODULES:Ansible執(zhí)行命令的功能模塊粗仓,多數(shù)為內(nèi)置核心模塊嫁怀,也可自定義
PLUGINS:模塊功能的補(bǔ)充,如連接類型插件借浊、循環(huán)插件、變量插件萝招、過濾插件等蚂斤,該功能不常用
API:供第三方程序調(diào)用的應(yīng)用程序編程接口
2.3.2 Ansible 命令執(zhí)行來源
USER 普通用戶,即SYSTEM ADMINISTRATOR
PLAYBOOKS:任務(wù)劇本(任務(wù)集)槐沼,編排定義Ansible任務(wù)集的配置文件曙蒸,由Ansible順序依次執(zhí)行捌治,通常是JSON格式的YML文件
CMDB(配置管理數(shù)據(jù)庫(kù)) API 調(diào)用
PUBLIC/PRIVATE CLOUD API調(diào)用
USER-> Ansible Playbook -> Ansibile
2.3.3 注意事項(xiàng)
執(zhí)行ansible的主機(jī)一般稱為主控端,中控纽窟,master或堡壘機(jī)
主控端Python版本需要2.6或以上
被控端Python版本小于2.4肖油,需要安裝python-simplejson
被控端如開啟SELinux需要安裝libselinux-python
windows 不能做為主控端
3 Ansible 安裝和入門
3.1 Ansible安裝
ansible的安裝方法有多種
3.1.1 EPEL源的rpm包安裝:
[root@ansible ~]#yum install ansible? ? ?##最簡(jiǎn)單的方法
3.1.2 編譯安裝
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
3.1.3 確認(rèn)安裝
[root@ansible ~]#ansible --version
ansible 2.9.5
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, Nov 21 2019, 19:31:34) [GCC 8.3.1 20190507(Red Hat 8.3.1-4)]
3.2 Ansible 相關(guān)文件
3.2.1 配置文件*****
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主機(jī)清單
/etc/ansible/roles/ 存放角色的目錄
3.2.2 ansible主配置文件
Ansible 的配置文件 /etc/ansible/ansible.cfg ,其中大部分的配置內(nèi)容無需進(jìn)行修改
[defaults]
#inventory ? ? = /etc/ansible/hosts # 主機(jī)列表配置文件
#library = /usr/share/my_modules/ # 庫(kù)文件存放目錄
#remote_tmp = $HOME/.ansible/tmp #臨時(shí)py命令文件存放在遠(yuǎn)程主機(jī)目錄
#local_tmp ? ? = $HOME/.ansible/tmp # 本機(jī)的臨時(shí)命令執(zhí)行目錄
#forks ? ? ? ? = 5 ? # 默認(rèn)并發(fā)數(shù)
#sudo_user ? ? = root # 默認(rèn)sudo 用戶
#ask_sudo_pass = True #每次執(zhí)行ansible命令是否詢問ssh密碼
#ask_pass ? ? = True ?
#remote_port ? = 22
#host_key_checking = False # 檢查對(duì)應(yīng)服務(wù)器的host_key臂港,建議取消注釋
#log_path=/var/log/ansible.log #日志文件森枪,建議啟用
#module_name = command ? #默認(rèn)模塊,可以修改為shell模塊
3.2.3 inventory 主機(jī)清單
ansible的主要功用在于批量主機(jī)操作审孽,為了便捷地使用其中的部分主機(jī)县袱,可以在inventory file中將其分組命名
默認(rèn)的inventory file為 /etc/ansible/hosts
inventory file可以有多個(gè),且也可以通過Dynamic Inventory來動(dòng)態(tài)生成主機(jī)清單文件格式
inventory文件遵循INI文件風(fēng)格佑力,中括號(hào)中的字符為組名式散。可以將同一個(gè)主機(jī)同時(shí)歸并到多個(gè)不同的組中,此外打颤,當(dāng)如若目標(biāo)主機(jī)使用了非默認(rèn)的SSH端口暴拄,還可以在主機(jī)名稱之后使用冒號(hào)加端口號(hào)來標(biāo)明,如果主機(jī)名稱遵循相似的命名模式,還可以使用列表的方式標(biāo)識(shí)各主機(jī)
范例:
ntp.magedu.com
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com
[websrvs]
www[1:100].example.com
[dbsrvs]
db-[a:f].example.com
3.3 Ansible相關(guān)工具
/usr/bin/ansible? ? ? ? ? ? ? ? ? ? ?主程序编饺,臨時(shí)命令執(zhí)行工具
/usr/bin/ansible-doc? ? ? ? ? ? ? 查看配置文檔揍移,模塊功能查看工具,相當(dāng)于man
/usr/bin/ansible-playbook? ? ?定制自動(dòng)化任務(wù),編排劇本工具,相當(dāng)于腳本
/usr/bin/ansible-pull? ? ? ? ? ? ? 遠(yuǎn)程執(zhí)行命令的工具
/usr/bin/ansible-vault? ? ? ? ? ? 文件加密工具
/usr/bin/ansible-console? ? ? ?基于Console界面與用戶交互的執(zhí)行工具
/usr/bin/ansible-galaxy? ? ? ? ?下載/上傳優(yōu)秀代碼或Roles模塊的官網(wǎng)平臺(tái)
利用ansible實(shí)現(xiàn)管理的主要方式:
Ad-Hoc 即利用ansible命令反肋,主要用于臨時(shí)命令使用場(chǎng)景
Ansible-playbook 主要用于長(zhǎng)期規(guī)劃好的那伐,大型項(xiàng)目的場(chǎng)景,需要有前期的規(guī)劃過程
3.3.1 ansible-doc
此工具用來顯示模塊幫助
格式
ansible-doc [options] [module...]
-l, --list? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#列出可用模塊
-s, --snippets? ? ? ? ? ? ? ? ? ? ? #顯示指定模塊的playbook片段
范例:
#列出所有的模塊
ansible-doc -l
#查看指定模塊幫助用法
ansible-doc ping
#查看指定模塊幫助用法
ansible-doc -s ping?
實(shí)例:
[root@ansible ~]# ansible-doc -l | wc -l?
3387
3.3.2 ansible
此工具通過ssh協(xié)議石蔗,實(shí)現(xiàn)對(duì)遠(yuǎn)程主機(jī)的配置管理罕邀、應(yīng)用部署、任務(wù)執(zhí)行等功能
建議:使用此工具前养距,先配置ansible主控端能基于密鑰認(rèn)證的方式聯(lián)系各個(gè)被管理節(jié)點(diǎn)
范例:利用sshpass批量實(shí)現(xiàn)基于key驗(yàn)證腳本1
[root@localhost ~]# vim /etc/ssh/ssh_config?
#修改下面的一行
StrictHostKeyChecking no
[root@localhost ~]#? cat hosts.list
10.0.0.18
10.0.0.28?
[root@localhost ~]#? vim? push_ssh_key.sh?
#bin/bash?
rpm -q sshpass &> /dev/null? || yum -y install sshpass?
[ -f? /root/.ssh/id_rsa ] || ssh-keygen -f /root/.ssh/id_rsa -p ''
export SSHPASS=123456
while read IP;do?
? ? sshpass -e ssh-copy-id? -o??StrictHostKeyChecking=no $IP?
done < hosts.list?
格式:
ansible <host-pattern> [-m module_name] [-a args]
選項(xiàng)說明:
--version #顯示版本
-m module ? #指定模塊诉探,默認(rèn)為command
-v #詳細(xì)過程 –vv -vvv更詳細(xì)
--list-hosts #顯示主機(jī)列表,可簡(jiǎn)寫 --list
-k, --ask-pass ? ? #提示輸入ssh連接密碼棍厌,默認(rèn)Key驗(yàn)證
-C, --check ? #檢查肾胯,并不執(zhí)行
T, --timeout=TIMEOUT #執(zhí)行命令的超時(shí)時(shí)間,默認(rèn)10s
-u, --user=REMOTE_USER #執(zhí)行遠(yuǎn)程執(zhí)行的用戶
-b, --become ? ?#代替舊版的sudo 切換
--become-user=USERNAME ?#指定sudo的runas用戶耘纱,默認(rèn)為root
-K, --ask-become-pass ?#提示輸入sudo時(shí)的口令
ansible的Host-pattern
用于匹配被控制的主機(jī)的列表
All :表示所有Inventory中的所有主機(jī)
范例
ansible all –m ping
*:通配符
ansible "*" -m ping
ansible 192.168.1.* -m ping
ansible "srvs" -m ping
ansible命令執(zhí)行過程
1. 加載自己的配置文件 默認(rèn)/etc/ansible/ansible.cfg
2. 加載自己對(duì)應(yīng)的模塊文件敬肚,如:command
3. 通過ansible將模塊或命令生成對(duì)應(yīng)的臨時(shí)py文件,并將該文件傳輸至遠(yuǎn)程服務(wù)器的對(duì)應(yīng)執(zhí)行用戶
$HOME/.ansible/tmp/ansible-tmp-數(shù)字/XXX.PY文件
4. 給文件+x執(zhí)行
5. 執(zhí)行并返回結(jié)果
6. 刪除臨時(shí)py文件束析,退出
ansible 的執(zhí)行狀態(tài):
綠色:執(zhí)行成功并且不需要做改變的操作
黃色:執(zhí)行成功并且對(duì)目標(biāo)主機(jī)做變更
紅色:執(zhí)行失敗
ansible使用范例:
#以liu用戶執(zhí)行ping存活檢測(cè)
ansible all -m ping -u liu? -k
#以liu sudo至root執(zhí)行ping存活檢測(cè)
ansible all -m ping -u liu -k -b
----------------------------------------------[馬哥門徒]----------------------------------------------