Использование Chef-solo для настройки приложения Django в Ubuntu

Есть много способов автоматизировать процесс установки и настройки бокса. По любой причине, если вся наша система на данный момент состоит из одного блока, настройка полной инфраструктуры SCM (Software Configuration Management) является излишней. Сценарии оболочки являются одним из вариантов, но мы также могли бы использовать урезанную версию SCM, которая доступна в некоторых инструментах. Chef - это один из популярных вариантов, а chef-solo - это автономный режим конфигурации Chef, в котором нам не требуется дополнительный узел, который будет действовать как «chef-сервер». Все, что ему нужно, - это URL или путь к тарболл-пакету, содержащему поваренные книги шеф-повара. По сравнению с сценариями оболочки этот тип подхода более декларативный и эффективный, а также является хорошим введением в процесс SCM или IaC (Infrastructure as Code).

Несколько других преимуществ использования chef-solo:

  • Возможность составления: Используйте кулинарные книги сообщества от супермаркета повара или других мест.
  • Бесплатный и открытый исходный код; под лицензией Apache 2.0.
  • Доступ к остальной части экосистемы шеф-повара (InSpec, ChefSpec, Cookstyle, Foodcritic, chef-shell и т. Д.)
  • Поваренные книги и рецепты могут быть позже адаптированы к режиму клиент / сервер.

И некоторые минусы:

  • Некоторые кулинарные книги сообщества в супермаркете Chef устарели, сломаны и не обслуживаются.
  • chef-solo не может разрешать зависимости самостоятельно.

«Рецепты» внутри «поваренной книги шеф-повара» имеют DSL на основе рубина, который описывает «ресурсы», которые находятся в определенном состоянии на узле. Давайте начнем с пошагового руководства, чтобы познакомиться с несколькими концепциями Chef, которые также применимы к chef-solo. Наша цель - настроить узел Ubuntu с запущенным веб-приложением Python / Django, используя Gunicorn и NGINX.

Примечание. Нам не обязательно устанавливать ChefDK на нашу «рабочую станцию ​​Chef» (нашу машину), хотя с ее помощью мы можем использовать команды «chef generate» для запуска со структурой каталогов для создания кулинарных книг, рецептов и многого другого. В этой статье мы будем предполагать, что ChefDK установлен на нашей рабочей станции. Команды выполнялись с использованием версии 4.7.26-1 ChefDK.


(Все, начиная с этого момента, если не указано иное, должно выполняться на нашей машине, также называемой «Рабочая станция Chef»)

Создание кулинарной книги

Поваренные книги в chef - это многократно используемые модули, которые содержат все необходимое для поддержки сценария конфигурации. Поваренные книги могут содержать несколько «рецептов», а «рецепты» в основном сос��оят из шаблонов ресурсов. default.rbэто рецепт по умолчанию, который будет запускаться, когда в списке выполнения упоминается поваренная книга . Различные рецепты позволяют разделить проблемы. Однако для этого урока мы добавим все объявления ресурсов в один основной файл рецепта, который является default.rb.

Создайте папку с именем «my-chef-project» и создайте внутри нее папку «Cookbooks». От ./my-chef-project/cookbooks/, запустить:

$ chef generate cookbook my-cookbook

Наша структура каталогов теперь будет выглядеть так:

.
└── my-chef-project
└── cookbooks
└── my-cookbook
├── CHANGELOG.md
├── LICENSE
├── Policyfile.rb
├── README.md
├── chefignore
├── kitchen.yml
├── metadata.rb
├── recipes
│ └── default.rb
├── spec
│ ├── spec_helper.rb
│ └── unit
│ └── recipes
│ └── default_spec.rb
└── test
└── integration
└── default
└── default_test.rb

Добавление пакетов

Первый шаг к настройке нашего узла - определить, какие пакеты требуются нашему приложению. Наш узел выбран как Ubuntu, поэтому мы можем положиться на менеджер пакетов APT для сбора зависимостей. Установка пакетов, предоставляемых дистрибутивом ОС, - это очень просто:

