Поиск по сайту:

Как использовать Fabric для автоматизации задач администрирования и развертывания


Введение

Давайте автоматизировать вещи. Все.

Давайте также найдем способ сделать это с помощью одного инструмента. Тот, который легко программируется, прост в использовании. И почему бы не сделать все это, не установив на удаленной машине ничего, кроме SSH — все команды записываются в одном месте для локального выполнения или на любом количестве различных серверов.

Разве это не звучит блестяще и потрясающе? Мы согласны.

В этой статье DigitalOcean наша тема — Fabric[системная] библиотека для администрирования и оптимизации развертывания приложений. Мы узнаем, как установить этот замечательный инструмент, и увидим, насколько простыми могут стать вещи, просто автоматизировав рутинные задачи управления, которые в противном случае потребовали бы прыжков через обручи с помощью bash-хаков и сложных в обслуживании сложных сценариев.

Глоссарий

1. Что такое ткань?

  1. Fabric и язык программирования Python
  2. Администрирование системы/сервера
  3. Развертывание приложения

2. Как установить Fabric на дроплет под управлением Ubuntu/Debian

3. Возможности Fabric и интеграция с SSH

  1. выполнить (fabric.operations.run)
  2. sudo (fabric.operations.sudo)
  3. local (fabric.operations.local)
  4. получить (fabric.operations.get)
  5. вставить (fabric.operations.put)
  6. приглашение (fabric.operations.prompt)
  7. перезагрузить (fabric.operations.reboot)

4. Помощники Fabric: менеджеры контекста

  1. cd (fabric.context_managers.cd)
  2. ЖК (fabric.context_managers.lcd)
  3. путь (fabric.context_managers.path)
  4. настройки (fabric.context_managers.settings)
  5. префикс (fabric.context_managers.prefix)

5. Пример fabfile для автоматизации задач управления

Что такое ткань?

Fabric — это библиотека Python (т. е. инструмент для построения на), используемая для взаимодействия с SSH и компьютерными системами [легко] для автоматизации широкого круга задач, от развертывания приложений до общего системного администрирования.

Хотя он основан на Python, это не означает, что он используется исключительно для работы с другими приложениями или инструментами Python. На самом деле, Fabric позволяет вам добиться чего угодно, независимо от конкретного языка или системы. Пока выполняются самые основные требования, вы можете воспользоваться этой превосходной библиотекой.

Скрипты Fabric — это базовые файлы Python. Они запускаются с помощью инструмента fab, который поставляется вместе с Fabric. Все это включает (т.е. import ..) ваш скрипт (т.е. инструкции для выполнения) и выполняет предоставленную процедуру.

Скажите «Привет, Фаб!» с помощью Fabric (fabfile.py):

# def hello(who="world"):
#    print "Hello {who}!".format(who=who)
    
$ fab hello:who=Fab
Hello Fab!

Ткань и язык программирования Python

Как мы кратко упомянули выше, хотя Fabric можно использовать в очень большом количестве сценариев, это библиотека на основе Python, и fabfile необходимо программировать с использованием языка программирования Python.

Независимо от вашего опыта работы с любым другим языком программирования (включая Python), изучая наши статьи о Fabric, вы узнаете, как работать с этим инструментом, и вам не потребуется много времени, чтобы увидеть, насколько он прост и прекрасен.

Python — чрезвычайно популярный, широко распространенный язык программирования общего назначения (т. е. не созданный для решения конкретной задачи). Его легко отличить по важности, которую он придает читабельности и простоте кода. Чтобы понять Python, ознакомьтесь с очень кратким руководством по стилю Python Enhancement Proposal (PEPs) 20 для кода Python.

Чтобы иметь общее представление о том, на что может быть похоже программирование на Python, вы можете прочитать несколько замечательных статей, перечисленных в Руководстве по Python для начинающих.

Администрирование системы/сервера

Одной из ключевых областей использования Fabric является автоматизация повседневных задач системного (и серверного) администрирования. Эти работы включают практически все, что касается:

  • Создание сервера;
  • Его обслуживание и;
  • Мониторинг.

Когда вы начнете работать со своим собственным дроплетом (который представляет собой полноценный виртуализированный сервер с полным контролем/доступом), вещи, которые кажутся загадкой, быстро станут для вас знакомыми. Когда вы развертываете свои приложения и начинаете заниматься их обслуживанием, вполне естественно ожидать, что вы столкнетесь с некоторыми проблемами. Однако, когда ваше приложение набирает популярность и вещи начинают расти, необходимость управлять несколькими дроплетами и повторять все снова и снова перестает быть развлечением.

Именно тогда вы пожалеете, что не встретили Фабрику много лет назад.

