Subscribe

Categories

Checkio.ORG

Subscribe to Posts

Email:

  • 22Jun


    Чем меньше рутины мы привносим в свою работу, тем больше она может приносить удовольствия.

    Сегодня я расскажу про автоматизированный деплойтинг в python. Это значит одной командой я могу залить на все продакшен сервера файлы, обновить на нем необходимые компоненты и перегрузить веб сервер, и наблюдать за этим откинувшись на кресле и попивать кофеек.

    Я Вам расскажу про Fabric(На момент написания статьи 0.9.1 — бала последняя стабильная версия), наиболее подходящий для этого инструмент, который делает все описанное и даже больше через ssh.

    Про установку рассказывать особо нечего, pip отлично справляется с этим.

    В корень своего проекта я кладу fabfile.py, в этом файле и будут храниться все процедуры для работы с Fabric. Ниже приведу небольшой пример скрипта, который будет архивировать наш проект, заливать его на сервер и там разархивировать.

    1. from fabric.api import *
    2. env.hosts = ['oduvan@lyabah.com']
    3.  
    4. def deploy():
    5.     local('tar czf /tmp/my_project.tgz .')
    6.     put('/tmp/my_project.tgz', '/tmp/')
    7.     with cd('/home/oduvan/www/test_fab/'):
    8.         run('tar xzf /tmp/my_project.tgz')

    Если у Вас все получилось, а я очень надеюсь, что с этим хостом и именем пользователя ни у кого кроме меня получиться ничего не может (так что поменяйте свою строку конекта во второй строке), то вы можете увидеть что-то сильно напоминающее вот это:

    1. $ fab deploy
    2. [localhost] run: tar czf /tmp/my_project.tgz .
    3. Password for oduvan@lyabah.com:
    4. [oduvan@lyabah.com] put: /tmp/my_project.tgz -> /tmp/my_project.tgz
    5. [oduvan@lyabah.com] run: tar xzf /tmp/my_project.tgz
    6. [oduvan@lyabah.com] err: tar: ./fabfile.pyc: time stamp 2010-06-21 10:03:41 is 4.461083597 s in the future
    7. [oduvan@lyabah.com] err: tar: .: time stamp 2010-06-21 10:03:41 is 4.460804762 s in the future
    8.  
    9. Done.
    10. Disconnecting from lyabah.com… done.

    Само собой, пароль у вас спросят и его необходимо будет ввести, в конце статьи я выложу свой пароль к ссш, чтоб вы могли протестить работу.

    Кому лень вводить пароли могу добавить после второй сроки
    env.password = ‘oh_its_my_real_password’

    либо сгенерить себе файл с ссш ключом и путь к нему положить в
    env.key_filename — в отличие и пароля тут может быть передан массив ключей

    Но и этот код можно сократить. У Fabric есть contrib libs, одна из них project. Тут подробно каждую я описывать не буду, просто покажу пример с одной из них, дабы просто показать, что они есть

    1. from fabric.api import *
    2. from fabric.contrib.project import rsync_project
    3. env.hosts = ['oduvan@lyabah.com']
    4.  
    5. def deploy():
    6.     local('python manage.py test', capture=False)
    7.     rsync_project('/home/oduvan/www/test_fab/','.')

    как видите наш код сократился до одной команды, не считая команду для тестирования Django проекта, ведь если какая-то команда возвратит ошибочный статус, то выполнения прекратится, а значит если тесты не проходят загрузка не начинается. Дополнительный параметр capture говорит о том, что необходимо скрывать выходные данные команды, мы эту опцию отключаем.

    Вот основные команды, которые Вам необходимо знать, чтоб свободно пользоваться Fabric

    put — копировать файл с локальной машины на удаленную. Доп параметр mode — устанавливает права на файл, см chmod
    get — копировать файл с удаленной на локальную
    local — выполнить команду на локальной машине. Доп параметр capture — скрывать выходные данные, по умолчанию False
    run — выполнить команду на удаленной машине
    sudo — выполнить команду на удаленной машине через судо. Доп параметр user — указываем имя пользователя, под которым необходимо запустить команду

    Обратите внимание, что у нас есть команда sudo, а значит при необходимости, мы можем и сервак зарелоадить и вообще сделать любые админ вещи, главное, чтоб пользователь был в судоерсах.

    Для деплойтинга на несколько серверов, причем различной конфигурации, и роли – у Fabric тоже кое-что припасено.

    1. from fabric.api import *
    2. from fabric.contrib.project import rsync_project
    3. env.roledefs =  {'web':['oduvan@lyabah.com','oduvan@dev.lyabah.com'],
    4.         'db':['oduvan@db1.lyabah.com','oduvan@db2.lyabah.com'],
    5.         'media':['oduvan@media@lyabah.com'],
    6.         }
    7.  
    8. @roles('web')
    9. def deploy():
    10.     rsync_project('/home/oduvan/www/test_fab/','.')

    в этом примере заливка файлов будет идти сразу на 2 вебовых сервака. Как видите вы можете запланировать у себя роли отдельных серверов под БД, под медиа файл и т.д.

    кроме как декоратаром роль можно указывать и при запуске процедуры

    1. $ fab deploy -R web

    Иногда в момент или во время запуска необходимо передать данные скрипту.

    В момент запуска это делается через аргументы самой функции

    к примеру если у вас

    1. def deploy(arg1,arg2):
    2.     pass

    то эти 2 аргумента можно передать как

    1. $fab deploy:'HI','HO'
    2. $ fab deploy:'HI',arg2='HO'
    3. $ fab deploy:arg1='HI',arg2='HO'

    Либо спросить что-то во время работы функции у пользователя функцией
    prompt(text, key=None, default=”, validate=None)

    Задает вопрос пользователю с текстом text, если пользователь не вводит данные, то возвращает значение из default, предварительно отчищая его функцией validate, и возвращает как результат этой функции, если не передан key, иначе кладет значение в env[key]

    А теперь примеры функций деплойтинга из реальной жизни, которые вы можете написать и у себя в проекте:

    bounce_wsgi_procs — зарелоадить wsgi через touch в него
    deploy_media — загружаем только медиа файлы
    migrate — запускаем скрипт миграции через South
    update_repositories – обновляем репозитарии
    update_dependencies — устанавливаем зависимости
    reload_nginx — перегружаем nginx
    deploy — полная установка, последовательный запуск всех этих функций.

    Подводя итоги могу сказать, что Fabric должна стать musthave tool в разработке.

    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

  • 04Jun

    Сложные выборки. Например, какая-то страница результатов. Там где много-много фильтров, + еще какие-то сортировки появились + все это надо прогнать через пейджирование. Выглядит страшно, но тем не менее задача банальная. Меня в этой задаче больше всего расстраивает шаманство с урлами. Ведь по факту Вам все эти параметры выборки надо уместить в урл, и каждой функции, например, смены страницы или смены направления сортировки — надо переформировать ссылку.

    Через несколько минут у меня появился тег, который как всегда выношу на Ваш суд. Перед просмотром исходников, покажу, как он работает:

    1. <html>
    2.     {% load djoutils_tags_url %}
    3.     <head></head>
    4.     <body>
    5.         <div > Ordering:
    6.         <a href="?{% urlupget request.GET order="name",up=1%}">Name UP</a>
    7.         <a href="?{% urlupget request.GET order="name",up=0%}">Name Down</a>
    8.  
    9.         <a href="?{% urlupget order="lastname",up=1%}">Last Name UP</a>
    10.         <a href="?{% urlupget order="lastname",up=0%}">Lase Name  Down</a>
    11.     </div>
    12.     <div>
    13.         Paging:
    14.        <a href="?{% urlupget page=1 %}">1</a>
    15.        <a href="?{% urlupget page=2 %}">2</a>
    16.        <a href="?{% urlupget page=3 %}">3</a>
    17.  
    18.     </body>
    19. </html>

    тут мне уже не нужно думать, о том, как сформировать урл, я просто знаю, что эта ссылка пейджирования должна просто изменить параметр пейдж и все, весь остальной урл доформировывается отталкиваясь от текущего.

    Исходники чуда тега можно увидеть тут.

    Пока в голове крутится одна проблема, не очень актуальная но тем не менее. По средствам этого тега пока нельзя сформировать урл, который удалит один параметр из текущего урла.

    Rating 3.00 out of 5
    [?]

   

Recent Posts

Recent Comments

  • Почему-то признаки такой "застенчивости" в рунете преобладаю...
  • >и пишеш стать>пишешОбманчивая самоуверенность...
  • Установщик макоси не видит жёсткий диск :(...
  • Когда будет 2я часть статьи? Хотелось бы почитать!...
  • Голоса пользователей. Питон красивый язык, а красоту может о...