我需要一些帮助来定义厨师食谱中的变量

时间:2016-08-05 18:58:12

标签: ruby chef

这是我想要运行的LDAP命令,它完美地运行:

/opt/openldap/setup —cli —no-prompt —rootUserDN "cn=Directory Manager" — rootUserPasswpord secretpass —hostname localhost —ldapPort 389 —adminConnectorPort 4444 —baseDN "dc=example,dc=com" —addBaseEntry —doNotStart —acceptLicense'

以下是我的厨师属性文件(server.rb

的内容
default["openldap"]["server"]["ROOTDN"] = "cn=Directory Manager"
default["openldap"]["server"]["ROOTPASS"] = "secret pass"
default["openldap"]["server"]["LDAPPORT"] = "389"
default["openldap"]["server"]["ADMINPORT"] = "4444"
default["openldap"]["server"]["BASEDN"] = "dc=example,dc=com"
default["openldap"]["server"]["DJDEST"] = "/opt/openldap"

以下是我的厨师食谱文件(default.rb)的内容

execute 'Ldap: Installing Openldap Instance' do
  command node["openldap"]["server"]["DJDEST"]'/setup --cli --no-prompt--rootUserDN "["openldap"]["server"]["ROOTDN"] " --rootUserPassword ["openldap"]  ["server"]["ROOTPASS"]--hostname ["openldap"]["server"]["ODJFQDN"] --ldapPort ["openldap"]["server"]["LDAPPORT"] --adminConnectorPort ["openldap"]["server"]["ADMINPORT"] --baseDN "["openldap"]["server"]["BASEDN"]" --addBaseEntry --doNotStart --acceptLicense'
  action :run
end

我想使用变量运行执行资源,而不是在代码块中手动硬编码ldap脚本。谁能告诉我我做错了什么?

2 个答案:

答案 0 :(得分:1)

假设我理解你的问题,你想要从几个变量和字符串生成一个字符串。那么您的问题与this one类似。

您可以使用以下内容合并变量a = "foo"的内容和字符串"bar"

a = "foo"
b = a + "bar"

或者您可以使用字符串插值(可能更常见):

a = "foo"
b = "#{a}bar"

两种情况下的结果都是"foobar"

转换到您的主厨上下文,生成的执行资源将是:

execute 'Ldap: Installing Openldap Instance' do
  command "#{node['openldap']['server']['DJDEST']}/setup --cli --no-prompt--rootUserDN "#{node['openldap']['server']['ROOTDN']}" --rootUserPassword #{node['openldap']['server']['ROOTPASS']} --hostname #{node['openldap']['server']['ODJFQDN']} --ldapPort #{node['openldap']['server']['LDAPPORT']} --adminConnectorPort #{node['openldap']['server']['ADMINPORT']} --baseDN "#{node['openldap']['server']['BASEDN']}" --addBaseEntry --doNotStart --acceptLicense"
  action :run
end

如果它使您更容易,您也可以将其提取到变量中:

installLdapCommand = "#{node['openldap']['server']['DJDEST']}/setup --cli --no-prompt--rootUserDN #{node['openldap']['server']['ROOTDN']} --rootUserPassword #{node['openldap']['server']['ROOTPASS']} --hostname #{node['openldap']['server']['ODJFQDN']} --ldapPort #{node['openldap']['server']['LDAPPORT']} --adminConnectorPort #{node['openldap']['server']['ADMINPORT']} --baseDN "#{node['openldap']['server']['BASEDN']}" --addBaseEntry --doNotStart --acceptLicense"
execute 'Ldap: Installing Openldap Instance' do
  command installLdapCommand
  action :run
end

答案 1 :(得分:0)

而不是

"#{node['openldap']['server"]['ROOTDN']} --option"

尝试使用ruby的字符串插值

execute 'Ldap: Installing Openldap Instance' do
  command "#{node['openldap']['server']['DJDEST']}/setup --cli --no-prompt--rootUserDN #{node['openldap']['server']['ROOTDN']} --rootUserPassword #{node['openldap']['server']['ROOTPASS']} --hostname #{node['openldap']['server']['ODJFQDN']} --ldapPort #{node['openldap']['server']['LDAPPORT']} --adminConnectorPort #{node['openldap']['server']['ADMINPORT']} --baseDN #{node['openldap']['server']['BASEDN']} --addBaseEntry --doNotStart --acceptLicense"
  action :run
end

像这样:

{{1}}