apt_update
package 'python3'
package 'python3-pip'
package 'nginx'
package 'pkg-config'
package 'libcairo2-dev'
package 'libjpeg-dev'
package 'libgif-dev'
package 'libgirepository1.0-dev'

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

Примечание: пакеты, следующие за 'nginx', необходимы для компиляции некоторых зависимостей python через pip. Они могут отличаться в зависимости от ваших зависимостей проекта python / django, указанных в requirements.txt. Вы можете использовать метод проб и ошибок, чтобы определить эти пакеты, которые нужно включить в свою кулинарную книгу. Чтобы сделать это, выполните руководство sudo pip install -r requirements.txt(Примечание: это устанавливает пакеты для всей системы!) На только что созданной машине с Ubuntu, чтобы проверить, работает ли она успешно. Если нет, stderr должен дать вам подсказки о том, какие пакеты отсутствуют.

Создание пользователей Linux

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

user 'bob' do
  uid 1212
  gid 'users'
  home '/home/bob'
  shell '/bin/bash'
  password '$1$alilbito$C83FsODuq0A1pUMeFPeR10'
end

Обратите внимание, что пароль - это теневой хэш-формат, используемый в Linux. Его можно получить с помощью OpenSSL:

$ openssl passwd -1 -salt alilbitof mypassword

Включая источник приложения

Теперь давайте включим исходный код приложения Django в нашу кулинарную книгу. Поместите исходный код внутри ./my-chef-project/cookbooks/my-cookbook/files/default/myapp/ Создать ./my-chef-project/cookbooks/my-cookbook/files/defaultкаталог, если он не существует.

Инструкция по копированию этих файлов в удаленное местоположение на нашем узле описана с использованием ресурса remote_directory :

remote_directory '/home/bob/myapp' do
  source 'myapp' # This is the name of the folder containing our source code that we kept in ./my-cookbook/files/default/
  owner 'bob'
  group 'users'
  mode '0755'
  action :create
end

Вытащить в Python зависимости

Чтобы установить пакеты Python requirements.txt, мы можем использовать ресурс execute для запуска произвольной команды. В этом случае нам нужно выполнить над ним команду pip install:

execute 'install python dependencies' do
  command 'pip3 install -r requirements.txt'
  cwd '/home/bob/myapp'
end

Примечание: имейте в виду, что это будет выполняться от имени пользователя root, и библиотеки python будут установлены во всей системе. Если наш узел предназначен исключительно для запуска этого единственного приложения на Python, то это не большая проблема. Несмотря на это, лучший способ сохранить чистоту и разумность - это найти и использовать поваренную книгу сообщества, которая управляет установками Python или «virtualenvs». (или, по крайней мере, напишите серию блоков исполнения, чтобы воспроизвести это). Использование virtualenvs в python гарантирует, что любые системные инструменты на базе python или другие проекты python не будут затронуты

Настройка Gunicorn & NGINX

Теперь пришло время подготовить HTTP-сервер Gunicorn WSGI с NGINX в качестве нашего обратного прокси-сервера. Nginx также используется для обработки всех статических ресурсов Django.

Чтобы привязать Gunicorn как сервис на Ubuntu, можно использовать Systemd. Systemd_unit ресурс включен в Chef начиная с версии 12.11.

systemd_unit 'gunicorn.service' do
  content({
  Unit: {
    Description: 'Django on Gunicorn',
    After: 'network.target',
  },
  Service: {
    ExecStart: '/usr/local/bin/gunicorn --workers 3 --bind localhost:8080 myapp.wsgi:application',
    User: 'bob',
    Group: 'www-data',
    WorkingDirectory: '/home/bob/myapp'
    Restart: 'always',
  },
  Install: {
    WantedBy: 'multi-user.target',
  }
  })
  action [:create, :enable, :start]
end

