Настройка Chef-Solo-различных override_attributes в одной роли

Прежде всего, я использую Chef Solo и хотел бы, чтобы все было как можно более автоматизированным. Так что у меня есть проблема, которую я не совсем знаю, как ее решить. Я настраиваю развертывание множества различных блоков Linux, и для всех них потребуются настраиваемые узлы / роли установки. Пример:

/nodes/app_server.json

{
"run_list": [ "role[app_server]" ]
}

/roles/app_server.rb

name 'app_server'
description 'App_Server'
override_attributes({ "apache" => {
                                      "proxypass" => [" /  http://localhost:8080/"]
                                  }
                   })
run_list 'recipe[app_server]'

Моя проблема в том, что я собираюсь запустить скрипт для установки chef на все эти разные блоки, но у каждого будет свой IP- адрес между http://%5Bxxxxxx%5D:8080/

Мне нужен способ, чтобы иметь возможность -via командной строки - указать эти IP-адреса без необходимости создания сотен файлов узлов или ролей.

Я посмотрел пример на их сайте, который показывает:

Роль веб-сервера

description "The base role for systems that serve HTTP traffic"
run_list "recipe[apache2]", "recipe[apache2::mod_ssl]", "role[monitor]"
env_run_lists "prod" => ["recipe[apache2]"], "staging" => ["recipe[apache2::staging]"],"_default" => []
default_attributes "apache2" => { "listen_ports" => [ "80", "443" ] }
override_attributes "apache2" => { "max_children" => "50" }

Кажется, что это было бы полезно, но я хотел бы установить разные наборы переопределений для каждой конфигурации env_run_list, а затем, когда я выполню все команды chef, я смогу нацелить каждую из них, которую я хочу.

Я поступаю об этом неправильно? Я просмотрел все документы для узлов / ролей / сред и т. Д. И не нашел ни одного решения, которое требовало бы от меня не создавать дюжину разных файлов.

2 ответа

Вы можете создать файл json для каждого сервера, который содержит только переопределения, и вы можете передать этот файл chef-solo с опцией -j:chef-solo -j node.json

Вы можете создать эти файлы до запуска шеф-повара. Помните, что перенаправление ввода еще не реализовано: https://tickets.opscode.com/browse/CHEF-1918 поэтому вы не можете использовать только одну команду bash.

Но я второй @cwjohnston, что вы должны разделить эту строку и поместить IP, порт и протокол в отдельные атрибуты узла. Вероятно, вы можете найти IP текущего узла с помощью Ohai (node ​​['ipaddress']) или из Ruby и установить разумные значения по умолчанию для последних 2.

Не имея доступа к вашему рецепту app_server, я предполагаю, что вы используете node['apache']['proxypass'] атрибут для заполнения строки в конфигурационном файле apache, сгенерированном из шаблона.

Я предполагаю, что соответствующая строка в вашем шаблоне выглядит примерно так:

ProxyPass <%= node['apache']['proxypass'] %>

Я думаю, вы добьетесь большего успеха, если будете использовать более гранулированные элементы для составления этой строки в вашем шаблоне. Если IP-адрес, к которому вы хотите обратиться через прокси-сервер, будет отличаться в каждой среде, вы можете использовать средства поиска Chef для определения требуемого IP-адреса и передачи этого IP-адреса в шаблон в качестве переменной.

Код в вашем рецепте может выглядеть примерно так:

# this search assumes that the role 'myapp_backend' is in the run list of the backend server you need to discover.
# the search returns an array of node objects, for simplicity we'll just take the first result.
proxypass_backend = search(:node, "roles:myapp_backend AND chef_environment:#{node.chef_environment}").first

template ::File.join(node['apache']['dir'],'sites-available','myapp.conf') do
  variables({
    :proxypass_local_path => '/',
    :proxypass_remote_ip => proxypass_backend['ipaddress'],
    :proxypass_remote_port => '8080',
    :proxypass_remote_path => '/'
  })
  source 'myapp.conf.erb'
end

И строка в вашем шаблоне будет выглядеть примерно так:

ProxyPass <%= @proxypass_local_path %> http://<%= @proxypass_remote_ip %>:<%= proxypass_remote_port %><%= @proxypass_remote_path %>

Для простоты я указал статические значения для удаленного порта и пути, но они также могут быть установлены с использованием значений атрибутов, которые могут быть переопределены на уровне роли или среды. Поскольку поиск возвращает целые объекты узла, любой атрибут узла, возвращаемый поиском (например, порт, на котором работает служба), также может использоваться для заполнения переменных шаблона (например, proxypass_remote_port).

Другие вопросы по тегам