Назад | Перейти на главную страницу

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

Во-первых, я использую 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]'

Моя проблема в том, что я собираюсь запустить сценарий для установки шеф-повара на всех этих разных ящиках, но у каждого из них будет свой промежуточный IP-адрес. http: // [xxxxxx]: 8080 /

Мне нужен способ указать эти 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, а затем, когда я запускаю все команды шеф-повара, я могу настроить таргетинг на каждую из них, которую я хочу.

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

Вы можете создать файл 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).