2015-04-24 2 views
1

В рецепте шеф-повара, вызывается chef-solo/vagrant. Я пытаюсь написать файл .htpasswd с объекта пользователей. Уточняю пользователей в vagrantfile, как это ...Написать пользователям .htpasswd в рецепте шеф-повара

chef.json = { 
     :apache => { 
      ... 
      :my_users => { 
       :john => "test", 
       :matt => "test2" 
      } 
      ... 

Мой рецепт шеф выглядит, как это в данный момент:

file "/etc/apache2/.htpasswd" do 
    content "john:n5MfEoHOIQkKg" 
    owner "#{node['apache']['user']}" 
    group "#{node['apache']['group']}" 
    mode '0644' 
    action :create 
end 

Как вы можете видеть, я жёстко полномочия Джона там - однако , Я не являюсь разработчиком Ruby и мне не хватает некоторых базовых знаний ...

Как написать все пользовательские учетные данные в атрибуте node['apache']['my_users'] (определенные в chef.json) в цикле в файл а - создание хэша пароля для каждого текстового пароля?

Примечание. Я пытаюсь избежать использования шаблона для этого простого файла.

+0

Почему вы «пытаетесь чтобы избежать использования шаблона "? Если ваш ввод является открытым текстом, нужно сделать вычисление для хеширования учетных данных где-нибудь, если не в шаблоне, а затем в вашем коде рецепта. Если у вас есть несколько пользователей, шаблон будет способом их перебора. (иначе у вас есть цикл и построение строки в ruby). Шаблон кажется подходящим решением. – Charlie

+0

Ну, я думал, что шаблон будет излишним для такого рода вещей. Но если вы не согласны, я открыт для предложений и с удовольствием делаю это с помощью шаблонов. В любом случае, у меня не было бы представления о том, как добавить вызов к 'htpasswd' в созвездие. – phpPhil

+0

Итак, существует несколько способов реализовать это, вызывая 'htpasswd' для управления файлом и его содержимым (возможно, глядя на создание ресурса [execute resource] (https://docs.chef.io/resource_execute.html) для [каждый] (http://ruby-doc.org/core-2.2.0/Hash.html#method-i-each) имя пользователя/пароль. Другой способ - полностью управлять файлом в рубине. сделайте это, чтобы построить большую строку и передать ее файловому ресурсу в качестве содержимого, а другой - использовать шаблон для генерации файла. – Charlie

ответ

2

Я получил эту работу, используя the LWRP Charlie suggested.

Первый шаг, чтобы изменить определение пользователей, чтобы иметь надлежащий массив:

chef.json = { 
    :apache => { 
     ... 
     :my_users => [ 
      { :username => "john", :password => "test1" }, 
      { :username => "matt", :password => "test2" } 
     ] 
     ... 

I включают зависимость Htpasswd к метаданным и bershelf. Тогда в моем рецепте я создаю пользователей в цикле, используя Htpasswd вызов:

node[:apache][:my_users].each do |user| 
    htpasswd "/etc/apache2/.htpasswd" do 
    user user['username'] 
    password user['password'] 
    end 
end 
0

Эта страница htpasswd выглядит так, как будто она использует хеширование MD5 на паролях.

Возможно, вы можете generate md5 hashes в вашем Ruby-коде вашего рецепта?

+0

Да, я знаю, что он создает хэши с конкретной реализацией MD5 в Apache. команда создает хэш для меня :) Именно об этом и говорит мой вопрос - я не достаточно знать Ruby для создания цикла, выполнить htpasswd и записать его в файл. Звучит довольно основательно и, вероятно, для разработчика Ruby, но не для меня. – phpPhil

0

Вы можете сделать это нативный путь, он требует htpasswd быть установлены:

execute 'set password' do 
    sensitive true 
    command "htpasswd -cb /etc/htpasswd.users #{user} #{password}" 
    creates '/etc/htpasswd.users' 
end 

file '/etc/htpasswd.users' do 
    owner 'www-data' 
    group 'www-data' 
    mode 0o600 
end 
Смежные вопросы