Развертывание приложения

Развертывание приложения (независимо от того, веб-сайт это, API или сервер) обычно означает настройку системы с нуля (или из снимка, сделанного во времени), подготовку ее путем обновления всего, загрузку зависимостей, настройку файла структуру и разрешения, а затем, наконец, загрузите свою кодовую базу или загрузите ее с помощью SCM, такого как Git.

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

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

Именно тогда вам на помощь приходит Fabric в виде файла Python, который будет знать, что делать и где это делать.

Как установить Fabric на дроплет под управлением Ubuntu/Debian

Простым и последовательным способом установки Fabric является использование диспетчера пакетов операционной системы по умолчанию aptitude.

Чтобы установить Fabric с помощью aptitude, выполните следующее:

sudo aptitude install fabric

# Alternatively, you can also use *pip*:
# pip install fabric

Возможности Fabric и интеграция с SSH

Из коробки любая команда Python (или процедура) и модуль могут быть использованы через Fabric, учитывая, что Fabric действительно является библиотекой Python.

Что Fabric действительно предлагает, так это обширную и превосходную интеграцию с SSH, которая позволяет оптимизировать все с помощью простых скриптов (например, fabfile.py).

В этом разделе вы можете найти набор инструментов (например, функций), поставляемых с Fabric, которые можно использовать для взаимодействия со средами, в которых выполняются указанные вами команды.

Примечание. Вы можете увидеть и узнать больше об операциях Fabric, посетив его документацию по этому вопросу.

запустить (fabric.operations.run)

Процедура Fabric run используется для выполнения команды оболочки на одном или нескольких удаленных хостах.

  • Выходные результаты run можно получить с помощью переменной.
  • Если команда выполнена успешно или неудачно, можно проверить с помощью .failed и .succeeded.

Примеры использования:

# Create a directory (i.e. folder)
run("mkdir /tmp/trunk/")

# Uptime
run("uptime")

# Hostname
run("hostname")

# Capture the output of "ls" command
result = run("ls -l /var/www")

# Check if command failed
result.failed

судо (fabric.operations.sudo)

Наряду с run наиболее часто используемой командой Fabric является, вероятно, sudo. Он позволяет выполнять заданный набор команд и аргументов с привилегиями sudo (т. е. суперпользователя) на удаленном хосте.

Если команда sudo используется с явно указанным пользователем, выполнение будет происходить не как root, а под другим пользователем (т.е. UID 1010).

Примеры использования:

# Create a directory
sudo("mkdir /var/www")

# Create a directory as another user
sudo("mkdir /var/www/web-app-one", user="web-admin")

# Return the output
result = sudo("ls -l /var/www")

локальный (fabric.operations.local)

Как мы упоминали во введении, один сценарий Fabric (fabfile) может использоваться для выполнения действий как на локальном компьютере, так и на удаленных системах. Для этой цели Fabric предоставляет оператор local для локального запуска команд.

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

Локальные помощники, такие как диспетчер контекста lcd (который используется для установки локального рабочего каталога), уважаются с local, точно так же, как run (или sudo) учитывает диспетчер контекста cd.

Примеры использования:

# Create a source distribution tar archive (for a Python App.)
local("python setup.py sdist --formats=gztar", capture=False)

# Extract the contents of a tar archive
local("tar xzvf /tmp/trunk/app.tar.gz")

# Remove a file
local("rm /tmp/trunk/app.tar.gz")

получить (ткань.операции.получить)

Команда get предназначена для загрузки (т. е. извлечения) файлов из удаленной системы на компьютер, на котором используется Fabric. Это похоже на то, как работает scp, и пригодится, когда вам нужно загрузить резервные копии, данные журнала или некоторые другие элементы, связанные с сервером.

  • Вы можете указать удаленный путь с помощью аргумента remote_path.
  • Вы можете указать локальный путь загрузки с помощью аргумента local_path.

Примеры использования:

# Download some logs
get(remote_path="/tmp/log_extracts.tar.gz", local_path="/logs/new_log.tar.gz")

# Download a database back-up
get("/backup/db.gz", "./db.gz")

поставить (ткань.операции.пут)

Когда вам нужно загрузить файлы, команду put можно использовать очень похоже на get. Вы снова можете получить доступ к результатам выполнения команды с помощью .failed или .succeeded.

  • local_path — укажите локальный путь.
  • remote_path — указать удаленный путь.
  • use_sudo — загрузите файл в любое место на удаленной машине, используя изящный трюк: загрузите во временное место, а затем переместите.
  • mode - установить режим файла (флаги).
  • mirror_local — автоматически устанавливает флаги файла (т. е. делает его исполняемым), считывая режим локального файла.

