我有一个数据库表,我需要为每个主机分配一个特定的木偶模型插入一行。 让我们称这个傀儡模型为foo 。 db表被称为foo_hosts有三列: id , hostname和date_added 。 我想一些如何让我的foo模块执行SQL …
insert into foo_hosts (hostname) values ( $hostname );
…如果主机的表中没有一行。
您将需要一种从命令行访问数据库的方法。 你不指定你正在使用哪个数据库引擎,所以我会推定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的控制权,那么问题会更加严重。