Как стать автором
Обновить

Комментарии 17

Хорошая статья, респект. Мы используем у себя rancid + cvsweb.
Несколько замечаний по стилю, если позволите:

1. Будьте готовы к тому что в более свежие версии интерпретатора будут ругаться на конструкции print «bla-bla». print — это функция.
2. «system backup save name=» + str(host) + "_" + str(Version) + ".backup" = «system backup save name={}_{}.backup».format(host, Version).
3. Убойная конструкция
# hosts array IP1, IP2, IP3
hosts = ( «1.2.3.4», «5.6.7.8», «9.10.11.12»)
# username
users = ( «user1», «user2», «user3»)
iterUser = iter(users)
# userpassword
passwords = ( «pass1», «pass2», «pass3» )
iterPassword = iter(passwords)
for host in hosts:
print "\n" + str(host)
# iterate through user-password pairs
user = iterUser.next()
Password = iterPassword.next()

легко и просто заменяется на
creds = ((«1.2.3.4», «user1», «pass1»), («1.2.3.3», «user2», «pass2»), («1.2.3.5», «user3», «pass3») )
for (host, user, pass) in creds:



имхо, Python — очень красивый и лаконичный язык, если уметь его готовить. :)
тогда уж:

hosts = { '1.2.3.4': { 'user': 'user1', 'password': 'password1'},… }
Ну это уж на вкус и цвет, кому как больше нравится.
Имхо, довольно многословно получится в итоге. Особенно, когда в теле цикла начнете обращаться к значениям.
В итоге у автора получится fabric :)
Вообще говоря, для такой задачи Python — это оверкилл. Все тоже самое довольно легко делается на шелл-скриптах. Но в качестве упражнения и демонстрации работы с paramiko — вполне неплохо.
Насчет более свежих версий интерпретатора имеется в виду версия 3.х? Просто я писал в 2.7 — вроде как последняя на сегодняшний день версия, устанавливаемая по дефолту.
Второй пункт пожалуй дело вкуса, мне удобнее наблюдать параметры по ходу следования строки, хотя, согласен, возможно этот стиль написания кода и неправославен.
Абсолютно согласен насчет итераторов, приведу в божеский вид на один трехмерный массив обязательно.
Самому не понравилась конструкция в собственном исполнении, но поэтому в топике указал — "… есть небольшой навык..."
Строго говоря, print() или print — это дело вкуса, ибо на этот счет нет никаких строгих рекомендаций. Лично я предпочитаю писать код по возможности совместимый с веткой 3.x, чтобы лишний раз не пользоваться 2to3.py.

По поводу конкатенации строк. Согласен, дело вкуса, но FYI .format объективно работает в 1,5 раза быстрее чем просто + и явно эффективнее по памяти. В данном конкретном случае это, конечно, не имеет никакого значения.

Не сочтите за предновогодний наезд. Статья вполне себе полезная, была бы карма — плюсанул бы :)
Большое спасибо, я адекватно воспринял все замечания. Более того, очень хотелось прочитать как бы тотже функционал реализовал кто-то более опытный.
С наступающим!
«Лично я предпочитаю писать код по возможности совместимый с веткой 3.x»
Разве 2.* форк уже перестаёт быть де-факто стандартом?
(без иронии, в практических целях интересно — да, я слышал, что скажем, следующая версия Django будет утилизировать 3.*, но реально, как мне кажется, большинство софта всё ещё использует 2.*, даже скажем не во всех пуританских дистрибутивах Linux ещё стоит 2.7.*.)

з.ы. print как функция вместо кейворда — лично я считаю худшим нововведением 3 версии Питона. :( Я люблю этот язык не в последнюю очередь за лаконичность его средств, а лишняя пара скобочек, которую придётся теперь дописывать к зачастую часто используемому оператору — противоречит этой концепции.
Ситуация с переходом между ветками 2.x и 3.х — это замкнутый круг. Python 3.x значительно лучше и продуманнее, но из-за того что он менее развит в отношении кодовой базы (т.е. библиотек и программ) народ предпочитает писать софт под 2.х, что в свою очередь тормозит развитие 3.х. Короче говоря, какую ветку использовать пусть каждый решает сам за себя. Лично я стараюсь делать свой код как можно более совместимым, чтобы избежать головной боли когда наконец настанет светлое будущее и поддержка 2.x будет официально дропнута везде.

Разного рода пуританские Linux-дистрибутивы — это вообще постоянный источник проблем когда возникает необходимость установить софт чем более свежий чем окаменелые фекалии мамонта. Благо Python позволяет себя устанавливать в отдельное окружение без глубокой интеграции в систему и собирать пакеты руками через pip или easy_install — был бы gcc и необходимые библиотеки. Конечно, это не так удобно как простой вызов yum (и иже с ним) но это вполне приемлимый способ, на мой взгляд.

Использование print как функции с другой стороны дает определенные преимущества (правда, как мне кажется несколько сомнительные), как, например, возможность передачи ее куда-либо в качестве callable-параметра т.п.
посмотрите в сторону fabric, оно как-раз для подобных случаев заточено
Всего два вопроса (как я понимаю, Вы администратор этого зоопарка):
— как часто без Вашего ведома происходит изменение конфигурации оборудования?.. пример: имею небольшой парк роутербордов с микротиком на борту. После каждого изменения в конфигурации делаю копию. Это привычка\правило\аксиома. Измениться конфигурация может автоматически только в направлении блокировки\разблокировки какого-либо правила. Все!
— Вы написали, что:

«По сути задачу это решало, но если у меня несколько десятков единиц оборудования, нащелкивать копипасту по каждому экземпляру — это не по Фен-Шую.»

что мешает написать скрипт, который «скопипастит» это за Вас?
В целом способ имеет право на жизнь, нажал плюс — но обломал кармометр. :)

P.S. сам был неприятно удивлен, когда узнал про аплоад только по ftp.
Да, дело как-раз таки в том, что я не единственный администратор этого как вы выразились «зоопарка», поэтому о некоторых изменениях я узнаю по факту изменения/поломки. Кроме того — у меня их на самом деле много — несколько десятков.
Копипастить скрипт на каждую железку другим скриптом… дело вкуса, но мне кажется маршрутизатор должен заниматься маршрутизацией, а не слежением за своей резервной копией. Еще стараюсь придерживаться правила do it with less administrative effort.
На самом деле было бы интересно взглянуть на вашу версию решения этой задачи — вполне можно совмещать оба подхода.
Делал тоже самое на перле
sysadminblog.ru/blog/linux/139.html
Только добавил еще, чтобы св конце скрипт посылал отчет, кого сбекапил, кого не смог, на всякий случай
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации