Я пишу скрипт python для запуска службы ntp на нескольких хостах и виртуальных машинах ESXi и должен знать, подходит ли этот подход.Код python для запуска службы ntp на нескольких хостах ESXi и виртуальных машинах
Сценарий читает хосты ESXi/виртуальные машины ipaddress, имя пользователя и пароль из файла конфигурации.
Затем он пингует их и проверяет текущее состояние НТП после определения, является ли это ESXi машина или Linux машина (RedHat/CentOS/SuSE)
Это будет взять резервную/и т.д./нтп .conf, изменить файл /etc/ntp.conf на всех машинах, чтобы занять время с общего сервера ntp и перезапустить службу ntp.
Для хостов ESXi он откроет порт 123 брандмауэра, чтобы разрешить ntp-пакеты.
Я использую модуль pexpect и pxssh для выполнения этого, так как мне не разрешено устанавливать парамико или какой-либо другой модуль .
имя пользователя может быть пользователем root или ограниченным пользователем.
Одна из проблем, у меня есть то, что у меня есть доступ суперпользователя ко всему ESXis но ограничен доступа к виртуальной машине, которые имеют SUSE Linux для этого я должен использовать pexpect/pxssh но я имею трудное время обучения регулярного выражения и выполнение задачи.
Может кто-нибудь, пожалуйста, сообщите мне, если это правильный подход. Я вставил код , который проверяет статус ntp. У меня есть еще один хромовый код, но я не вставляю его здесь, чтобы предотвратить загромождение.
Формат конфигурационного файла: [хозяин] serverip1 = 10.10.10.10, имя пользователя, password1, password2 serverip2 = 10.10.10.11, имя пользователя, password1, password2 , если имя пользователя не является корневым мне нужно принять пароль root также для выполнения административных команд.
Код:
def checkntpstatus(hostlist, logger):
"""This function checks the ntp status
"""
for host in hostlist:
try:
ssh = pxssh.pxssh()
ssh.login(host.ipaddress, host.username, host.password1)
if host.ostype == 'esxlinux':
ssh.sendline('/etc/init.d/ntpd status')
ssh.prompt()
logger.info(host.ipaddress + " : ")
logger.info(ssh.before)
elif host.ostype == 'suse' and host.username == 'root':
ssh.sendline('service ntp status')
ssh.prompt()
logger.info(host.ipaddress + " : ")
logger.info(ssh.before)
elif host.ostype == 'suse' and host.username == 'restricted':
ssh.sendline('sudo service ntp status')
response = ssh.expect(r'(?i)password:')
logger.info("Using root's password for : " + \
host.ipaddress)
ssh.sendline(host.password2)
ssh.prompt()
logger.info(host.ipaddress + " : ")
logger.info(ssh.before)
except pxssh.ExceptionPxssh as exception:
logger.info("Failed to ssh or" +
" match login prompt " +
host.ipaddress + " " + str(exception))
finally:
ssh.logout()
def findostype(hostlist, logger):
"""ping the host and findout the operating system type
"""
for host in hostlist:
if not pinghost(host.ipaddress, logger):
logger.info("probing host : " + host.ipaddress)
try:
ssh = pxssh.pxssh()
ssh.login(host.ipaddress, host.username, host.password1)
ssh.sendline("vmware -v")
ssh.prompt()
regexp1 = re.compile(r'command not found')
regexp2 = re.compile(r'(?i)suse')
regexp3 = re.compile(r'(?i)redhat')
regexp4 = re.compile(r'(?i)centos')
if regexp1.search(ssh.before) == None:
host.ostype = 'esxlinux'
else:
ssh.sendline('python -c "import platform; print \
platform.dist()"')
ssh.prompt()
if regexp2.search(ssh.before):
host.ostype = 'suse'
elif regexp3.search(ssh.before):
host.ostype = 'redhat'
elif regexp4.search(ssh.before):
host.ostype = 'centos'
except pxssh.ExceptionPxssh as exception:
logger.info("Failed to ssh or" +
" match login prompt " +
host.ipaddress + " " + str(exception))
finally:
ssh.logout()
else:
logger.info("Failed to ping host : " + host.ipaddress)
Вы считали, что используете что-то вроде марионетки или шеф-повара? –
Я должен использовать только python. Это не задание. Люди склонны использовать Python для этого. Кукольный и шеф-повар легко учиться? – anukalp
Я не могу говорить для обучения шеф-повару, но марионетка не так уж трудно учиться, поскольку это скорее декларативный язык. Я просто узнаю о марионетке, чтобы я мог страдать от синдрома «Молот и гвоздь»;) –