什么是Puppet相当于Chef中的'ignore_failure'或者Ansible中的'ignore_errors'?

时间:2016-03-18 06:33:26

标签: puppet devops

我在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等价物是什么?

2 个答案:

答案 0 :(得分:4)

简答:不。 Puppet资源必须成功,没有办法忽略错误。

最简单(也是最苛刻)的解决方案是在命令末尾添加&& true,这样它就会返回0并且不会失败。

然而,exec的问题在于它不是幂等的。 Puppet是关于描述状态并确保事情只需要运行一次。

因此,对于您的示例,扩展exec以添加unlessonlyif参数可能会更好,因此该命令仅在数据库尚不存在时运行。

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

快乐的木偶测试!