Теперь нам нужно включить стандартную конфигурацию прокси NGINX для этого сервера Gunicorn, как показано ниже. Этот фрагмент может войти в ./my-cookbook/templates/nginx.conf.erb. Создайте каталог шаблонов, если он не существует.

Примечание. Шаблоны Chef поддерживают встроенные файлы ruby, которые могут содержать переменные, выражения ruby ​​и операторы. Хотя этот файл имеет расширение «erb», мы не использовали никаких выражений или выражений ruby. Кроме того, для простоты, у нас есть только конфигурация nginx, отличная от HTTPS (осторожное напоминание; пожалуйста, не делайте этого в рабочей среде!)

server {
  listen 80;
  server_name http://example.com/;

  location = /favicon.ico { access_log off; log_not_found off; }
  location /static/ {
    root /home/bob/myapp/myapp/static;
  }

  location / {
  include proxy_params;
    proxy_pass http://localhost:8080/;
  }
}

Примечание. Существует также альтернативная и лучшая конфигурация, в которой, например, сервер Gunicorn связан с сокетом домена unix вместо петлевого соединения TCP. Это стоит исследовать по соображениям производительности.

Чтобы скопировать этот конфиг в папку сайтов на узле, используйте ресурс шаблона от Chef.

template '/etc/nginx/sites-available/example.com.conf' do
  source 'nginx.conf.erb'
  owner 'root'
  group 'root'
  mode '0744'
end

Активация конфигов на nginx обычно выполняется путем создания символической ссылки, указывающей на конфигурацию sites-availableв sites-enabledпапке nginx . Симлинки могут быть объявлены в поваренных книгах шеф-повара с помощью ресурса ссылок, как показано ниже:

link '/etc/nginx/sites-enabled/example.com.conf' do
  to '/etc/nginx/sites-available/example.com.conf'
end

и удалить символическую ссылку конфигурации по умолчанию:

link '/etc/nginx/sites-enabled/default' do
  action :delete
end

Начиная NGINX

И наконец, для запуска службы nginx:

service 'nginx' do
  action :enable
  action :start
end

Runlists

Run-списки в chef - это упорядоченный список ролей или рецептов в кулинарной книге, которые будут последовательно выполняться на узле. У нас есть одна кулинарная книга «my-cookbook» и рецепт «по умолчанию», который мы должны выполнить в окне Ubuntu, поэтому runlist.json в нашей директории проекта ( ./my-chef-project/runlist.json) должен выглядеть так:

{
  "run_list": [
    "recipe[my-cookbook::default]"
  ]
}

Заключительные шаги

Наша кулинарная книга для Chef Solo готова к подаче. Пришло время подготовить машину с Ubuntu 18.04 и установить на нее ChefDK:

$ ssh [email protected] 'apt-get update && yes | apt-get install curl && curl https://packages.chef.io/files/current/chefdk/4.7.45/ubuntu/18.04/chefdk_4.7.45-1_amd64.deb -o chefdk.deb && yes | dpkg -i chefdk.deb && rm chefdk.deb'

Возвращаясь к нашей рабочей станции Chef , все, что нам нужно сделать, это поместить папку cookbooks в тарбол, перенести этот тарбол вместе с runlist.jsonудаленным узлом, который мы предоставили выше, и запустить команду chef-solo:

(Команда ниже должна выполняться внутри узла или «клиента шеф-повара», а не рабочей станции Chef)

$ chef-solo --recipe-url $(pwd)/chef-solo.tar.gz -j $(pwd)/runlist.json --chef-license=accept

Или вот одна строка (для запуска из ./my-chef-project/CWD на рабочей станции Chef):

tar zvcf chef-solo.tar.gz ./cookbooks &&\
scp chef-solo.tar.gz runlist.json [email protected]:~/ &&\
ssh [email protected] 'chef-solo --recipe-url $(pwd)/chef-solo.tar.gz -j $(pwd)/runlist.json --chef-license=accept'

