2014-02-18 2 views
1

Я пишу скрипт python для запуска службы ntp на нескольких хостах и ​​виртуальных машинах ESXi и должен знать, подходит ли этот подход.Код python для запуска службы ntp на нескольких хостах ESXi и виртуальных машинах

  1. Сценарий читает хосты ESXi/виртуальные машины ipaddress, имя пользователя и пароль из файла конфигурации.

  2. Затем он пингует их и проверяет текущее состояние НТП после определения, является ли это ESXi машина или Linux машина (RedHat/CentOS/SuSE)

  3. Это будет взять резервную/и т.д./нтп .conf, изменить файл /etc/ntp.conf на всех машинах, чтобы занять время с общего сервера ntp и перезапустить службу ntp.

  4. Для хостов ESXi он откроет порт 123 брандмауэра, чтобы разрешить ntp-пакеты.

  5. Я использую модуль pexpect и pxssh для выполнения этого, так как мне не разрешено устанавливать парамико или какой-либо другой модуль .

  6. имя пользователя может быть пользователем root или ограниченным пользователем.

  7. Одна из проблем, у меня есть то, что у меня есть доступ суперпользователя ко всему ESXis но ограничен доступа к виртуальной машине, которые имеют SUSE Linux для этого я должен использовать pexpect/pxssh но я имею трудное время обучения регулярного выражения и выполнение задачи.

  8. Может кто-нибудь, пожалуйста, сообщите мне, если это правильный подход. Я вставил код , который проверяет статус 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) 
+0

Вы считали, что используете что-то вроде марионетки или шеф-повара? –

+0

Я должен использовать только python. Это не задание. Люди склонны использовать Python для этого. Кукольный и шеф-повар легко учиться? – anukalp

+0

Я не могу говорить для обучения шеф-повару, но марионетка не так уж трудно учиться, поскольку это скорее декларативный язык. Я просто узнаю о марионетке, чтобы я мог страдать от синдрома «Молот и гвоздь»;) –

ответ

2

Альтернативный вариант SSH (как это не всегда может быть включен для всех), вы можете использовать в Vsphere API для программного конфигурирования и запуска/остановки NTP. VMware недавно открытый исходный код их Vsphere SDK для привязки Python под названием pyvmomi (http://www.virtuallyghetto.com/2013/12/early-xmas-gift-from-vmware-pyvmomi.html) и вот быстрый пример, который показывает, как вы можете включить NTP службу для ESXi хоста: https://gist.github.com/lamw/9065097

образца предполагает, что вы направляете на VCENTER сервер, но может быть изменен, чтобы указать непосредственно на ESXi хоста (если он не является бесплатной версии)

Вот быстрый пробег образец:

питон start_ntp_sample.py -s vcenter55-1 -u -p корень xxxx -x vesxi55-1.primp-industries.com Запуск службы ntpd на vesxi55-1.primp-industries.com

+0

Привет, большое спасибо !!! Должен ли я установить SDK vSphere на отдельные хосты или он будет установлен по умолчанию? Я не знаю, как получить и установить SDK. Я могу установить PyVmomi на хост, откуда я буду запускать скрипт. – anukalp

+0

pyvmomi уже содержит привязки для подключения к API vSphere. Просто установите pyvmomi в систему, которая имеет доступ к вашей среде vSphere, и вы сможете запустить образец. Более подробную информацию о том, как использовать API vSphere, можно найти здесь http://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.pg.doc/PG_Preface.html – lamw

+0

Спасибо! Могу ли я прийти к вам, если у меня возникнут вопросы по использованию API? Если бы вы могли поделиться своим письмом. – anukalp

Смежные вопросы