пятница, 12 декабря 2014 г.

«Вшиваем» часть ansible playbook в образ с помощью Packer.io

В продолжение темы замечательного packer.io, рассмотрим вариант когда часть playbook-а общая для всех хостов, и очень редко изменяется.

У меня такая есть: некий common.yml. Зачем каждый раз проигрывать эти изменения на хостах, если можно заранее проиграть их на образе из которых мы эти хосты строим.

А уж остальные, часто изменяемые, или уникальные playbook-и будем играть на vagrant или на vds уже руками.

В случае packer эта часть называется post-provisioning.

Умеет кучу всякого разного: chef, puppet, скрипты, но я медленно и верно ухожу на ansible, его и буду использовать.

Итак, в предыдущей серии мы получили образ нужного нам debian-а в виде vagrant box.

Изменим конфигурацию packer, добавив туда наш рецепт ansible.

Мне проще в этот же репозиторий добавить submodule, чем высчитывать путь, поэтому:
git submodule add https://github.com/korjavin/ansible-for-clouds provisioning

И в конфиге вписываем:
     {  
      "type": "shell",
      "execute_command": "echo 'vagrant' | {{.Vars}} sudo -E -S bash '{{.Path}}'",
      "inline": "apt-get -y install ansible"
    },
установку собственно ansible, так как запускать мы будем ansible-playbook «изнутри» хоста, а не «снаружи», то придется его иметь.

И прописываем путь к рецепту:
    {
        "type": "ansible-local",
        "playbook_dir":"./provisioning",
        "playbook_file": "./provisioning/local.yml",
        "playbook_paths": [
                 "./provisioning/"
                       ],
         "role_paths": [
            "./provisioning/roles/"
         ],
        "staging_directory":"/tmp/stage"
    }
Я отдельно добавил себе playbook local.yml, для того что бы прописать в нём
- hosts: 127.0.0.1
  sudo: yes          
  connection: local
Без этого ansible-playbook запускался от vagrant без sudo.

И оставил в local.yml только те свои роли, которые я хочу иметь "вшитыми" в образ.

Всё чудесно срабатывает:

И в итоге у меня есть механизм удобного получения этих образов из текущего среза debian и набора playbook.

Теперь, можно комбинировать: построить этот образ, включив в него только хорошо протестированные playbook-и.

Затем отладить остальные ansible playbook-и на этом образе в vagrant, экономя время на каждом запуске, и затем после отладки: или выставить в production на vds/bare metal, или итерационно перейти к шагу один и вшить протестированные рецепты снова в образ.