Если коротко, то вы можете написать загрузчик для модулей, которые написаны не на питоне, а вообще на чем угодно. И в процессе загрузки транслировать это в понятный для питона код. А если подробней, то надо статью писать (уже работаю над этим).
Я конечно понимаю, что это все не серьезно, но в коде есть баг — обертка, возвращаемая add_this, должна восстанавливать прежнее значение this перед возвратом результата. Если этого не делать, то вызов метода с неявным this внутри другого такого же метода затрет this первого.
class C:
name = 'Alex'
@add_this
def say(phrase):
print("{} says: {}".format(this.name, phrase))
class Echo:
name = 'Echo'
@add_this
def say(c, phrase):
c.say(phrase)
print("{} says: {}".format(this.name, phrase))
c = C()
e = Echo()
e.say(c, "does it work?")
Выводит:
Alex says: does it work?
Alex says: does it work?
Вместо:
Alex says: does it work?
Echo says: does it work?
Что бы исправить, нужно переписать add_this вот так:
Перечитал еще раз второй пункт в вашем комментарии. Парсить JSON или INI при помощи awk — это ад. Изначально в Bash Booster применялся такой подход для Java Properties файлов. Работало не везде. Потому было решено использовать для этих целей Python, т.к. он работает всегда предсказуемо. Ну а раз впилили Python, заодно впилили поддержку INI, JSON и Yaml (если стоит PyYaml).
Для себя мы какое-то решение нашли, но иногда хочется взять что-то работающее, вместо допила домашнего костыля.
Почему бы вам не поделиться своим домашним костылем? Думаю можно было бы добавить в модуль read в качестве резервного варианта, если вдруг Python не установлен.
По первому вопросу. Вероятно, вы не уловили суть той части, где обновляется конфигурация nginx — перезагрузка веб сервера осуществляется по событию. Т.е. создается функция-обработчик события nginx-updated и эта функция вызывается только в том случае, если событие возникло. В чем здесь ценность? Скрипт делает ровно то что нужно: если конфигурация не обновлялась — нет смысла перезагружать сервис.
Представьте более сложный пример. У нас есть nginx, который отдает статику и проксирует запросы к серверу приложений uWSGI. Под uWSGI крутится несколько веб-сервисов на Python. Веб-сервисы используют MySQL. Настройки nginx, uWSGI, исходный код и конфиги веб-сервисов, а так же миграции модели базы данных лежат в одном репозитории с кодом.
Задача: сделать автоматический деплой всех обновлений, которые появляются в репозитории.
Какие действия возможны? Если изменились конфиги nginx — перезагрузить nginx. Если изменились конфиги uWSGI — перезагрузить uWSGI. Если изменились конфиги веб-сервисов — перезагрузить uWSGI. Если изменились исходники веб-сервисов — переустановить их в виртуальное окружение и перезагрузить uWSGI. Если изменилась модель — выключить uWSGI (нужен монопольный доступ к базе), выполнить миграцию, включить uWSGI.
Если попытаться написать этот скрипт без использования событий — получится лапша из операторов if, в которой уже через неделю сам автор без бутылки не разберется.
Это пример из жизни. Я не стал его использовать в статье, что бы не загружать читателя ненужными подробностями.
По второму вопросу. Я не вижу ничего криминального в использовании Python для чтения конфигов. Для каких целей это задумывалось? Есть приложение, которое использует базу данных. Логин/пароль от нее лежат в конфиге приложения. Нужно рядом положить скрипт, который периодически (через CRON) делает резервную копию базы. Что-то вроде:
Проблема: где взять username, password и databasename? Можно захардкодить, но тогда придется дублировать настройки, что не очень хорошо. А можно распарсить конфиг скриптом и взять оттуда нужные значения.
Я в своей работе чаще всего использую Ubuntu, Debian или CentOS. На всех из них Python есть. Насколько я знаю, во FreeBSD его нет, но он есть в портах. Из того, что мне приходит в голову, сложности могут возникнуть только с выполнением в Linux на роутере или холодильнике, но в данном случае у вас просто не будет возможности парсить конфиги. Все остальное будет работать без проблем.
Только что проглядел их сайт — за год многое изменилось.
Первое, что бросается в глаза, появилась возможность скачать готовую сборку под нужную платформу. Например, есть deb-пакеты под Ubuntu. Год назад их не было. Я, конечно, допускаю возможность, что плохо искал, но я их сайт в течении двух недель излазил вдоль и поперек. Если они и были, то прятали их очень хорошо. А про веселую инсталляцию руками я уже выше писал.
Второе, появился внятный пошаговый туториал для новичков. Этого тоже год назад не было. Было что-то вроде известной картинки «Как нарисовать филина».
выпилили wiki, который устарел и сбивал с толку
Я это и имел ввиду, когда сказал про плохую документацию. Если она устарела и на каждой странице написано «купите саппорт» — это разочаровывает.
Во-первых, документация написана маркетологами в стиле «Chef умеет вот так, купите платный саппорт и мы сделаем вам хорошо». Я конечно разобрался, но осадок остался.
Во-вторых, для установки Chef-solo нужен Ruby. В то время в репозиторях Ubuntu 12.04 был Ruby 1.8.4. Chef на нем заводится отказался без внятных сообщений об ошибках. На установленном через RVM, Ruby 2.1 (или 2.0 не помню точно версию) он заработал, но периодически падал опять же без внятных сообщений. Опытным путем удалось его завести на Ruby 1.9.х. Этого конечно можно было бы избежать, если бы не первый пункт.
В-третьих, будь я рубистом, я бы наверное жутко тащился бы от кукбуков на Ruby, но к сожалению я не рубист. Поэтому там где декларативная магия переставала работать и нужно было написать немного императивного кода, меня немного напрягал весьма экзотический синтаксис Ruby. Но это, конечно, вкусовщина.
Если использовать Chef на Amazon OpsWorks, где все инструменты уже интегрированы и нужно просто подсунуть нужные кукбуки, то таких проблем не возникает. И лично у меня осталось хорошее впечатление от него. Но для одиночных образов в Vagrant у меня нет желания его использовать.
Еще следует оговориться, что я не администратор, а программист. И мой девопсовский опыт был получен в тот момент, когда я ждал нового проекта, а в соседней команде не хватало инженера по развертыванию. В моей повседневной работе Chef и другие «большие» SCM системы — явный перебор. Все что мне нужно — это настроить виртуалку в Vagrant и положить настройки в репозиторий с кодом, чтобы от остальной команды никогда не слышать: «Не знаю, у меня все работает». Если вас Chef полностью устраивает, значит Bash Booster просто не для ваших задач.
От Chef выгодно отличается тем, что «я быстрей на баше напишу» становится еще быстрей.
Вообще мое субъективное мнение о Chef следующее: это крутая вещь, когда нужно централизованно развернуть парк серверов (8 и более) на том же Amazon. Но для управления парой-тройкой машин, его использование больше напрягает, чем помогает. Для этих целей этот велосипед и был изобретен. Я и мои коллеги успешно на нем ездим уже полгода и пока довольны.
Python используется только в модуле read для парсинга INI, JSON, Yaml и Java Properties файлов. Другие модули его не используют, так что зависимость опциональная.
Кроме того, если уж Python не установлен, то он всегда есть в стандартных репозиториях. Чего не скажешь о Ruby, который из коробки не установлен вообще, а в репозиториях часто лежит древняя версия, под которой половина новых пакетов уже не работает. Ну а, если очень хочется использовать Ruby, вы всегда можете прислать патч для модуля ext.
Выводит:
Вместо:
Что бы исправить, нужно переписать add_this вот так:
P.S. Да, мне говорили, что я зануда :)
Почему бы вам не поделиться своим домашним костылем? Думаю можно было бы добавить в модуль read в качестве резервного варианта, если вдруг Python не установлен.
Представьте более сложный пример. У нас есть nginx, который отдает статику и проксирует запросы к серверу приложений uWSGI. Под uWSGI крутится несколько веб-сервисов на Python. Веб-сервисы используют MySQL. Настройки nginx, uWSGI, исходный код и конфиги веб-сервисов, а так же миграции модели базы данных лежат в одном репозитории с кодом.
Задача: сделать автоматический деплой всех обновлений, которые появляются в репозитории.
Какие действия возможны? Если изменились конфиги nginx — перезагрузить nginx. Если изменились конфиги uWSGI — перезагрузить uWSGI. Если изменились конфиги веб-сервисов — перезагрузить uWSGI. Если изменились исходники веб-сервисов — переустановить их в виртуальное окружение и перезагрузить uWSGI. Если изменилась модель — выключить uWSGI (нужен монопольный доступ к базе), выполнить миграцию, включить uWSGI.
Если попытаться написать этот скрипт без использования событий — получится лапша из операторов if, в которой уже через неделю сам автор без бутылки не разберется.
Это пример из жизни. Я не стал его использовать в статье, что бы не загружать читателя ненужными подробностями.
По второму вопросу. Я не вижу ничего криминального в использовании Python для чтения конфигов. Для каких целей это задумывалось? Есть приложение, которое использует базу данных. Логин/пароль от нее лежат в конфиге приложения. Нужно рядом положить скрипт, который периодически (через CRON) делает резервную копию базы. Что-то вроде:
Проблема: где взять username, password и databasename? Можно захардкодить, но тогда придется дублировать настройки, что не очень хорошо. А можно распарсить конфиг скриптом и взять оттуда нужные значения.
Я в своей работе чаще всего использую Ubuntu, Debian или CentOS. На всех из них Python есть. Насколько я знаю, во FreeBSD его нет, но он есть в портах. Из того, что мне приходит в голову, сложности могут возникнуть только с выполнением в Linux на роутере или холодильнике, но в данном случае у вас просто не будет возможности парсить конфиги. Все остальное будет работать без проблем.
Первое, что бросается в глаза, появилась возможность скачать готовую сборку под нужную платформу. Например, есть deb-пакеты под Ubuntu. Год назад их не было. Я, конечно, допускаю возможность, что плохо искал, но я их сайт в течении двух недель излазил вдоль и поперек. Если они и были, то прятали их очень хорошо. А про веселую инсталляцию руками я уже выше писал.
Второе, появился внятный пошаговый туториал для новичков. Этого тоже год назад не было. Было что-то вроде известной картинки «Как нарисовать филина».
Я это и имел ввиду, когда сказал про плохую документацию. Если она устарела и на каждой странице написано «купите саппорт» — это разочаровывает.
А не могли бы вы привести пример чего-то сложного? Возможно, мне удастся убедить вас в обратном.
Во-первых, документация написана маркетологами в стиле «Chef умеет вот так, купите платный саппорт и мы сделаем вам хорошо». Я конечно разобрался, но осадок остался.
Во-вторых, для установки Chef-solo нужен Ruby. В то время в репозиторях Ubuntu 12.04 был Ruby 1.8.4. Chef на нем заводится отказался без внятных сообщений об ошибках. На установленном через RVM, Ruby 2.1 (или 2.0 не помню точно версию) он заработал, но периодически падал опять же без внятных сообщений. Опытным путем удалось его завести на Ruby 1.9.х. Этого конечно можно было бы избежать, если бы не первый пункт.
В-третьих, будь я рубистом, я бы наверное жутко тащился бы от кукбуков на Ruby, но к сожалению я не рубист. Поэтому там где декларативная магия переставала работать и нужно было написать немного императивного кода, меня немного напрягал весьма экзотический синтаксис Ruby. Но это, конечно, вкусовщина.
Если использовать Chef на Amazon OpsWorks, где все инструменты уже интегрированы и нужно просто подсунуть нужные кукбуки, то таких проблем не возникает. И лично у меня осталось хорошее впечатление от него. Но для одиночных образов в Vagrant у меня нет желания его использовать.
Еще следует оговориться, что я не администратор, а программист. И мой девопсовский опыт был получен в тот момент, когда я ждал нового проекта, а в соседней команде не хватало инженера по развертыванию. В моей повседневной работе Chef и другие «большие» SCM системы — явный перебор. Все что мне нужно — это настроить виртуалку в Vagrant и положить настройки в репозиторий с кодом, чтобы от остальной команды никогда не слышать: «Не знаю, у меня все работает». Если вас Chef полностью устраивает, значит Bash Booster просто не для ваших задач.
Вообще мое субъективное мнение о Chef следующее: это крутая вещь, когда нужно централизованно развернуть парк серверов (8 и более) на том же Amazon. Но для управления парой-тройкой машин, его использование больше напрягает, чем помогает. Для этих целей этот велосипед и был изобретен. Я и мои коллеги успешно на нем ездим уже полгода и пока довольны.
Кроме того, если уж Python не установлен, то он всегда есть в стандартных репозиториях. Чего не скажешь о Ruby, который из коробки не установлен вообще, а в репозиториях часто лежит древняя версия, под которой половина новых пакетов уже не работает. Ну а, если очень хочется использовать Ruby, вы всегда можете прислать патч для модуля ext.