【问题标题】:How to chain classes with commands如何用命令链接类
【发布时间】:2016-05-24 13:52:54
【问题描述】:

我有以下类,它安装 mysql 并设置一个名为 user 的用户,但是当 create-database 命令运行时,尚未创建用户。 我如何链接命令以便在 create-database 尝试使用它之前创建用户?

class { '::mysql::server':
  package_name            => 'mariadb-server.x86_64',
  root_password           => 'root',
  remove_default_accounts => true,
  override_options        => $override_options,
  restart                 => true,
  users                   => {
    'user@%' => {
      ensure                   => 'present',
      max_connections_per_hour => '0',
      max_queries_per_hour     => '0',
      max_updates_per_hour     => '0',
      max_user_connections     => '0',
      password_hash            => '...',
    }
  },
  grants                  => {
    'user@%/*.*' => {
      ensure     => 'present',
      options    => ['GRANT'],
      privileges => ['ALL'],
      table      => '*.*',
      user       => 'user@%',
    },
  }
}->
exec { 'create-database':
  creates => '/opt/dbinstalled',
  command => '/usr/bin/mysql -u user -puser < /create-db.sql'
}

我正在使用 puppetlabs-mysql 包安装 mysql。

【问题讨论】:

标签: puppet librarian-puppet


【解决方案1】:

您应该查看require, before, subscribe, notify 元参数的文档。它们用于描述资源排序 (before, notify),或者如果依赖失败 (require, subscribe) 时资源排序和失败。请注意,subscribe, notify 元参数仅适用于某些资源类型(exec, service 等)。

在这种情况下,您将执行以下操作来链接一个类:

exec { 'create-database':
  creates => '/opt/dbinstalled',
  command => '/usr/bin/mysql -u user -puser < /create-db.sql',
  require => Class[::mysql::server],
}

但是你真的只需要对用户资源的依赖:

exec { 'create-database':
  creates => '/opt/dbinstalled',
  command => '/usr/bin/mysql -u user -puser < /create-db.sql',
  require => User[username or array of users],
}

另外你可能只想创建一次数据库,所以我们可以给它一个subscribe/refreshonly 来实现幂等性:

exec { 'create-database':
  creates     => '/opt/dbinstalled',
  command     => '/usr/bin/mysql -u user -puser < /create-db.sql',
  subscribe   => User[username or array of users],
  refreshonly => true,
}

请注意,如果您更改create-database 订阅的user 资源,这将重新运行exec 资源,因此请查看execunless, onlyif 参数作为建立幂等性的其他方法。

【讨论】:

  • 我最终不得不添加 require => [Mysql_grant['user@%/*.*'], Mysql_user['@user.mdlocal']]
  • 哦,那是实际的资源。我应该检查一下类生成的实际资源是什么。您是否尝试过使 exec 资源具有幂等性,还是没有必要?
  • /opt/dbinstalled 在此命令期间被创建,因此创建应在下一次配置时停止运行。
  • 好点;我很少使用 created 属性,所以我忘记了它的存在。
猜你喜欢
  • 2019-03-01
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
相关资源
最近更新 更多