最近看了看強大的號稱自動化運維的三大利器之一的——ansible,ok,親測之后,確實感覺,對於我們這種DBA工作者來說,確實很受益。
值得注意的是ansible要求被管理服務器python版本不低於2.6。
OK,簡單了寫了個腳本,實現服務器端面密鑰登陸被管理服務器python腳本,這里省略了ansible,python等的部署以及使用。
環境:
python 2.7
ansible 2.4.0
pexpect (pip installpexpect)
以下是批量分發密鑰登陸腳本內容:
#!/usr/bin/python27
""" Made by Joe.Wan Email:1272149624@QQ.com""" import sys import pexpect ip = ['10.1.1.10','10.1.1.13'] #這是ip列表,視情況修改 for x in ip: password='asss' #密碼需要視情況修改 expect_list = ['(yes/no)','password:'] p = pexpect.spawn('ssh-copy-id %s' % x) try: while True: idx = p.expect(expect_list) print p.before + expect_list[idx], if idx == 0: print "yes" p.sendline('yes') elif idx == 1: print password p.sendline(password) except pexpect.TIMEOUT: print >>sys.stderr,'timeout' except pexpect.EOF: print p.before print >>sys.stderr,'<the end>'
執行結果:

ok,將上面腳本修改下,弄成單個分發腳本:addhost.py
#!/usr/bin/python
import sys
import pexpect
ip = sys.argv[1]
password = 'password'
expect_list = ['(yes/no)', 'password:']
p = pexpect.spawn('ssh-copy-id %s' % ip)
try:
while True:
idx = p.expect(expect_list)
print p.before + expect_list[idx],
if idx == 0:
print "yes"
p.sendline('yes')
elif idx == 1:
print password
p.sendline(password)
except pexpect.TIMEOUT:
print >>sys.stderr, 'timeout'
except pexpect.EOF:
print p.before
print >>sys.stderr, '<the end>'
使用方法:python27 addhost.py 10.1.1.1
