国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 操作系統(tǒng) > 正文

使用ansible批量管理遠(yuǎn)程服務(wù)器

2024-06-28 13:20:26
字體:
供稿:網(wǎng)友
使用ansible批量管理遠(yuǎn)程服務(wù)器使用ansible批量管理遠(yuǎn)程服務(wù)器背景

本地需要管理遠(yuǎn)程的一批服務(wù)器,主要執(zhí)行以下任務(wù):

1) 將本地的文件復(fù)制到遠(yuǎn)端所有服務(wù)器; 2) 需要在遠(yuǎn)程服務(wù)器中執(zhí)行一個(gè)個(gè)命令;

遠(yuǎn)端服務(wù)器路徑并非完全一致,一般訪問通過環(huán)境變量中定義的變量路徑訪問; 比如在.bashrc中定義$app_path=/opt/app/bin

最終選擇ansible,使用這個(gè)自動(dòng)化運(yùn)維工具可以滿足我的需求; 下面介紹下對(duì)于我這種場景需要使用的ansible的主要模塊; 關(guān)于ansible是什么以及安裝配置請(qǐng)自行百度;

復(fù)制copy模塊

使用copy模塊,可以將本地文件一鍵復(fù)制到遠(yuǎn)程服務(wù)器; -a后跟上參數(shù),參數(shù)中指定本地文件和遠(yuǎn)端路徑;

ansible myservers -m copy -a "src=/opt/app/bin/transfer.tar dest=~/"

ansible通過ssh登錄到遠(yuǎn)程服務(wù)器后,并不執(zhí)行.bash_PRofile來設(shè)置用戶自定義的環(huán)境變量;如果我們需要管理的目標(biāo)服務(wù)器的路徑不同,就不能直接寫絕對(duì)路徑,也不能寫變量替換的路徑;

比如:針對(duì)服務(wù)器A的目標(biāo)復(fù)制路徑為 /opt/app/user1/bin ,服務(wù)器B的目標(biāo)復(fù)制路徑為/opt/app/user2/bin; 這兩個(gè)路徑在各自的服務(wù)器中的路徑變量都設(shè)置為$bin; 但在copy模塊中,我們不能直接使用dest = $bin/; 路徑設(shè)置一般放在.bashrc /.bash_profile文件,但ansible模塊登錄后并不加載這兩個(gè)文件;

解決方法: 針對(duì)這種情況,可以將dest路徑設(shè)置為~/,都復(fù)制到用戶目錄,后續(xù)再通過遠(yuǎn)程腳本處理;

遠(yuǎn)程批量命令

需要在遠(yuǎn)程執(zhí)行一個(gè)個(gè)命令來管理遠(yuǎn)程服務(wù)器;

遠(yuǎn)程執(zhí)行命令的模塊有command、shell、scripts、以及raw模塊;

command模塊

command模塊為ansible默認(rèn)模塊,不指定-m參數(shù)時(shí),使用的就是command模塊; comand模塊比較簡單,常見的命令都可以使用,但其命令的執(zhí)行不是通過shell執(zhí)行的,所以,像這些 "<", ">", "|", and "&"操作都不可以,當(dāng)然,也就不支持管道; 示例:顯示遠(yuǎn)程路徑:

ansible myservers  -a 'pwd'10.6.143.38 | success | rc=0 >>/home/rduser10.6.143.53 | success | rc=0 >>/home/rduser10.6.143.37 | success | rc=0 >>/home/rduser

缺點(diǎn):不支持管道,就沒法批量執(zhí)行命令;

shell模塊

使用shell模塊,在遠(yuǎn)程命令通過/bin/sh來執(zhí)行;所以,我們?cè)诮K端輸入的各種命令方式,都可以使用; 但是我們自己定義在.bashrc/.bash_profile中的環(huán)境變量shell模塊由于沒有加載,所以無法識(shí)別;如果需要使用自定義的環(huán)境變量,就需要在最開始,執(zhí)行加載自定義腳本的語句;

對(duì)shell模塊的使用可以分成兩塊: 1) 如果待執(zhí)行的語句少,可以直接寫在一句話中:

ansible myservers  -a ". .bash_profile;ps -fe |grep sa_q" -m shell

2) 如果在遠(yuǎn)程待執(zhí)行的語句比較多,可寫成一個(gè)腳本,通過copy模塊傳到遠(yuǎn)端,然后再執(zhí)行;但這樣就又涉及到兩次ansible調(diào)用;對(duì)于這種需求,ansible已經(jīng)為我們考慮到了,script模塊就是干這事的;

scripts模塊

使用scripts模塊可以在本地寫一個(gè)腳本,在遠(yuǎn)程服務(wù)器上執(zhí)行:

ansible myservers  -m script -a "/opt/app/target.sh"

這里是命令模塊的官方文檔: http://docs.ansible.com/list_of_commands_modules.html

批量執(zhí)行playbooks

遠(yuǎn)程批量命令執(zhí)行的另外一種方式是用playbooks; 這里是playbooks的官方文檔:http://docs.ansible.com/playbooks.html 這里有ansible的playbooks示例:https://github.com/ansible/ansible-examples

在python中使用ansbile API

以上執(zhí)行ansible模塊的方式都是在命令行中直接調(diào)用,如果對(duì)返回結(jié)果需要進(jìn)一步處理,可以在程序中通過API調(diào)用的方式來使用ansible模塊: 比如,以上在命令行中調(diào)用scripts的模塊的方式在API中調(diào)用:

import ansible.runnerresults = ansible.runner.Runner(pattern='myservers', forks=5,module_name='script', module_args='/opt/app/target.sh',).run()

這里是官方給出的一個(gè)詳細(xì)示例,直接運(yùn)行一次,將result全部打印出來,會(huì)有直觀的了解:

#!/usr/bin/pythonimport ansible.runnerimport sys# construct the ansible runner and execute on all hostsresults = 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設(shè)計(jì)詳見:http://docs.ansible.com/developing_api.html

Posted by: 大CC | 26MAY,2015 博客:blog.me115.com [訂閱] 微博:新浪微博


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 来安县| 高淳县| 东乡族自治县| 施甸县| 马公市| 色达县| 双牌县| 滦平县| 吉安市| 全州县| 万山特区| 阿鲁科尔沁旗| 定远县| 额尔古纳市| 花莲县| 娱乐| 岗巴县| 阿克陶县| 静宁县| 繁昌县| 五家渠市| 麻栗坡县| 陵川县| 于都县| 西平县| 黄浦区| 水富县| 阳信县| 措美县| 阿克苏市| 广河县| 静宁县| 永嘉县| 额尔古纳市| 鹤峰县| 中阳县| 手机| 黑山县| 柘荣县| 治多县| 观塘区|