Puppet使用2个不同的命令安装DS,并且仅当

Puppet使用2个不同的命令安装DS,并且仅当,puppet,puppet-enterprise,Puppet,Puppet Enterprise,我对木偶不是很有经验,我真的需要你的帮助 我有两个服务器,我需要安装DS(编辑目录服务器)。正在运行,但在服务器中未运行这些命令。我做错了什么 exec{“安装第一个DS”: command=>“setup--serverId first ds--deploymentKeyPassword${prof_ds::constants::deployment_pwd}--deploymentKey${prof_ds::constants::admin_user}--rootUserPassword${

我对木偶不是很有经验,我真的需要你的帮助

我有两个服务器,我需要安装DS(编辑目录服务器)。正在运行,但在服务器中未运行这些命令。我做错了什么

exec{“安装第一个DS”:
command=>“setup--serverId first ds--deploymentKeyPassword${prof_ds::constants::deployment_pwd}--deploymentKey${prof_ds::constants::admin_user}--rootUserPassword${prof_ds::constants::constants::deployment_key}--${prof_ds::constants::ldap_port}--ldapsPort${prof_ds::constants::ldaps_port}--httpsPort${prof_ds::constants::https_port}--adminConnectorPort${prof_ds::constants::replication_port}--start--acceptLicense“,
onlyif=>test“${::fqdn}”=“${ds_hosts[0]}”和&echo 0 | | echo 1'],
环境=>[“JAVA_HOME=${JAVA_HOME}],
路径=>['/usr/bin'、'/usr/sbin'、'/bin'、'/opt/opendj'、'/opt/opendj/bin'],
}
exec{“安装第二个DS”:
command=>“setup--serverId第二个ds--deploymentKeyPassword${prof_ds::constants::deployment_pwd}--deploymentKey${prof_ds::constants::admin_user}--rootUserPassword${prof_ds::constants::constants::deployment_key}--${prof_ds::constants::ldap_port}--ldapsPort${prof_ds::constants::ldaps_port}--httpsPort${prof_ds::constants::admin_port}--replicationPort${prof_ds::constants::replication_port}--BootstrapApplicationServer${ds_hosts[0]}:${prof_ds::constants::replication_port}--start--acceptLicense“,
onlyif=>test“${::fqdn}”=“${ds_hosts[1]}”和&echo 0 | | echo 1'],
环境=>[“JAVA_HOME=${JAVA_HOME}],
路径=>['/usr/bin'、'/usr/sbin'、'/bin'、'/opt/opendj'、'/opt/opendj/bin'],
}

我认为您的命令是正确的。因此可能需要修复的是
onlyif
命令,这意味着将运行exec命令
onlyif
它将返回一个非零输出()。该命令将在使用双引号时运行,并且将在使用单引号时不会运行(是Ruby标准而不是Puppet)

完整代码:

if$::hostname==$ds\u hosts[0]{
exec{“设置第一个ds”:
command=>“setup--serverId first ds--deploymentKeyPassword${prof_ds::constants::deployment_pwd}--deploymentKey${prof_ds::constants::admin_user}--rootUserPassword${prof_ds::constants::constants::deployment_key}--${prof_ds::constants::ldap_port}--ldapsPort${prof_ds::constants::ldaps_port}--httpsPort${prof_ds::constants::https_port}--adminConnectorPort${prof_ds::constants::replication_port}--start--acceptLicense“,
onlyif=>[“test'${::fqdn}'='${ds_hosts[0]}'和&echo 0 | | echo 1”],
环境=>[“JAVA_HOME=${JAVA_HOME}],
路径=>['/usr/bin'、'/usr/sbin'、'/bin'、'/opt/opendj'、'/opt/opendj/bin'],
}
}
如果$::主机名==$ds\U主机[1]{
exec{“设置第二个ds”:
command=>“setup--serverId第二个ds--deploymentKeyPassword${prof_ds::constants::deployment_pwd}--deploymentKey${prof_ds::constants::admin_user}--rootUserPassword${prof_ds::constants::constants::deployment_key}--${prof_ds::constants::ldap_port}--ldapsPort${prof_ds::constants::ldaps_port}--httpsPort${prof_ds::constants::admin_port}--replicationPort${prof_ds::constants::replication_port}--BootstrapApplicationServer${ds_hosts[0]}:${prof_ds::constants::replication_port}--start--acceptLicense“,
onlyif=>[“test'${::fqdn}'='${ds_hosts[1]}'和&echo 0 | | echo 1”],
环境=>[“JAVA_HOME=${JAVA_HOME}],
路径=>['/usr/bin'、'/usr/sbin'、'/bin'、'/opt/opendj'、'/opt/opendj/bin'],
}
}
更新: 我建议的另一个优化是避免测试空字符串(取决于操作系统/版本),方法是在前面添加另一个字符,例如
x

test 'x${::fqdn}' == 'x${ds_hosts[0]}' && echo 0 || echo 1
更新: 更多关于如何以一种非常简单的经验方式限制特定节点上的exec()的信息(也更新了上面的代码片段)

但是,在特定节点上限制特定执行的正确方法是使用两个节点组:
目录服务主节点
目录服务辅助节点
,将每个节点固定到其对应节点,并使用该功能在不同节点上分配工作

另一个注意事项是,您应该避免使用
exec
资源,因为它们不是幂等的。如果不可能,请定义一个类型来包装该资源并管理其所有生命周期。在您的情况下,可能类似于:

目录服务{'first ds':
deploymentKeyPassword=>“?”,
deploymentKey=>“?”,
}

稍后,当您了解如何管理DS服务的配置时,可能会出现这种情况。要获得灵感,请查看。关于DS,有一个模块引起了我的注意:

如果您的
属性在多个级别上都是无意义的,那么您的另一个答案会指出其中一些,但为了完整性:

  • Exec
    onlyif
    属性应该是单个命令,作为一个字符串。通过对实际呈现的数组进行字符串化,您可能很幸运,但您确实应该将它们设置为纯字符串

  • 通过将
    onlyif
    命令放在单个
      if $::fqdn == $ds_hosts[0] {
        exec { 'Install first DS':
          command     => "setup  --serverId first-ds ...",
          environment => ["JAVA_HOME=${java_home}"],
          path        => ['/usr/bin', '/usr/sbin', '/bin', '/opt/opendj','/opt/opendj/bin'],
          unless      => "exit_with_status_0_if_DS_is_already_installed",
        }
      } elsif $::fqdn == $ds_hosts[1] {
        exec { 'Install second DS':
          command     => "setup  --serverId second-ds  ...",
          environment => ["JAVA_HOME=${java_home}"],
          path        => ['/usr/bin', '/usr/sbin', '/bin', '/opt/opendj','/opt/opendj/bin'],
          unless      => "exit_with_status_0_if_DS_is_already_installed",
        }
      }