如何从 Puppet 模块将行插入到 RDBMS 表中?

如何从 Puppet 模块将行插入到 RDBMS 表中?

我有一个数据库表,我需要在其中插入一行,每个主机都已分配一个特定的傀儡模型。我们称其为傀儡模型foo。该数据库表名为,foo_hosts有三列:idhostnamedate_added。我想以某种方式让我的foo模块执行 SQL...

insert into foo_hosts (hostname) values ( $hostname );

...如果表中还没有主机的行。

答案1

您需要一种从命令行访问数据库的方法。您没有指定正在使用的数据库引擎,因此我假设使用 PostgreSQL,因为这是我最熟悉的。我知道 SQLite 和 MySQL 都有一个允许执行查询的命令行客户端。

首先,我将从一个模块开始:

exec{'insert-missing-hosts':
  command => "/usr/local/bin/update-database ${hostname}",
  require => File['/usr/local/bin/update-database'],
}

file{'/usr/local/bin/update-database':
  source => 'puppet:///modules/your-module/update-database',
  mode   => 0755,
}

脚本update-database可能是:

#!/bin/bash
$HOSTNAME=${1?Missing HOSTNAME}

# add credentials to access the database server to psql's command line options
/bin/echo <<-EOF | /usr/bin/psql --file=- --no-psqlrc --quiet
  INSERT INTO foo_hosts(hostname)
      SELECT '${HOSTNAME}'
    EXCEPT
      SELECT hostname FROM foo_hosts;
EOF

请注意,此 SQL 查询很容易受到攻击:如果攻击者控制了 Puppet,他就可以对您的数据库服务器执行任意命令。当然,如果攻击者控制了 Puppet,您的问题将更加严重。

相关内容