Пълно ръководство за начинаещи за готвач и инфраструктура като код

През последните няколко седмици рових много в готвача. Въпреки че документацията е добра, имало е много моменти, когато съм оставал без никаква представа. Така че ще дам задълбочено въведение за готвача. Ако изобщо не сте чували за готвача (като мен преди няколко месеца), не се притеснявайте, ще ви обясня всичко.

Какво е Chef и защо?

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

Това е структурата, която се генерира от командата chef генерира готварска книга . Нека да прегледаме всеки файл, за да видим какво правят.

Готварски книги

Готварската книга е основната конфигурационна единица, която има за цел да постигне някакво желано състояние с помощта на други компоненти като рецепти, шаблони, файлове и т.н. По подразбиране, когато генерирате готварска книга, получавате само папка с рецепти. Можете обаче да създавате папки за шаблони и други компоненти, също ако планирате да ги използвате (за тях ще говорим по-късно).

Да приемем, че искате да стартирате 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 :)