我有一个数据库表,我需要在其中插入一行,每个主机都已分配一个特定的傀儡模型。我们称其为傀儡模型foo
。该数据库表名为,foo_hosts
有三列:id
、hostname
和date_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,您的问题将更加严重。