使用ansible批量管理遠端伺服器

2022-02-22 19:33:29 字數 2670 閱讀 3898

本地需要管理遠端的一批伺服器,主要執行以下任務:

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 先把這裡邊的 ...