我在Puppet Master上有以下清单:
exec { 'DatabaseCreation':
command => '/usr/bin/mysqladmin -u root --password="system" create gitHandson'
}
当我在Puppet Agent上运行puppet agent --test
时,它出现以下错误:
Notice: /Stage[main]/Deployment/Exec[DatabaseCreation]/returns: /usr/bin/mysqladmin: CREATE DATABASE failed; error: 'Can't create database 'gitHandson'; database exists'
Error: /usr/bin/mysqladmin -u root --password="system" create gitHandson returned 1 instead of one of [0]
它应该忽略错误,而不是给出错误。为此,我们在Chef中有'ignore_failure',在Ansible中有'ignore_errors'。它的Puppet等价物是什么?
答案 0 :(得分:4)
简答:不。 Puppet资源必须成功,没有办法忽略错误。
最简单(也是最苛刻)的解决方案是在命令末尾添加&& true
,这样它就会返回0并且不会失败。
然而,exec的问题在于它不是幂等的。 Puppet是关于描述状态并确保事情只需要运行一次。
因此,对于您的示例,扩展exec以添加unless
或onlyif
参数可能会更好,因此该命令仅在数据库尚不存在时运行。
exec { 'DatabaseCreation':
command => '/usr/bin/mysqladmin -u root --password="system" create gitHandson',
unless => 'Some command that exits 0 if the gitHandson database exists'
}
更多详情here.
更好,有一个Puppetlabs MySQL module,允许您安装mysql,设置root密码并创建MySQL数据库。
示例:
mysql::db { 'mydb':
user => 'myuser',
password => 'mypass',
host => 'localhost',
grant => ['SELECT', 'UPDATE'],
}
答案 1 :(得分:1)
这是exec
资源的经典示例,它不是幂等的。好消息是:有些工具可以自动检测脚本中的这些问题。看看这个:https://github.com/citac/citac
Citac系统地以各种配置,不同的资源执行顺序等执行您的Puppet清单。生成的测试报告会告知您有关非幂等资源,融合相关问题等的问题。
该工具使用Docker容器执行,因此您的系统在测试时保持不变。
还有一个评估页面,在公共Puppet脚本中发现了许多类似的错误:http://citac.github.io/eval
快乐的木偶测试!