【问题标题】:I need some assistance defining variables in a chef recipe我需要一些帮助来定义厨师食谱中的变量
【发布时间】:2016-12-12 06:36:19
【问题描述】:

这是我要运行的 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 脚本。谁能告诉我我做错了什么?

【问题讨论】:

  • 嘿。欢迎来到 StackOverflow。我尝试了一些改进语法,但你似乎有几个问题。你用什么引号?能否请您仔细检查您粘贴的所有内容并尝试修复,以便我们解决您真正的问题?
  • 您的问题实际上是ruby中的字符串插值,因此您想将属性和字符串组合在一起吗?喜欢node[...] + '/setup ..' ?

标签: ruby chef-infra


【解决方案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

【讨论】:

  • 感谢斯蒂芬金。下面的 Justmiles 解决方案效果很好。
【解决方案2】:

代替

'["openldap"]["server"]["ROOTDN"] --option'

尝试使用 ruby​​ 的字符串插值

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

像这样:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多