簡(jiǎn)介
ansible是一種自動(dòng)化運(yùn)維工具,基于Python開(kāi)發(fā),集合了眾多運(yùn)維工具(puppet、cfengine、chef、func、fabric)的優(yōu)點(diǎn),實(shí)現(xiàn)了批量系統(tǒng)配置、批量程序部署、批量運(yùn)行命令等功能。
安裝
本機(jī)環(huán)境:
macos high sierra 10.13
python 2.7.10
在macos下安裝ansible主要有三種方法,建議采用源碼安裝的方法安裝ansible。
1.brew安裝(需要安裝homebrew模塊)
brew install ansible
2.pip安裝
pip install ansible
3.源碼安裝
git clone https://github.com/ansible/ansible.git
cd ansible
sudo python setup.py install
安裝完成后 用 ansible --version
命令 檢查安裝是否成功
tips:mac下安裝后缺少 /etc/ansible 目錄,需要手動(dòng)添加,并從源碼中將example目錄中的文件拷貝到創(chuàng)建的 /etc/ansible 目錄下。
主機(jī)免秘鑰連接
生成本地ssh秘鑰
ssh-keygen
將本地秘鑰發(fā)給遠(yuǎn)端服務(wù)器(例:用戶名為root ip地址為192.168.1.1)
ssh-copy-id root@192.168.1.1
出現(xiàn)Are you sure you want to continue connecting (yes/no)? 時(shí),輸入yes,之后輸入目標(biāo)服務(wù)器的密碼,大功告成。
再次測(cè)試連接遠(yuǎn)端服務(wù)器,不需要密碼連接上就表明成功
ansible的簡(jiǎn)單使用
當(dāng)我們需要使用ansible直接向遠(yuǎn)端服務(wù)器發(fā)送指令時(shí),一般需要以下步驟:
配置hosts文件,默認(rèn)的hosts文件在 /etc/ansible 目錄下
vim /etc/ansible/hosts
hosts文件基本格式(將需要控制的遠(yuǎn)端服務(wù)器ip地址寫入,后面也可寫入?yún)?shù))
[hostname] #可以隨意命名
192.168.1.2
192.168.1.3
[hostname1]#可以有多個(gè)分組
192.168.1.4
192.168.1.5
測(cè)試能否ping通
ansible all -m ping
192.168.1.2 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}
ansible命令參數(shù)及說(shuō)明
ansible遠(yuǎn)程批量命令
遠(yuǎn)程執(zhí)行命令的模塊有command、shell、scripts、以及raw模塊;
command模塊
command模塊為ansible默認(rèn)模塊,不指定-m參數(shù)時(shí),使用的就是command模塊;comand模塊比較簡(jiǎn)單,常見(jiàn)的命令都可以使用,但其命令的執(zhí)行不是通過(guò)shell執(zhí)行的,所以,像這些 "<", ">", "|", and "&"操作都不可以,當(dāng)然,也就不支持管道;示例:顯示遠(yuǎn)程路徑:
ansible hostname -a 'pwd'
192.168.1.2 | success | rc=0 >>
/home/root
192.168.1.3 | success | rc=0 >>
/home/root
10.6.143.37 | success | rc=0 >>
/home/root
缺點(diǎn):不支持管道,就沒(méi)法批量執(zhí)行命令;
shell模塊
使用shell模塊,在遠(yuǎn)程命令通過(guò)/bin/sh來(lái)執(zhí)行;所以,我們?cè)诮K端輸入的各種命令方式,都可以使用; 但是我們自己定義在.bashrc/.bash_profile中的環(huán)境變量shell模塊由于沒(méi)有加載,所以無(wú)法識(shí)別;如果需要使用自定義的環(huán)境變量,就需要在最開(kāi)始,執(zhí)行加載自定義腳本的語(yǔ)句;
對(duì)shell模塊的使用可以分成兩塊:1) 如果待執(zhí)行的語(yǔ)句少,可以直接寫在一句話中:
ansible hostname -a ". .bash_profile;ps -fe |grep sa_q" -m shell
- 如果在遠(yuǎn)程待執(zhí)行的語(yǔ)句比較多,可寫成一個(gè)腳本,通過(guò)copy模塊傳到遠(yuǎn)端,然后再執(zhí)行;但這樣就又涉及到兩次ansible調(diào)用;對(duì)于這種需求,ansible已經(jīng)為我們考慮到了,script模塊就是干這事的;
script模塊
使用scripts模塊可以在本地寫一個(gè)腳本,在遠(yuǎn)程服務(wù)器上執(zhí)行(遠(yuǎn)程服務(wù)器不需要python環(huán)境):
ansible hostname -m script -a "/home/test/test.sh"
ansible playbook
playbook就是把上述在命令行的操作,以yml格式寫在文件中來(lái)執(zhí)行而已。復(fù)雜的playbook只是更多的命令行操作的集合。
例:將本機(jī)的某個(gè)文件拷貝到遠(yuǎn)端服務(wù)器
vim copytest.yml #創(chuàng)建yml執(zhí)行文件
---
- hosts: hostname # hosts中指定
remote_user: root # 如果和當(dāng)前用戶一樣,則無(wú)需指定
tasks:
- name: copyfile #建議每個(gè)任務(wù)指定一個(gè)name,方便出錯(cuò)時(shí)檢查
copy: src=/root/test.txt dest=root/test.txt # 本地拷貝到遠(yuǎn)端
注解:
tasks定義了playbook中要執(zhí)行的任務(wù),包括任務(wù)名name以及具體的任務(wù)內(nèi)容,tasks只有一個(gè),而任務(wù)可以有多個(gè).
---
- hosts: hostname
remote_user: root
tasks:
- name: copyfile
copy: src=~ dest=~
- name: testshell
shell: 'touch test.txt'
- name: testshell2
shell: 'touch test2.txt' #遵循這樣的格式
playbook執(zhí)行方法:
sudo ansible-playbook copytest.yml #主機(jī)名、執(zhí)行命令都已在yml中指定了。
小測(cè)試
目標(biāo):通過(guò)連接git倉(cāng)庫(kù)的方法,遠(yuǎn)端服務(wù)器將本機(jī)的bash配置文件分發(fā)給其他指定的服務(wù)器,并執(zhí)行生效。
1.創(chuàng)建yml文件編寫task,并上傳到git倉(cāng)庫(kù)
- hosts: host
remote_user: root
tasks:
- name: copyprofile
copy: src=/root/.bash_profile dest=/root/.bash_profile owner=root mode=0600
- name: runprofile
shell: source /root/.bash_profile
2.編寫shell腳本,交給遠(yuǎn)端服務(wù)器執(zhí)行
# !bin/bash
mypath="User/root/itservercontrol"
if [ ! -d "$mypath"]; then
git clone git@example.git #填寫git倉(cāng)庫(kù)地址
sudo ansible-playbook Change_Profile.yml
else
cd itservercontrol
git pull
sudo ansible-playbook Change_Profile.yml
fi
3.向遠(yuǎn)端服務(wù)器發(fā)送本地編寫的腳本,并執(zhí)行
ansible hostname -m script -a "/root/itservertest.sh"
運(yùn)行成功!
本筆記僅供參考,水平較低,還望包涵。