Это оно! Посмотрите, как стандартный вывод заполняется активностью Chef, пытаясь приблизить ваш узел к тому, что вы указали в кулинарных книгах. Chef-solo установит все драгоценные камни, необходимые для всех поваренных книг. Если команда chef-solo будет успешной, у нас будет работающее приложение Django, работающее за nginx на коробке Ubuntu. Перейдите к домену / IP, чтобы проверить его.

Примечание: помните, что в django вам может потребоваться установить этот домен / ip в ALLOWED_HOSTSсписке в settings.py.

Отвечая на изменения

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

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

Хостинг тарбола (по желанию)

Если вы внимательно посмотрите на последнюю команду chef-solo, обратите внимание, что --recipe-urlона предназначена для получения URL. Это означает, что у вас может быть рабочий процесс, в котором CI будет собирать ваш tar-файл chef-solo, загружать его куда-то и настраивать ваш узел для периодического извлечения из него.

Совет: используйте curl, чтобы периодически вытаскивать измененный тарбол как cronjob. curl -z $fileбудет учитывать If-Modified-Sinceзаголовки и загружать tar-архив только в том случае, если удаленный файл был изменен со времени отметки в существующем локальном файле $file.



Leave a Comment

Как установить Foreman на Ubuntu 16.04 LTS

Как установить Foreman на Ubuntu 16.04 LTS

Используете другую систему? Foreman - это бесплатный инструмент с открытым исходным кодом, который помогает вам настраивать физические и виртуальные серверы и управлять ими. Forema

Как установить и настроить Concourse CI на CentOS 7

Как установить и настроить Concourse CI на CentOS 7

Используете другую систему? Введение Непрерывная интеграция - это практика разработки программного обеспечения DevOps, которая позволяет разработчикам часто объединять

Как установить Jenkins на CentOS 7

Как установить Jenkins на CentOS 7

Jenkins - это популярный инструмент CI (Continuous Integration) с открытым исходным кодом, который широко используется для разработки, развертывания и автоматизации проектов. Эта статья будет

Как установить и настроить GoCD на CentOS 7

Как установить и настроить GoCD на CentOS 7

Используете другую систему? GoCD - это система непрерывной доставки и автоматизации с открытым исходным кодом. Это позволяет моделировать сложные рабочие процессы, используя

Vultr Load Balancers

Vultr Load Balancers

Что такое балансировщик нагрузки? Балансировщики нагрузки располагаются перед вашим приложением и распределяют входящий трафик между несколькими экземплярами вашего приложения. Fo

Как установить SaltStack в CentOS 7

Как установить SaltStack в CentOS 7

SaltStack, или Salt, является популярным решением для управления конфигурацией с открытым исходным кодом, которое можно использовать для реализации удаленного выполнения, управления конфигурацией, cod

Начало работы с SaltStack в Ubuntu 17.04

Начало работы с SaltStack в Ubuntu 17.04

SaltStack - это программа управления конфигурацией на основе Python, оптимизированная для автоматизации файлов конфигурации, развертываний и всего остального

Как установить Drone CI в Ubuntu 18.04

Как установить Drone CI в Ubuntu 18.04

Введение Drone - это автоматизированная платформа для непрерывного тестирования и доставки, работающая на собственной инфраструктуре. Дрон поддерживает любой язык, сервис o

Как установить и н��строить Ansible в Debian 9 для использования с Windows Server

Как установить и н��строить Ansible в Debian 9 для использования с Windows Server

Используете другую систему? Ansible - это инструмент с открытым исходным кодом для автоматизации задач. Он управляет конфигурацией ваших серверов Linux и Windows. Это работает

Создание снимков с упаковщиком

Создание снимков с упаковщиком

Что такое упаковщик? Packer - это инструмент для создания образа сервера, разработанный HashiCorp. Серверная визуализация; или, альтернативно, неизменная инфраструктура; это популярный альтернативный

Как установить Strider CD на Ubuntu 18.04

Как установить Strider CD на Ubuntu 18.04

Введение Strider CD - это платформа непрерывного развертывания с открытым исходным кодом. Приложение написано в Node.js и использует MongoDB в качестве бэкэнда хранилища. Stride

