本地需要管理遠端的一批伺服器,主要執行以下任務:
1) 將本地的檔案複製到遠端所有伺服器;
2) 需要在遠端伺服器中執行乙個個命令;
使用copy模組,可以將本地檔案一鍵複製到遠端伺服器;
-a後跟上引數,引數中指定本地檔案和遠端路徑;
ansible通過ssh登入到遠端伺服器後,並不執行.bash_profile來設定使用者自定義的環境變數;如果我們需要管理的目標伺服器的路徑不同,就不能直接寫絕對路徑,也不能寫變數替換的路徑;
解決方法:
針對這種情況,可以將dest路徑設定為~/,都複製到使用者目錄,後續再通過遠端指令碼處理;
需要在遠端執行乙個個命令來管理遠端伺服器;
遠端執行命令的模組有command、shell、scripts、以及raw模組;
command模組為ansible預設模組,不指定-m引數時,使用的就是command模組;
comand模組比較簡單,常見的命令都可以使用,但其命令的執行不是通過shell執行的,所以,像這些 "<", ">", "|", and "&"操作都不可以,當然,也就不支援管道;
示例:顯示遠端路徑:
ansible myservers -a 'pwd'
10.6.143.38 | success | rc=0 >>
/home/rduser
10.6.143.53 | success | rc=0 >>
/home/rduser
10.6.143.37 | success | rc=0 >>
/home/rduser
缺點:不支援管道,就沒法批量執行命令;
使用shell模組,在遠端命令通過/bin/sh來執行;所以,我們在終端輸入的各種命令方式,都可以使用;
但是我們自己定義在.bashrc/.bash_profile中的環境變數shell模組由於沒有載入,所以無法識別;如果需要使用自定義的環境變數,就需要在最開始,執行載入自定義指令碼的語句;
對shell模組的使用可以分成兩塊:
1) 如果待執行的語句少,可以直接寫在一句話中:
ansible myservers -a ". .bash_profile;ps -fe |grep sa_q" -m shell
2) 如果在遠端待執行的語句比較多,可寫成乙個指令碼,通過copy模組傳到遠端,然後再執行;但這樣就又涉及到兩次ansible呼叫;對於這種需求,ansible已經為我們考慮到了,script模組就是幹這事的;
使用scripts模組可以在本地寫乙個指令碼,在遠端伺服器上執行:
這裡是命令模組的官方文件:
遠端批量命令執行的另外一種方式是用playbooks;
這裡是playbooks的官方文件:
這裡有ansible的playbooks示例:
以上執行ansible模組的方式都是在命令列中直接呼叫,如果對返回結果需要進一步處理,可以在程式中通過api呼叫的方式來使用ansible模組:
比如,以上在命令列中呼叫scripts的模組的方式在api中呼叫:
import ansible.runner
results = ansible.runner.runner(
pattern='myservers', forks=5,
).run()
這裡是官方給出的乙個詳細示例,直接執行一次,將result全部列印出來,會有直觀的了解:
#!/usr/bin/python
import ansible.runner
import sys
# construct the ansible runner and execute on all hosts
results = ansible.runner.runner(
pattern='*', forks=10,
module_name='command', module_args='/usr/bin/uptime',
).run()
if results is none:
print "no hosts found"
sys.exit(1)
print "up ***********"
for (hostname, result) in results['contacted'].items():
if not 'failed' in result:
print "%s >>> %s" % (hostname, result['stdout'])
print "failed *******"
for (hostname, result) in results['contacted'].items():
if 'failed' in result:
print "%s >>> %s" % (hostname, result['msg'])
print "down *********"
for (hostname, result) in results['dark'].items():
print "%s >>> %s" % (hostname, result)
api設計詳見:
posted by: 大cc | 26may,2015
部落格:blog.me115.com [訂閱]
ansible批量管理 模組
1.ansible doc ansible doc l 列出所有模組 ansible doc 模組名 檢視該模組的幫助手冊2.ping模組 ansible web m ping3.command模組 ansible web m command a uptime 對web組的主機執行uptime4.s...
使用ansible批量更新key
背景 按照公司要求每半年更新一次所有物理伺服器的ssh登入key。舊key root ssh antiykey.pub 新key root ssh antiykey190708.pub 1,確保ansible能管理所有機器 確保可以ping通所有要操作的機器。新增新key root xiaoxuan...
ansible批量管理工具
一,常見的管理工具 1 ansible so easy 500臺以下的伺服器 2 saltstack 比較複雜 3 puppet 超級複雜 2,ansible介紹 ansible利用ssh通道。這樣一來就需要免秘鑰的指令碼 1 做乙個實驗 vim etc ssh ssh config 先把這裡邊的 ...