Chef: knife solo — пример установки AEM Publisher на Vagrant

Автор: | 12/14/2015
 

pic-chef-logoОписание knife solo

knife-solo расширяет возможности chef-solo, так что его возможности становятся близки Chef-серверу.

В настоящий момент knife-solo добавляет 5 команд к самому Knife:

  • knife solo init — используется для создания структуры директорий (т.е. — «кухни», kitchen), которая совпадает со стандартной структурой директорий Chef и может быть использована для создания и хранения рецептов;
  • knife solo prepare — используется для установки Chef на заданный сервер; во время установки автоматически будет определена ОС и выбран способ установки;
  • knife solo cook — загружает текущую «кухню» (репозиторий Chef) на заданный сервер и запускает там chef-solo;
  • knife solo bootstrap — объединяет в себе первые две команды;
  • knife solo clean — удаляет заруженную кухню с целевого сервера.

Подготовка Vagrant

Добавляем запись в hosts:

$ sudo sh -c "echo '127.0.0.1 dev-pub1-vagrant.local' >> /etc/hosts"
$ ping dev-pub1-vagrant.local
PING dev-pub1-vagrant.local (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.056 ms

Подготавливаем машину:

$ mkdir -p ~/VMs/Vagrant/dev_aem6_pub
$ cd ~/VMs/Vagrant/dev_aem6_pub
$ vagrant init ubuntu/trusty64

В Vagrantfile редактируем настройки:

...
config.vm.network "forwarded_port", guest: 4503, host: 4503
...
config.vm.network "public_network"
...
config.vm.network :forwarded_port, guest: 22, host: 2223, id: 'ssh'
...
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
  end
...

Запускаем:

$ vagrant up

Подключаемся и добавляем пользователя:

$ vagrant ssh
$ sudo adduser knife
$ sudo visudo

Меняем группу sudo:

...
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) NOPASSWD:ALL
...

Добавляем в нее пользователя knife:

$ sudo usermod -a -G sudo knife

Добавляем RSA-ключ:

$ ssh-copy-id -p 2223 -i ssh/id_rsa knife@dev-pub1-vagrant.local

Knife

Клонируем репозиторий:

$ git clone -b devadd https://user@stash.domain.net/scm/contactmapping.git

Его содержимое:

$ tree contactmapping/
contactmapping/
└── chef_repo
    ├── Berksfile
    ├── Berksfile.lock
    ├── README.md
    ├── nodes
    │   ├── dev-auth1.domain.technology.json
    │   ├── dev-pub1.domain.technology.json
    │   ├── qa-auth1.domain.technology.json
    │   ├── qa-pub1.domain.technology.json
    │   ├── uat-auth1.domain.technology.json
    │   └── uat-pub1.domain.technology.json
    └── ssh
        ├── id_rsa
        └── id_rsa.pub

Berksfile со списком зависимостей:

$ cat contactmapping/chef_repo/Berksfile
source 'https://api.berkshelf.com'

cookbook "apt"
cookbook "apache2"
cookbook "java"
cookbook "acpi-support", git: "https://user@stash.domain.net/scm/glc/acpi-support.git"
cookbook "cq5", git: "https://user@stash.domain.net/scm/glc/cq.git"
cookbook "dispatcher", git: "https://user@stash.domain.net/scm/glc/dispatcher.git"
cookbook "cloudera", git: "https://userstash.domain.net/scm/glc/cloudera.git"
cookbook "nrpe", git: "https://userstash.domain.net/scm/glc/nrpe.git"
cookbook "logstash-forwarder", git: "https://user@stash.domain.net/scm/glc/logstash-forwarder.git"

Копируем файл ноды:

$ cp contactmapping/chef_repo/nodes/dev-pub1.domain.technology.json contactmapping/chef_repo/nodes/dev-pub1-vagrant.local.json

Его содержимое:

$ head -n 20 contactmapping/chef_repo/nodes/dev-pub1-vagrant.local.json
{
  "run_list": [
    "recipe[apt]",
    "recipe[acpi-support]",
    "recipe[nrpe]",
    "recipe[logstash-forwarder]",
    "recipe[java]",
    "recipe[cq5::cq55]",
    "recipe[dispatcher]"
  ],
  "java": {
    "install_flavor": "oracle",
    "jdk": {
      "8": {
        "x86_64": {
          "url": "http://static.content.domain.net/static/content/jdk/jdk-8u20-linux-x64.tar.gz",
          "checksum": "3e717622ae48af5ca7298e7797cb71d4d545238f362741a83e69c097ca055de4"
        },
        "i586": {
          "url": "http://static.content.domain.net/static/content/jdk/jdk-8u20-linux-i586.tgz",
        ...

Создаем «кухню» с рецептами:

$ cd contactmapping/chef_repo/
$ knife solo init .
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...
Setting up Berkshelf...

Проверяем:

$ tree .
.
├── Berksfile
├── Berksfile.lock
├── README.md
├── cookbooks
├── data_bags
├── environments
├── nodes
│   ├── dev-auth1.domain.technology.json
│   ├── dev-pub1.domain.technology.json
│   ├── dev-pub1-domain.local.json
│   ├── qa-auth1.domain.technology.json
│   ├── qa-pub1.domain.technology.json
│   ├── uat-auth1.domain.technology.json
│   └── uat-pub1.domain.technology.json
├── roles
├── site-cookbooks
└── ssh
    ├── id_rsa
    └── id_rsa.pub

Подготавливаем Chef на Vagrant-боксе, загружаем рецепты из локальной «кухни», и запускаем chef solo на боксе:

$ knife solo bootstrap knife@dev-pub1-vagrant.local -p 2223 -i ssh/id_rsa

На боксе проверяем:

# netstat -anp | grep 4503
tcp6       0      0 :::4503                 :::*                    LISTEN      19461/java

Готово:

Screen Shot 2015-12-11 at 15.56.11