Використання Chef-solo для налаштування програми Django в Ubuntu

Є багато способів автоматизувати процес налаштування та налаштування коробки. З будь-якої причини, якщо вся наша система на даний момент складається лише з однієї коробки, налаштувати повну інфраструктуру SCM (Управління конфігурацією програмного забезпечення) буде зайвим. Одним з варіантів є сценарії оболонки, але ми також можемо використовувати зменшену версію SCM, яка доступна в деяких інструментах. Chef — один із популярних варіантів, а «chef-solo» — це автономний режим конфігурації Chef, де нам не потрібен додатковий вузол, щоб діяти як «кухар-сервер». Все, що йому потрібно, це URL-адреса або шлях до пакета tarball, який містить кулінарні книги шеф-кухаря. Порівняно зі сценаріями оболонки, цей тип підходу є більш декларативним та ефективним із коробки, а також є хорошим вступом для початку роботи з процесами SCM або IaC (інфраструктура як код).

Кілька інших переваг використання chef-solo:

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

І деякі мінуси:

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

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

Note: We do not necessarily require ChefDK to be installed on our "Chef workstation" (our machine), although with it, we can use 'chef generate' commands to start-off with a directory structure for creating cookbooks, recipes and more. In this article, we will assume ChefDK is installed on our workstation. Commands were run using the version 4.7.26-1 of ChefDK.


(Все, починаючи з цього моменту, якщо не вказано інше, буде запущено на нашій машині, також званій «Робочою станцією кухаря»)

Створення кулінарної книги

Cookbooks in 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, а наступні рядки встановлять ці пакунки.

Note: The packages following 'nginx' are needed for compiling some of the python dependencies through pip. These may differ based on your python/django project dependencies specified in requirements.txt. You can use a trial and error method to determine these packages that you need to include in your cookbook. To do that, perform a manual sudo pip install -r requirements.txt (Note: This installs packages system wide!) on a freshly instantiated ubuntu machine to see if it runs successfully. If not, the stderr should give you hints on what packages are missing.

Створення користувачів 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

Note: Bear in mind that this is going to execute as the root user and the python libraries will be installed system-wide. If our node is designated to exclusively run this one single python app, then it isn't much of a problem. Despite that, a better option to keep things clean and sane is to find and use a community cookbook that manages python installations or 'virtualenvs'. (or at the very least, write a series of execute blocks to replicate this). Using virtualenvs in python ensures that any python based system tools or other python projects will not be affected

Налаштування 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. Створіть каталог шаблонів, якщо він не існує.

Note: Chef's templates support embedded ruby files that can contain variables, ruby expressions and statements. Although this file has the 'erb' extension, we did not use any of the ruby statements or expressions. Also, for the sake of simplicity, we only have a non HTTPS nginx config here (gentle reminder; please do not do this in production!)

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/;
  }
}

Note: There is also an alternative and a better config, where, for instance the Gunicorn server is bound to a unix domain socket instead of a TCP loopback connection. It's worth exploring that for performance reasons.

Щоб скопіювати цю конфігурацію до папки з підтримкою сайтів на вузлі, скористайтеся ресурсом шаблону від 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

Списки виконання

Списки виконання в chef — це впорядкований список ролей або рецептів у кулінарній книзі, які будуть виконуватися послідовно на вузлі. У нас є одна кулінарна книга "my-cookbook" і "за замовчуванням" рецепт всередині неї, які нам потрібно виконати на вікні Ubuntu, тому runlist.json у нашому каталозі проекту ( ./my-chef-project/runlist.json) має виглядати так:

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

Останні кроки

Наша кулінарна книга для шеф-кухаря соло готова до подачі. Настав час підготувати машину 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 , все, що нам потрібно зробити, це помістити папку кулінарних книг у tar-архів, перенести цей файл разом із 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 Workstation):

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, щоб перевірити його.

Note: Remember that in django you may need to set this domain/ip in the ALLOWED_HOSTS list in settings.py.

Реакція на зміни

Щоразу, коли ми змінюємо вміст нашого каталогу проекту (рецепти, шаблони або вихідний код програми тощо), просто запустіть наведений вище один рядок із каталогу проекту.

Tip: If the cookbook is version controlled with git (as it should), one good recommendation is to set git hooks to run this one-liner.

Розміщення tar-архіву (необов’язково)

Якщо ви уважно подивитеся на останню команду chef-solo, помітите, що ця команда --recipe-urlпризначена для отримання URL-адреси. Це означає, що ви можете мати робочий процес, у якому CI буде створювати ваш chef-solo tar-архів, завантажувати його кудись і налаштовувати ваш вузол для періодичного вилучення з нього.

Tip: Use curl to pull the changed tarball periodically as a cronjob. curl -z $file will honor If-Modified-Since headers and will only download the tar ball if the remote file has been changed since the timestamp on the existing local $file.


Як встановити Jenkins на CentOS 7

Як встановити Jenkins на CentOS 7

Jenkins — популярний інструмент CI (безперервна інтеграція) з відкритим кодом, який широко використовується для розробки, розгортання та автоматизації проектів. Ця стаття буде

Як встановити та налаштувати Concourse CI в Ubuntu 16.04

Як встановити та налаштувати Concourse CI в Ubuntu 16.04

Використання іншої системи? Вступ Постійна інтеграція – це практика розробки програмного забезпечення DevOps, яка дозволяє розробникам часто об’єднувати

Як встановити та налаштувати Ansible на Debian 9 для використання з Windows Server

Як встановити та налаштувати Ansible на Debian 9 для використання з Windows Server

Використання іншої системи? Ansible — інструмент з відкритим кодом для автоматизації завдань. Він керує конфігурацією ваших серверів Linux і Windows. Це працює

Як встановити та налаштувати GoCD на CentOS 7

Як встановити та налаштувати GoCD на CentOS 7

Використання іншої системи? GoCD — це система безперервної доставки та автоматизації з відкритим вихідним кодом. Він дозволяє моделювати складні робочі процеси, використовуючи його паралельний an

Використання SaltStack With Pillars в Ubuntu 17.04

Використання SaltStack With Pillars в Ubuntu 17.04

Хоча SaltStack є чудовим інструментом для одночасного виконання операцій на багатьох серверах, він також підтримує певні налаштування конфігурації для кожного хоста, що зберігаються в

Як встановити та налаштувати Ansible на CentOS 7 для використання з Windows Server

Як встановити та налаштувати Ansible на CentOS 7 для використання з Windows Server

Використання іншої системи? Ansible — інструмент з відкритим кодом для автоматизації завдань. Він керує конфігурацією ваших серверів Linux і Windows. Це працює

Як встановити Drone CI на Ubuntu 18.04

Як встановити Drone CI на Ubuntu 18.04

Вступ Drone — це автоматизована платформа безперервного тестування та доставки, яка працює на вашій власній інфраструктурі. Дрон підтримує будь-яку мову, сервіс о

Балансувальники навантаження Vultr

Балансувальники навантаження Vultr

Що таке Load Balancer Балансувальники навантаження розташовані перед вашою програмою і розподіляють вхідний трафік між кількома екземплярами вашої програми. Fo

Як встановити Foreman на CentOS 7

Як встановити Foreman на CentOS 7

Використання іншої системи? Foreman — це безкоштовний інструмент з відкритим вихідним кодом, який допоможе вам налаштувати та керувати фізичними та віртуальними серверами. Предварня

Як встановити SaltStack на CentOS 7

Як встановити SaltStack на CentOS 7

SaltStack, або Salt, — це популярне рішення для керування конфігурацією з відкритим вихідним кодом, яке можна використовувати для реалізації віддаленого виконання, керування конфігурацією, код

Як встановити Strider CD на Ubuntu 18.04

Як встановити Strider CD на Ubuntu 18.04

Вступ Strider CD — це платформа безперервного розгортання з відкритим вихідним кодом. Програма написана на Node.js і використовує MongoDB як бекенд сховища. Шрок

Використання диспетчера пакетів Chocolatey у Windows

Використання диспетчера пакетів Chocolatey у Windows

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

Створення знімків за допомогою Packer

Створення знімків за допомогою Packer

Що таке Пакер? Packer — це інструмент створення зображень сервера, розроблений HashiCorp. Обробка зображень сервера; або, як альтернатива, незмінна інфраструктура; є популярною альтернативою

Як встановити та налаштувати Concourse CI на CentOS 7

Як встановити та налаштувати Concourse CI на CentOS 7

Використання іншої системи? Вступ Постійна інтеграція – це практика розробки програмного забезпечення DevOps, яка дозволяє розробникам часто об’єднувати

Використання Chef-solo для налаштування програми Django в Ubuntu

Використання Chef-solo для налаштування програми Django в Ubuntu

Є багато способів автоматизувати процес налаштування та налаштування коробки. З будь-якої причини, якщо вся наша система на даний момент складається з справедливих

Як встановити Foreman на Ubuntu 16.04 LTS

Як встановити Foreman на Ubuntu 16.04 LTS

Використання іншої системи? Foreman — це безкоштовний інструмент з відкритим вихідним кодом, який допоможе вам налаштувати та керувати фізичними та віртуальними серверами. Предварня

Початок роботи з SaltStack в Ubuntu 17.04

Початок роботи з SaltStack в Ubuntu 17.04

SaltStack — це програма керування конфігурацією на основі Python, яка оптимізована для автоматизації файлів конфігурації, розгортань та всього іншого.

Повстання машин: застосування ШІ в реальному світі

Повстання машин: застосування ШІ в реальному світі

Штучний інтелект не в майбутньому, він тут прямо в сьогоденні У цьому блозі Прочитайте, як програми штучного інтелекту вплинули на різні сектори.

DDOS-атаки: короткий огляд

DDOS-атаки: короткий огляд

Ви також стали жертвою DDOS-атак і спантеличені методами запобігання? Прочитайте цю статтю, щоб вирішити свої запитання.

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

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

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

Революційні винаходи від Google, які полегшать ваше життя.

Революційні винаходи від Google, які полегшать ваше життя.

Ви хочете побачити революційні винаходи Google і як ці винаходи змінили життя кожної людини сьогодні? Тоді читайте в блозі, щоб побачити винаходи Google.

Friday Essential: Що сталося з автомобілями, керованими штучним інтелектом?

Friday Essential: Що сталося з автомобілями, керованими штучним інтелектом?

Концепція самокерованих автомобілів, щоб вирушати в дороги за допомогою штучного інтелекту, є мрією, яку ми давно мріємо. Але, незважаючи на кілька обіцянок, їх ніде не видно. Прочитайте цей блог, щоб дізнатися більше…

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

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

Оскільки наука розвивається швидкими темпами, бере на себе багато наших зусиль, ризики піддати себе незрозумілій Сингулярності також зростає. Читайте, що може означати для нас сингулярність.

Еволюція зберігання даних – інфографіка

Еволюція зберігання даних – інфографіка

Методи зберігання даних можуть розвиватися з моменту народження Даних. Цей блог висвітлює еволюцію зберігання даних на основі інфографіки.

Функціональні можливості шарів еталонної архітектури великих даних

Функціональні можливості шарів еталонної архітектури великих даних

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

6 дивовижних переваг використання пристроїв розумного дому в нашому житті

6 дивовижних переваг використання пристроїв розумного дому в нашому житті

У цьому цифровому світі пристрої розумного дому стали важливою частиною життя. Ось кілька дивовижних переваг пристроїв розумного дому щодо того, як вони роблять наше життя гідним життя та спрощують його.

Оновлення доповнення macOS Catalina 10.15.4 спричиняє більше проблем, ніж вирішує

Оновлення доповнення macOS Catalina 10.15.4 спричиняє більше проблем, ніж вирішує

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