一、什麼樣的情形需要批量部署
1、作業系統的安裝
常見的有collber,red hat satelite(redhat)系統專用。
2、作業系統的配置
常見的有cfengine,puppet,chef,func。其中puppet最受歡迎
3、批配量序的部署
4、批量命令的運行查看狀態資訊
二、ansible介紹
ansible的架構大致如下
ansible是新出現的營運工具是基於Python研發的糅合了眾多老牌營運工具的優點實現了大量操作系統配置、批配量序的部署、批量運行命令等功能。
營運工具常見的工作模式
1、agent模式: 基於ssl實現。代理工作在被監控端。像puppet。
2、agentless模式: 基於ssh服務實現工作在被監控端。監控端是ssh的用戶端。
ansible是工作在agentless模式下具有等冪性。ansible在控制端只需要告訴監控端的期望狀態就可以實現批量部署。
名詞解釋
等冪性不會重複執行相同的指令。例如不會重複安裝軟體
期望狀態只需要告訴被監控端的期望狀態
ansible是基於模組工作的ansible本身沒有批量部署的能力。真正具有批量部署的是ansible所啟動並執行模組ansible只是提供一種架構。架構包括
串連外掛程式connection plugins負責和被監控端實現通訊。
Host Inventory:指定操作的主機,是一個設定檔裡面定義監控的主機
各種模組核心模組command模組自訂模組
藉助於外掛程式完成記錄日誌郵件等功能
PlayBooks:劇本執行多個任務時。並非必需可以讓節點一次性運行多個任務
三、基本使用方法
在管理叢集時,ansible需要先配置叢集hosts列表以方便叢集操作
代碼如下:
$ cat /etc/ansible/hosts
[local]
# 配置密碼登陸,需要ansible本機安裝sshpass
192.168.213.135 ansible_ssh_user=root ansible_ssh_pass=root
[zabbix]
# 密鑰登陸
172.17.0.2:49154 ansible_ssh_user=root
172.17.0.4:49155 ansible_ssh_user=root
[vpn]
172.17.0.10
測試連接登陸是否OK
代碼如下:
$ ansible local -m ping
192.168.213.135 | success >> {
"changed": false,
"ping": "pong"
}
ansible常見用法為ansible host-pattern -m 模組 -a 命令,host-pattern類似於簡化的Regex,而模組可以通過ansible-doc -l命令來查詢。下面是一些常用模組的使用方法:
安裝軟體:
代碼如下:
ansible local -m apt -a ‘name=gcc state=present’
或者
代碼如下:
ansible local -m yum -a “name=nmap state=installed”
執行命令:
代碼如下:
ansible local -m shell -a ‘uptime’
拷貝檔案:
代碼如下:
ansible local -m copy -a “src=/tmp/server dest=/tmp/server”
檔案屬性:
代碼如下:
ansible local -m file -a “dest=/tmp/server mode=755 owner=root group=root”
*
playbook
playbook是由一個或多個“play”組成的列表。play的主要功能在於將事先歸併為一組的主機裝扮成事先通過ansible中的task定義好的角色。
一個簡單的playbook配置如下:
代碼如下:
- hosts: local
remote_user: root
tasks:
- name: echo hi
shell: echo "hi"
ansible還支援設定handlers,handlers是在執行tasks之後伺服器發生變化之後可供調用的handler,使用起來如下:
代碼如下:
# playbook.yml
---
- hosts: local # hosts中指定
remote_user: root # 如果和目前使用者一樣,則無需指定
tasks:
- name: whoami
copy: src=~/hosts dest=~/hosts.dest # 本地拷貝到遠端
notify: # 如果copy執行完之後~/hosts.dest檔案發送了變化,則執行
- clear copy # 調用handler
handlers:
- name: clear copy
shell: 'mv ~/hosts.dest hosts.del' # 假裝刪除