批量部署工具Ansibale筆記
? Ansibale簡介
? ? ansible是新出現的自動化運維工具,基于Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。? ? ansible是基于模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:? ? (1)、連接插件connection plugins:負責和被監控端實現通信;? ? (2)、host inventory:指定操作的主機,是一個配置文件里面定義監控的主機;? ? (3)、各種模塊核心模塊、command模塊、自定義模塊;? ? (4)、借助于插件完成記錄日志郵件等功能;? ? (5)、playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務。
? Ansibale安裝
? ? ansibale安裝是基于EPEL源,需要聯網下載很多插件及依賴包,因此,需要配置好EPEL源之后再執行:yum install ansible 。? ? 確認安裝: ansible –version
? 相關文件了解
配置文件
/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/ansible-pull 遠
程執行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面與用戶交互的執行工具
Inventory 主機清單
ansible的主要功用在于批量主機操作,為了便捷地使用其中的部分主機,可以在inventory file中將其分組命名
默認的inventory file為/etc/ansible/hosts
inventory file可以有多個,且也可以通過Dynamic Inventory來動態生成
inventory文件遵循INI文件風格,中括號中的字符為組名。可以將同一個主機同時歸并到多個不同的組中;此外,當如若目標主機使用了非默認 的SSH端口,還可以在主機名稱之后使用冒號加端口號來標明
ntp.magedu.com
[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 配置文件/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 #日志文件
? ansible參數
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 切換
? ansible的Host-pattern
匹配主機的列表
All :表示所有Inventory中的所有主機
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的Host-pattern
邏輯與
ansible “websrvs:&dbsrvs” –m ping
在websrvs組并且在dbsrvs組中的主機
邏輯非
ansible ‘websrvs:!dbsrvs’ –m ping
在websrvs組,但不在dbsrvs組中的主機
綜合邏輯
ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
正則表達式
ansible “websrvs:&dbsrvs” –m ping
ansible “~(web|db).*\.magedu\.com” –m ping
? ansible命令執行過程
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使用示例
示例:
以wang用戶執行ping存活檢測
ansible all -m ping -u wang -k
以wang sudo至root執行ping存活檢測
ansible all -m ping -u wang –b -k
以wang sudo至mage用戶執行ping存活檢測
ansible all -m ping -u wang –b -k –become-user mage
以wang sudo至root用戶執行ls
ansible all -m command -u wang –become-user=root -a ‘ls /root’ -b –k
? ansible常用13個模塊示例
Command:在遠程主機執行命令,默認模塊,可忽略-m選項
ansible srvs -m command -a ‘service vsftpd start’
ansible srvs -m command -a ‘echo magedu |passwd –stdin wang’ 不成功
此命令不支持 $VARNAME < > | ; & 等,用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:運行腳本
-a “/PATH/TO/SCRIPT_FILE“
snsible websrvs -m script -a f1.sh
Copy:從服務器復制文件到客戶端,
ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600backup=yes”
如目標存在,默認覆蓋,此處指定先備份
ansible srv -m copy -a “content=‘test content\n’ dest=/tmp/f1.txt” 利用內容,直接生成目標文件
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’ 刪除任務
ansible srv -m cron -a ‘disabled=true ?job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’ name=Synctime’禁用任務
Fetch:從客戶端取文件至服務器端,copy相反,目錄可先tar
ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’
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’
Hostname:管理主機名
ansible node1 -m hostname -a “name=websrv”
Yum:管理包
ansible srv -m yum -a ‘name=httpd state=latest’ 安裝
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’
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‘
刪除用戶及家目錄等數據
Group:管理組
ansible srv -m group -a “name=testgroup system=yes“
ansible srv -m group -a “name=testgroup state=absent”
? ansible系列命令
ansible-galaxy
連接 https://galaxy.ansible.com 下載相應的roles
列出所有已安裝的galaxy
ansible-galaxy list
安裝galaxy
ansible-galaxy install geerlingguy.redis
刪除galaxy
ansible-galaxy remove geerlingguy.redis
ansible-pull
推送命令至遠程,效率無限提升,對運維要求較高
Ansible-playbook
ansible-playbook hello.yml ??//執行劇本
cat hello.yml
—
#hello world yml file
– ?hosts: websrvs
remote_user: root
tasks:
– ?name: hello world
command: /usr/bin/wall hello world
? Ansible-vault
功能:管理加密解密yml文件
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml 加密
ansible-vault decrypt hello.yml 解密
ansible-vault view hello.yml 查看
ansible-vault edit hello.yml 編輯加密文件
ansible-vault rekey hello.yml 修改口令
ansible-vault create new.yml 創建新文件
Ansible-console:2.0+新增,可交互執行命令,支持tab
root@test (2)[f:10] $
執行用戶@當前操作的主機組 (當前組的主機數量)[f:并發數]$
設置并發數: forks n 例如: forks 10
切換組: cd 主機組 例如: cd web
列出當前組主機列表: list
列出所有的內置命令: ?或help
示例:
root@all (2)[f:5]$ list
root@all (2)[f:5]$ cd appsrvs
root@appsrvs (2)[f:5]$ list
root@appsrvs (2)[f:5]$ yum name=httpd state=present
root@appsrvs (2)[f:5]$ service name=httpd state=started
? 注意事項
執行ansible的主機一般稱為主控端,中控,master或堡壘機
主控端Python版本需要2.6或以上
被控端Python版本小于2.4需要安裝python-simplejson
被控端如開啟SELinux需要安裝libselinux-python
windows不能做為主控端
理論知識再多,不如我們動手實踐。下面我帶自己飛一圈兒,來繼續感受ansible的強大?。。。?!
? 實踐準備
由于ansible是一種強大的批量部署軟件,所以當我們在實踐中需要管理幾十臺上百臺的主機的時候,往往不能因為每臺被控設備的用戶密碼而嚴重影響了管理的效率,所以,在此建議大家用一臺主控機將眼前的幾十臺上百臺主機實現基于key的驗證,這樣我們就可以通過主控機hosts來實現對被控集群安全又高效的管理
基于key驗證方法:在主控機上創建一個存有所有被控機的ip的文件ip.txt,然后執行ssh-keygen命令一直回車,這時主控機的密鑰對已經生成,接下來我們執行下面的腳本將公鑰發往所有的被控機:
#!/bin/bash
rpm ?-q ?expect ?&> /dev/null ?|| ?yum ?install ?expect ?-y
password=admin123
while ?read ?ipaddr ; do
expect ?<<-EOF
set ?timeout ?10
spawn ?ssh-copy-id ?$ipaddr
expect ?{
“yes/no” { ?send “yes\n”;exp_continue ?}
“password” { ?send “$password\n” ?}
}
expect ?eof
EOF
done < ip.txt
注意:腳本中的password變量定義為所有被控主機的密碼,密碼不是這個的修改為真正的密碼。因此,我們要把所有的被控主機的密碼設置成一樣的。這個就不多說了,簡單腳本就可以實現。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/99669