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