Я учусь на шеф-повара, и у меня проблемы со структурой для работы с моей командой.
Для начала кажется, что вам следует создать папку chef-repo, в которой вы будете хранить и изменять кулинарные книги, используемые для управления вашими узлами.
Я работаю над разными проектами, и каждый из них уже находится в системе контроля версий git. В идеале я бы держал одну папку chef-repo в каждом из моих проектов с кулинарными книгами этих проектов, верно?
Однако в папке chef-repo мне нужно добавить папку конфигурации (.chef) с моей конфигурацией ножа и моими ключевыми проверками, и они относятся к мне. Нормально ли просто добавить папку .chef в файл gitignore?
Я понимаю, что кулинарные книги загружаются на сервер Chef для последующего развертывания. Как другие команды отделяют подготовку от производственной среды, не дублируя при этом много работы? У нас есть основная ветка, которая является нашей производственной ветвью, ветвь разработки, которая является нашей промежуточной ветвью (получает менее 5% запросов веб-сайта) и функциональные ветки. В большинстве случаев ветвь разработки в стабильной версии объединяется с основной веткой. Как мы можем загружать кулинарные книги по отдельности, чтобы иметь возможность иметь две среды по отдельности?
Спасибо за помощь!
Я работаю с несколькими проектами, поэтому решение cjc мне не подойдет. Также существует проблема общей и пользовательской конфигурации (адреса и т. Д. Общие для компании, также есть немного волшебства в конфигурациях). Схема, на которую я в конце концов остановился, немного напоминает хакерскую, но удобную в использовании.
Вместо глобального ~/.chef
, Я использую подкаталог '.chef' в chef-repo, который не хранится в git (он добавлен в .gitignore
). У меня также есть файл config/knife.rb
файл, который регистрируется в Git и содержит общую конфигурацию. Он начинается с этого фрагмента:
root_dir = File.join(File.dirname(__FILE__), '..')
%w(knife-secrets.rb knife-local.rb).each do |conf_name|
conf = File.join(root_dir, ".chef", conf_name)
Kernel::load(conf) if File.exists? conf
end
Это загружает файлы .chef/knife-local.rb
содержащие пользовательскую конфигурацию (в базовой версии это просто OPSCODE_USER='username'
константа, которая используется позже, но может содержать любую конфигурацию ножа), и .chef/knife-secrets.rb
который содержит общие секреты (ключи AWS и т. д.).
Ниже представлена обычная конфигурация ножа, в которой используются константы, определенные в этих файлах, например:
client_key "#{root_dir}/.chef/#{OPSCODE_USER}.pem"
Таким образом я добиваюсь стандартизации конфигурации ножа во всей компании, что, в свою очередь, означает, что любой фрагмент кода или вызов ножа, опубликованный в вики, будет работать для всех. В самом ноже достаточно путаницы и волшебства - разные конфигурации только усугубят ситуацию. Кроме того, каждый может воспользоваться небольшими волшебными сниппетами, например вот этот делать knife ssh
использовать логин, настроенный в пользователе ~/.ssh/config
Также существует проблема общих секретов: ключ проверки сервера шеф-повара, ключи AWS, хранящиеся в knife-secrets.rb
, Закрытый ключ SSH EC2, ключи пакета зашифрованных данных и т. Д. Мы определенно не хотим, чтобы они хранились в репозитории - или вообще в любом месте, где они не были надежно зашифрованы. Поэтому мы распространяем эти файлы как .tar.gz
файл, который зашифрован GPG для всех в компании и передается через Dropbox.
Настроить все это становится сложно, и я хочу, чтобы люди в команде действительно использовали это, поэтому есть последний элемент: rake init
задача, которая создает .chef
каталог, символические ссылки config/knife.rb
там расшифровывает и распаковывает chef-secrets.tgz
файл, проверяет наличие личного ключа платформы Opscode пользователя и .chef/knife-local.rb
правильно настроен, содержит символические ссылки для плагинов-ножей и устанавливает соответствующие разрешения для каталога и файлов внутри. Эта задача настроена так, что ее можно безопасно запускать много раз в уже инициализированном репозитории (например, для обновления секретов или плагинов ножа).
Также есть вспомогательная задача, которая переупаковывает все секреты, шифрует архив для всех и копирует его в Dropbox, чтобы упростить добавление новых сотрудников или изменение секретов.
Что касается нескольких сред: у Chef есть функция под названием окружающая среда. Я еще не использовал его, но он должен делать то, что вам нужно. Вы также можете строго разделить производственную среду (чтобы разработчики не имели каких-либо ключей, которые каким-либо образом связаны с производственной средой), создав две отдельные организации Hosted Chef или серверы Chef. Этот фрагмент knife.rb покажите, как настроить нож другим способом на основе текущей проверенной ветки - вы можете использовать это, чтобы установить среду, а также URL-адрес сервера шеф-повара. Есть также плагин Knife под названием knife-flow , обеспечивая более полный рабочий процесс с двумя организациями.
Вам необходимо настроить два сервера Chef, один для производства и один для разработки. Причина в том, что ни один сервер Chef не может поддерживать разветвленную разработку; даже с окружающей средой.
Или вы можете отказаться от концепции сервера Chef и использовать chef-solo. Вы можете вести свои кулинарные книги в Git. Вы можете ветвиться и объединяться. Вы можете игнорировать проблемы с учетными данными ножа, потому что вы больше не будете их использовать.
Вы не сможете использовать поиск с помощью ножа или пакеты данных **. Но некоторым все равно эти функции не нужны.
** Ну, вроде как: http://wiki.opscode.com/display/chef/Data+Bags#DataBags-UsingDataBagswithChefSolo
У меня дома есть два каталога: .chef и chef-repo. Шеф-репо находится в git. .Chef - это некий частный каталог, используемый по умолчанию для Knife. Вам не нужно помещать свои секреты из .chef в git; нож будет искать ~ / .chef.
Ваш каталог ~ / .chef не должен находиться в репозитории git.
У меня есть каталог ~ / projects /, в котором я храню репозиторий Chef. Здесь идут конфигурации моих серверов.
Моя последняя работа была системным инженером в магазине Ruby-on-Rails. Наши конфигурации nginx, varnish и rails (среди прочего) входят в репозиторий chef, но сами приложения Rails хранились в отдельных репозиториях git и развертывались отдельно.
Наша промежуточная среда представляла собой единый сервер, на котором выполнялась вся промежуточная среда. Это было не идеально, потому что это не походило на Production, где Rails тонкие и DB находились в разных коробках. Я бы порекомендовал использовать Chef's Environments для разделения промежуточного и производственного этапов. (Вот как это было, когда я приехал, и у меня просто нет времени исправить это перед отъездом.)