Содержание
Создание 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!
Готово.