Примеры использования:

# Upload a tar archive of an application
put("/local/path/to/app.tar.gz", "/tmp/trunk/app.tar.gz")

# Use the context manager `cd` instead of "remote_path" arg.
# This will upload app.tar.gz to /tmp/trunk/
with cd("/tmp"):
    put("local/path/to/app.tar.gz", "trunk")

# Upload a file and set the exact mode desired
upload = put("requirements.txt", "requirements.txt", mode=664)

# Verify the upload
upload.succeeded

приглашение (fabric.operations.prompt)

Когда вам понадобится дополнительная гибкость при работе с Fabric, prompt придет вам на помощь. Эта команда делает именно то, что предполагает ее название, и просит пользователя (то есть того, кто запускает скрипт) ввести определенные данные для использования во время последовательного выполнения.

Например, если вы используете один файл для управления несколькими приложениями, вы можете использовать prompt, чтобы настроить одно из них для выполнения действий.

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

Примеры использования:

# Prompt the user
port_number = prompt("Which port would you like to use?")

# Prompt the user with defaults and validation
port_number = prompt("Which port?", default=42, validate=int)

перезагрузка (fabric.operations.reboot)

Команда reboot также не требует пояснений: она используется для перезагрузки удаленной системы. По умолчанию он ждет две минуты (т. е. 120 секунд -> wait=120), прежде чем выполнить свою работу.

Примеры использования:

# Reboot the remote system
reboot()

# Reboot after 30 seconds
reboot(wait=30)

Помощники Fabric: менеджеры контекста

менеджеры контекста Fabric используются с оператором Python with. Причина этого в том, что сеансы между выполнением команд не сохраняются между соединениями без оболочки.

Примечание. Вы можете увидеть и узнать больше о менеджерах контекста Fabric, посетив его документацию по этому вопросу.

компакт-диск (fabric.context_managers.cd)

Контекстный менеджер cd позволяет сохранять состояние каталога (т.е. где должен выполняться следующий блок комментариев). Это похоже на запуск команды cd во время сеанса SSH и выполнение различных команд.

Примеры использования:

# The *cd* context manager makes enwrapped command's
# execution relative to the stated path (i.e. "/tmp/trunk")
with cd("/tmp/trunk"):
    items = sudo("ls -l")

# It is possible to "chain" context managers
# The run commands gets executed, therefore at "/tmp/trunk"
with cd("/tmp"):
    with cd("/trunk"):
        run("ls")

жк (fabric.context_managers.lcd)

Контекстный менеджер lcd (локальный cd) работает очень похоже на предыдущий (cd); однако это влияет только на состояние локальной системы.

Примеры использования:

# Change the local working directory to project's
# and upload a tar archive
with lcd("~/projects/my_project"):
    print "Uploading the project archive"
    put("app.tar.gz", "/tmp/trunk/app.tar.gz")

путь (fabric.context_managers.path)

Менеджер контекста path изменяет переменную PATH.

настройки (fabric.context_managers.settings)

Когда вам нужно временно (т.е. для определенной цепочки команд), вы можете использовать оператор settings (т.е. переопределить значения env).

Примеры использования:

# Perform actions using a different *user*
with settings(user="user1"):
    sudo("cmd")

префикс (fabric.context_managers.prefix)

Оператор prefix делает то, что следует из его названия, и оборачивает данные команды run и sudo в указанную команду.

Примеры использования:

with prefix("cmd arg."):
    run("./start")
# cmd arg. && ./start

Пример fabfile для автоматизации задач управления

Чтобы начать изучать, как программировать fabfile для автоматизации простой задачи управления, давайте создадим пустой fabfile.py.

Выполните следующую команду, чтобы создать fabfile.py с помощью текстового редактора nano:

nano fabfile.py

Добавьте следующий блок кода, обновляющий систему и устанавливающий memcached:

# Fabfile to:
#    - update the remote system(s) 
#    - download and install an application

# Import Fabric's API module
from fabric.api import *


env.hosts = [
    'server.domain.tld',
  # 'ip.add.rr.ess
  # 'server2.domain.tld',
]
# Set the username
env.user   = "root"

# Set the password [NOT RECOMMENDED]
# env.password = "passwd"

def update_upgrade():
    """
        Update the default OS installation's
        basic default tools.
                                            """
    run("aptitude    update")
    run("aptitude -y upgrade")

def install_memcached():
    """ Download and install memcached. """
    run("aptitude install -y memcached")

def update_install():

    # Update
    update_upgrade()
    
    # Install
    install_memcached()

Сохраните и выйдите с помощью CTRL+X и подтвердите с помощью Y.

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

# Automate everything!
fab update_install

Прислано: