Използване на Chef-solo за конфигуриране на приложение Django в Ubuntu

Има много начини за автоматизиране на процеса на настройка и конфигуриране на кутия. По някаква причина, ако цялата ни система в този момент се състои само от една кутия, настройването на пълна инфраструктура на SCM (Управление на софтуерната конфигурация) е излишно. Shell скриптовете са една от опциите, но бихме могли да използваме и съкратена версия на SCM, която е налична в някои от инструментите там. Chef е една от популярните опции, а "chef-solo" е самостоятелният конфигурационен режим на Chef, където не се нуждаем от допълнителен възел, за да действа като "chef-server". Всичко, от което се нуждае, е URL или път към tarball пакет, който съдържа готварски книги за готвачи. В сравнение със скриптовете на обвивката, този тип подход е по-декларативен и ефикасен от кутията и също така е добро въведение, за да започнете със SCM или IaC (Инфраструктура като код) процеси.

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

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

И някои минуси:

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

„Рецептите“ вътре в „кулинарна книга“ на главния готвач имат DSL, базиран на рубин, който описва „ресурсите“ да бъдат в определено състояние на възел. Нека продължим с инструкции, за да се запознаем с няколко концепции за готвач, които са приложими и за 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.


(Всичко от този момент нататък, освен ако не е посочено друго, трябва да се изпълнява на нашата машина, наричана още „Работна станция на главния готвач“)

Създаване на готварската книга

Готварските книги в 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

Сега е време да подготвим Gunicorn WSGI HTTP сървър с 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на nginx sites-enabled. Символните връзки могат да бъдат декларирани в готварските книги за готвачи с ресурса за връзка, както е показано по-долу:

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 , всичко, което трябва да направим, е да поставим папката с готварски книги в tarball, да прехвърлим този tarball заедно с 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.

Хостване на tarball (по избор)

Ако погледнете отблизо последната команда chef-solo, забележете, че --recipe-urlе предназначена да вземе URL. Това означава, че можете да имате работен процес, при който CI ще изгради вашия chef-solo tarball, ще го качи някъде и ще конфигурира вашия възел да изтегля от него периодично.

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 е система за непрекъсната доставка и автоматизация с отворен код. Той ви позволява да моделирате сложни работни потоци, като използвате неговия паралел

Използване на SaltStack с стълбове в Ubuntu 17.04

Използване на SaltStack с стълбове в 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 е автоматизирана, непрекъсната платформа за тестване и доставка, която работи на вашата собствена инфраструктура. Дрон поддържа всеки език, услуга o

Балансьори на натоварване Vultr

Балансьори на натоварване Vultr

Какво е Load Balancer Балансьорите на натоварване седят пред вашето приложение и разпределят входящия трафик между множество инстанции на вашето приложение. Fo

Как да инсталирате Foreman на CentOS 7

Как да инсталирате Foreman на CentOS 7

Използване на различна система? Foreman е безплатен инструмент с отворен код, който ви помага с конфигурирането и управлението на физически и виртуални сървъри. Forema

Как да инсталирате SaltStack на CentOS 7

Как да инсталирате SaltStack на CentOS 7

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

Как да инсталирате Strider CD на Ubuntu 18.04

Как да инсталирате Strider CD на Ubuntu 18.04

Въведение Strider CD е платформа за непрекъснато внедряване с отворен код. Приложението е написано на Node.js и използва MongoDB като бекенд за съхранение. Разкрачвайте се

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

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

Въведение Chocolatey предоставя управление на пакети, което прави администрирането на софтуер и зависимостите лесно в Linux, на Windows. Можете бързо и лесно

Създаване на моментни снимки с Packer

Създаване на моментни снимки с 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 е безплатен инструмент с отворен код, който ви помага с конфигурирането и управлението на физически и виртуални сървъри. Forema

Първи стъпки със SaltStack в Ubuntu 17.04

Първи стъпки със SaltStack в Ubuntu 17.04

SaltStack е базирана на Python програма за управление на конфигурацията, която е оптимизирана за автоматизиране на конфигурационни файлове, внедряване и всичко друго.

Възходът на машините: Реални приложения на AI

Възходът на машините: Реални приложения на AI

Изкуственият интелект не е в бъдещето, тук е точно в настоящето. В този блог Прочетете как приложенията за изкуствен интелект са повлияли на различни сектори.

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 машини. Прочетете тази статия, за да научите повече