如何在食谱

时间:2016-08-07 00:48:17

标签: ruby ldap chef

以下是用于创建保险库的命令

knife vault create ldapuser user1 -A "admin,chef1.example.com" -J password.json -M client

以下是显示保险库内容的命令

knife vault show ldapuser user1
id:       user1
password: secretp@ssword
username: james

以下是我的食谱,其中包括以下顶部的

chef_gem 'chef-vault' do
  compile_time true if respond_to?(:compile_time)
  action :install
end

require 'chef-vault'

item = ChefVault::Item.load("ldapuser","user1")

execute 'setup ldap' do
 command '/opt/ldap/bin/setup --hostname localhost --port 389 --bindDN cn="Directory Manager" --bindPassword item[password] --ldapport 389 --baseDN "dc=example,dc=com" --addBaseEntry --doNotStart --acceptLicense`
end

execute 'run ldap' do
 command '/opt/ldap/bin/ldapmodify --hostname localhost --port 389 --bindDN cn="Directory Manager" --bindPassword item[password] --filename /opt/ldap.ldif
end

不幸的是,一旦安装完成,我尝试登录到我的ldap服务器,我收到一个无效的凭据错误消息。

我假设它与如何在执行块中定义bindPassword的变量有关。我甚至尝试使用项目['密码']登录,但没有用。但是,当我将密码(而不是使用保险库)硬编码到我的食谱中时,我能够毫无问题地登录。

我到处搜索,似乎无法找到有效的解决方案。请帮忙!

2 个答案:

答案 0 :(得分:1)

Ruby中的字符串插值如下所示:"something #{item['key']} else"

重要位:使用双引号而不是单引号,在表达式周围放置#{},并确保在#{}内正确格式化表达式。

答案 1 :(得分:0)

在这个例子中,我填充了来自chef-vault的秘密的auth.properties和pem文件。 完整的YouTube演示:How to Create and use Chef-Vault

Default.rb食谱

static

以下是模板:

auth.properties.erb

chef_gem 'chef-vault' do
  compile_time true if respond_to?(:compile_time)
end

require 'chef-vault'
secrets = ChefVault::Item.load("vault_demo", "dev_secrets" )

directory "/opt/your_project" do
  action :create
end

template '/opt/your_project/auth.properties' do
  source "auth.properties.erb"
  variables({
    sql_password: secrets['sql_password'],
    application_password: secrets['application_password']
  })
  action :create
end

template '/opt/your_project/server.pem' do
  source "server.pem.erb"
  variables({
    ssl_cert: Base64.decode64(secrets['ssl_cert'])
  })
  action :create
end

server.pem.erb

ssl_password:<%= @sql_password %>
application_password:<%= @application_password %>

请注意,pem文件在配方中被base64解码,因为它必须被编码以存储在Vault中