Повне керівництво для шеф-кухаря та інфраструктури як коду для початківців

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

Що таке шеф-кухар і чому?

Chef - це потужна платформа автоматизації, яка перетворює інфраструктуру на код. Шеф-кухар автоматизує налаштування, розгортання та управління інфраструктурою у вашій мережі, незалежно від її розміру.

Але що означає інфраструктура як код? Отже, припустимо, у вас є програма Java, яку потрібно розгорнути на одній машині. Для цього вам не потрібна автоматизація - ви можете зробити це вручну.

Але що відбувається, коли одна машина не може витримати навантаження, і вам потрібно розгорнути свою програму на 10 або 50 або 100 машинах більше? Тут заходить Chef. Замість того, щоб розгортати додаток вручну на кожному окремому комп'ютері, ви можете написати код, який робить це за вас.

Термінологія

  1. Робоча станція - ваша локальна машина, яка називається вашим ноутбуком. Це де ви пишете код , який потім штовхнув на сервер шефа.
  2. Chef Server - тут знаходиться весь ваш код. Він також містить всю інформацію про вузли.
  3. Nodes aka Chef Client - машини, на яких потрібно запускати ваш код. Ви можете використовувати щось на зразок бродяги для навчальних цілей та aws / gcp у виробництві. Ваші вузли витягують останній код із вашого шеф-сервера.

Початок роботи з шеф-кухарем

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

Після встановлення ChefDK виконайте таку команду:

chef generate cookbook testingCheftree testingChef

Це структура, яку генерує команда шеф-кухаря генерувати кулінарні книги . Давайте переглянемо кожен файл, щоб побачити, що вони роблять.

Кулінарні книги

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

Скажімо, ви хочете запустити додаток Java на машині. Для цього потрібні дві речі:

  1. На вашому комп'ютері повинна бути встановлена ​​Java.
  2. У ньому повинен бути додаток для запуску.

Тоді ви можете запустити додаток.

Отже, ви створюєте кулінарну книгу, яка під час запуску на вузлі встановлює java на цьому вузлі, отримує програму, яку потрібно запустити, та запускає цю програму.

Ресурси шеф-кухаря

Ресурс - це блок Ruby з чотирма компонентами: типом, іменем, одним (або декількома) властивостями (зі значеннями) та однією (або декількома) діями. Синтаксис ресурсу такий:

type 'name' do attribute 'value' action :type_of_actionend

Скажімо, ви хочете встановити OpenJDK 7 на свій вузол. Для цього ви можете використати пакетний ресурс, доступний у chef.

package 'java-1.7.0-openjdk' do action :installend

Дія: встановити дію за замовчуванням для ресурсу пакетів, так що ви можете пропустити , що якщо ви хочете.

package 'java-1.7.0-openjdk'

Щоб запустити cronJob на своєму вузлі, ви можете використовувати ресурс cron .

cron 'reporting' do action :create minute '0' hour '0' weekday '1' command "/srv/app/scripts/daily_report" # Path of script to runend

Залежно від того, чого ви хочете досягти, є багато вбудованих ресурсів шеф-кухаря, якими ви можете скористатися. Детальніше про них ви можете прочитати тут.

Рецепти

Рецепт - це сукупність ресурсів, яка прагне наблизити ваш вузол на крок до бажаного стану. Рецепти пишуть рубіном.

Для запуску рецепта ми використовуємо таку команду:

chef-client -z pathToRecipe

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

************************** default.rb ****************************
/* This is an example recipe to install install httpd (Apache HyperText Transfer Protocol (HTTP) server program), creates a file on the node at /var/www/html/index.html (default path for serving web pages on apache server) and starts the service on a centOS based machine */
package 'httpd'
file '/var/www/html/index.html' do content 'This is a placeholder for the home page.'end
service 'httpd' do action [:enable, :start]end

Метадані та Berksfile

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

This is where the Chef Supermarket comes in. It contains community cookbooks which you can use as dependencies in your own cookbook. These dependencies are listed in the metadata.rb file or even in your Berksfile. But then the question arises: how are they different?

************************* Berksfile ********************************source '//supermarket.chef.io' # Fetch dependencies from here
metadata

When you upload your cookbook on the chef server, you must also upload your cookbook’s dependencies. This is where Berks help. You just have to run two simple commands:

berks install berks upload

which download all the dependencies of your cookbooks and upload all of them to the chef server. The dependency cookbooks are present at

~/.berkshelf/cookbooks/

In case you updated your cookbook and want to re-upload them on the chef server, then you must update the version in the metadata file. Otherwise when you use the berks upload command, the new recipe won’t be uploaded unless you force an upload.

**************************** metadata.rb ***************************name 'testingChef'maintainer 'The Authors'maintainer_email '[email protected]'license 'All Rights Reserved'description 'Installs/Configures testingChef'long_description 'Installs/Configures testingChef'version '0.1.0' # Update after changes are made to the cookbookchef_version '>= 12.14' if respond_to?(:chef_version)
depends 'haproxy', '~> 6.2.6'

Chefignore

Put files/directories that should be ignored in this file when uploading

or sharing cookbooks to the community site.

Ohai

When we install CheckDK, we also get ohai with it. Every time you run chef-client on your node, chef runs ohai before that. Ohai collects a lot of system information. The types of attributes Ohai collects include, but are not limited to:

  • Operating System
  • Network
  • Memory
  • Disk
  • CPU

When running ohai you get a lot of output, so be mindful of what you want and write your commands accordingly.

Now if want, we can use all this information in our recipes. All we have to do is refer to a particular property of the node.

if node['hostname'] == "Some hostname" do // do something only if the nodes hostname matchesend

Knife

Knife is a tool which you use to communicate with the chef server. If you want to know anything about your nodes or want to update anything like their recipes, knife is the way to go. There are more than a dozen knife commands. Here are some of them

  1. knife bootstrap— This command is used to create a new node and attach that to your chef server. When bootstrapping a node, chef installs everything like ohai, chef-client on the node and it also runs chef-client automatically. For any subsequent changes made to that node, you need to run chef-client manually to update your node.
  2. knife node show ${nodeName} — This command is used to get information about your node which includes recipes, environment, platform etc.

3. knife cookbook list ${nodeName} — This command is used to get all the cookbooks associated with your node

That’s about it ! Thank you for reading, and I hope you enjoyed the article.

You can follow me on Medium and Github :)