Chef: chef-solo пример

Автор: | 05/17/2016
 

pic-chef-logoСоздание VM

Подготавливаем бокс:

$ vagrant init ubuntu/trusty64

Обновляем Vagrantfile:

...
config.vm.network "public_network"
...
  config.vm.provider "virtualbox" do |vb|
...
    vb.memory = "2048"
  end
...

Запускаем и подключаемся:

$ vagrant up
$ vagrant ssh

Установка Chef

Устанавливаем на машине Chef:

# curl -L https://www.chef.io/chef/install.sh | bash

Проверяем:

# chef-solo -v
Chef: 12.9.41

Настройка конфигурации

Для запуска chef-solo на этой машине – нам необходимо:

  • указать, что именно настраивать, добавив run_list в файл node.json;
  • указать, как настраивать, добавив рецепты, которые заключены в cookbook-и, которые расположены в каталоге cookbooks;
  • указать – где chef-solo может найти кукбуки, добавив cookbook_path в файл solo.rb.

Создадим каталог .chef в домашней директории, в которой будем хранить все файлы для Chef:

$ mkdir ~/.chef

Далее – создадим файл рецепта, который будет создаватиь файл /tmp/helloworld.txt.

Создаём каталог кукбука:

$ mkdir -p ~/юchef/cookbooks/helloworld/recipes

И в нём – файл ~/.chef/cookbooks/helloworld/recipes/default.rb с таким содержимым:

file "/tmp/helloworld.txt" do
  owner "ubuntu"
  group "ubuntu"
  mode 00544
  action :create
  content "Hello, Implementor!"
end

В этом рецепте используется ресурс file для создания файла /tmp/helloworld.txt.

Следующим шагом – создаём файл ~/.chef/node.json, в котором описываем рецепт для запуска:

{
  "run_list": [ "recipe[helloworld]" ]
}

Последний шаг – указать самому Chef, где искать кукбуки и рецепты. Создаём файл ~/.chef/solo.rb:

file_cache_path "/home/vagrant/.chef"
cookbook_path "/home/vagrant/.chef/cookbooks"
json_attribs "/home/vagrant/.chef/node.json"

И запускаем chef-solo, с помощью опции -c указав файл конфигурации:

$ sudo chef-solo -c ~/.chef/solo.rb 
Starting Chef Client, version 12.9.41
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 1 resources
Recipe: helloworld::default
  * file[/tmp/helloworld.txt] action create
    - create new file /tmp/helloworld.txt
    - update content in file /tmp/helloworld.txt from none to 676ff8
    --- /tmp/helloworld.txt     2016-05-16 10:20:47.655719768 +0000
    +++ /tmp/.chef-helloworld.txt20160516-2676-qieiau   2016-05-16 10:20:47.655719768 +0000
    @@ -1 +1,2 @@
    +Hello, Implementor!
    - change mode from '' to '0544'
    - change owner from '' to 'ubuntu'
    - change group from '' to 'ubuntu'

Running handlers:
Running handlers complete
Chef Client finished, 1/1 resources updated in 01 seconds

Проверяем наличие файла:

$ ls -l /tmp/helloworld.txt 
-r-xr--r-- 1 ubuntu ubuntu 19 May 16 10:20 /tmp/helloworld.txt
$ cat /tmp/helloworld.txt 
Hello, Implementor!

Добавим ещё один кукбук:

$ mkdir -p ~/.chef/cookbooks/crondemo/recipes

Создаём рецепт – в файл ~/.chef/cookbooks/crondemo/recipes/default.rb вписываем:

cron "log something" do
  action :create
  hour "*"
  minute "*"
  command "logger Hello!"
end

В node.json добавляем вызов этого рецепта:

{
  "run_list": [ 
    "recipe[helloworld]", 
    "recipe[crondemo]"
 ]
}

Запускаем:

$ sudo chef-solo -c ~/.chef/solo.rb
Starting Chef Client, version 12.9.41
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 2 resources
Recipe: helloworld::default
  * file[/tmp/helloworld.txt] action create (up to date)
Recipe: crondemo::default
  * cron[log something] action create
    - add crontab entry for cron[log something]

Running handlers:
Running handlers complete
Chef Client finished, 1/2 resources updated in 01 seconds

Файл /tmp/helloworld.txt не изменился, т.к. он уже есть, а в системном логе – появилась запись, добавленная из крона, созданного chef-solo:

$ sudo tail -n 1 /var/log/syslog 
May 16 10:44:01 vagrant-ubuntu-trusty-64 logger: Hello!

Добавим в crondemo ещё один рецепт, в файл ~/.chef/cookbooks/crondemo/recipes/goodbye.rb:

cron "log something else" do
  action :create
  hour "*"
  minute "*"
  command "logger Goodbye!"
end

Обновляем node.json:

{
  "run_list": [
    "recipe[helloworld]",
    "recipe[crondemo]",
    "recipe[crondemo::goodbye]"
 ]
}

Запускаем:

$ sudo chef-solo -c ~/.chef/solo.rb
Starting Chef Client, version 12.9.41
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 3 resources
Recipe: helloworld::default
  * file[/tmp/helloworld.txt] action create (up to date)
Recipe: crondemo::default
  * cron[log something] action create (up to date)
Recipe: crondemo::goodbye
  * cron[log something else] action create
    - add crontab entry for cron[log something else]

Running handlers:
Running handlers complete
Chef Client finished, 1/3 resources updated in 01 seconds

Проверяем список задач в cron для root:

$ sudo crontab -l
# Chef Name: log something
* * * * * logger Hello!
# Chef Name: log something else
* * * * * logger Goodbye!
$ sudo tail -n 1 /var/log/syslog 
May 16 10:50:01 vagrant-ubuntu-trusty-64 logger: Goodbye!

Готово.