Использование SaltStack с колоннами в Ubuntu 17.04

Использование SaltStack с колоннами в Ubuntu 17.04

Хотя SaltStack - отличный инструмент для одновременного выполнения операций на многих серверах, он также поддерживает предустановки конфигурации для каждого хоста, сохраненные в

Как установить и настроить Ansible на CentOS 7 для использования с Windows Server

Как установить и настроить Ansible на CentOS 7 для использования с Windows Server

Используете другую систему? Ansible - это инструмент с открытым исходным кодом для автоматизации задач. Он управляет конфигурацией ваших серверов Linux и Windows. Это работает

Использование Chocolatey Package Manager в Windows

Использование Chocolatey Package Manager в Windows

Введение Chocolatey обеспечивает управление пакетами, облегчающее администрирование программного обеспечения и зависимостей в Linux и Windows. Вы можете быстро и легко

Как установить Foreman на CentOS 7

Как установить Foreman на CentOS 7

Используете другую систему? Foreman - это бесплатный инструмент с открытым исходным кодом, который помогает вам настраивать физические и виртуальные серверы и управлять ими. Forema

Как установить и настроить Concourse CI в Ubuntu 16.04

Как установить и настроить Concourse CI в Ubuntu 16.04

Используете другую систему? Введение Непрерывная интеграция - это практика разработки программного обеспечения DevOps, которая позволяет разработчикам часто объединять

Изучение 26 методов анализа больших данных: часть 1

Изучение 26 методов анализа больших данных: часть 1

Изучение 26 методов анализа больших данных: часть 1

6 невероятных фактов о Nintendo Switch

6 невероятных фактов о Nintendo Switch

Многие из вас знают Switch, который выйдет в марте 2017 года, и его новые функции. Для тех, кто не знает, мы подготовили список функций, которые делают «Switch» обязательным гаджетом.

Технические обещания, которые все еще не выполнены

Технические обещания, которые все еще не выполнены

Вы ждете, когда технологические гиганты выполнят свои обещания? проверить, что осталось недоставленным.

Функциональные возможности уровней эталонной архитектуры больших данных

Функциональные возможности уровней эталонной архитектуры больших данных

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

Как ИИ может вывести автоматизацию процессов на новый уровень?

Как ИИ может вывести автоматизацию процессов на новый уровень?

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

CAPTCHA: как долго она может оставаться жизнеспособным методом различения между человеком и ИИ?

CAPTCHA: как долго она может оставаться жизнеспособным методом различения между человеком и ИИ?

CAPTCHA стало довольно сложно решать пользователям за последние несколько лет. Сможет ли он оставаться эффективным в обнаружении спама и ботов в ближайшем будущем?

Технологическая сингулярность: далекое будущее человеческой цивилизации?

Технологическая сингулярность: далекое будущее человеческой цивилизации?

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

Телемедицина и удаленное здравоохранение: будущее уже здесь

Телемедицина и удаленное здравоохранение: будущее уже здесь

Что такое телемедицина, дистанционное здравоохранение и их влияние на будущее поколение? Это хорошее место или нет в ситуации пандемии? Прочтите блог, чтобы узнать мнение!

Вы когда-нибудь задумывались, как хакеры зарабатывают деньги?

Вы когда-нибудь задумывались, как хакеры зарабатывают деньги?

Возможно, вы слышали, что хакеры зарабатывают много денег, но задумывались ли вы когда-нибудь о том, как они зарабатывают такие деньги? Давайте обсудим.

Обновление дополнения к macOS Catalina 10.15.4 вызывает больше проблем, чем решает

Обновление дополнения к macOS Catalina 10.15.4 вызывает больше проблем, чем решает

Недавно Apple выпустила macOS Catalina 10.15.4, дополнительное обновление для исправления проблем, но похоже, что это обновление вызывает больше проблем, приводящих к поломке компьютеров Mac. Прочтите эту статью, чтобы узнать больше