Проверить доступность файлового ресурса ssh python 2.7

240 просмотра
0
0 Комментариев

Как лучше проверить доступность файлового ресурса на нескольких хостах, доступных по ssh, на Python 2.7 и в случае необходимости создать там директории?


Добавить комментарий

2 Answers

Python Опубликовано 09.12.2018
0

Я бы воспользовался готовыми продуктами типа ansible или fabric, которые кстати тоже написаны на Python

У меня есть опыт работы с Ansible — очень мощный и гибкий инструмент.

Но если так необходимо реализовать самому и в питоне, то я бы посоветовал воспользоваться модулем Paramiko, который специально для этого создан. Кстати, и Ansible и Fabric используют Paramiko…

здесь и здесь можно найти примеры использования

Добавить комментарий
0

и в случае необходимости создать там директории?

Просто попытайтесь создать директорию, например, используя fabric модуль, упомянутый @MaxU:

from fabric.api import env, run, quiet
 
env.use_ssh_config = True
 
def mkdir(dirpath):
    with quiet():
        return run('mkdir ' + dirpath)

Пример:

$ fab mkdir:/путь/к/папке -H host1,host2

Эта команда пытается создать конечную директорию /путь/к/папке на узлах host1 и host2 параллельно. Благодаря use_ssh_config, можно использовать имена ssh хостов, перечисленных в конфиге таком как ~/.ssh/config файле на локальной машине (чтобы ssh-ключи, имена пользователя, другие опции автоматом для соответствующих имён подбирались).

По умолчанию, fabric печатает вывод команды и прекращает выполнение, если команда завершилась с ошибкой—quiet() используется, чтобы работа продолжалась даже если mkdir вернул ошибку (например, потому что директория уже существует). Чтобы создать промежуточные директории, можно -p параметр передать.

Не обязательно, fab утилиту запускать, fabric можно использовать как библиотеку:

# -*- coding: utf-8 -*-
from fabric.api import execute
from fabric.network import disconnect_all
 
dirpath = u"/путь/к/папке"
try:
    created_dir = execute(mkdir, dirpath, hosts=["host1", "host2"]).succeeded
finally:
    disconnect_all()

где mkdir() определена в предыдущем примере. disconnect_all() закрывает ssh соединения к узлам.

Чтобы просто проверить существование удалённого файла, можно вызвать fabric.contrib.files.exists().

Если вам не нужны возможности, предоставляемые fabric, то можно использовать paramiko библиотеку напрямую (fabric реализован в терминах paramiko). paramiko предоставляет гораздо более низкоуровневое API. Вот пример кода как записать данные в удалённый файл, создавая промежуточные директории, если необходимо, используя paramiko.

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up