•  从Cron运行Puppet

 
  
  1. cron { "run-puppet"
  2.     command => "/usr/sbin/puppet agent --test"
  3.     minute  => inline_template("<%= hostname.hash.abs % 60 %>"), 
  4. service { "puppet"
  5.     ensure => stopped, 
  6.     enable => false

 

  • 显示命令的输出结果

     

logoutput 参数定义如下的 exec 资源:

 
      
  1. exec { "this-will-fail"
  2.     command   => "/bin/ls file-that-doesnt-exist"
  3.     logoutput => on_failure, 
工作原理

现在,如果命令执行失败,Puppet 同时会打印命令的错误输出:

 
     
  1. notice: /Stage[main]//Node[cookbook]/Exec[this-will-fail]/returns: /bin/ 
  2. ls: cannot access file-that-doesnt-exist: No such file or directory 
  3. err: /Stage[main]//Node[cookbook]/Exec[this-will-fail]/returns: change 
  4. from notrun to 0 failed: /bin/ls file-that-doesnt-exist returned 2 
  5. instead of one of [0] at /etc/puppet/manifests/nodes.pp:11 
更多用法

你可以使用如下的配置为所有的 exec 资源设置打印错误输出的默认值:

 
      
  1. Exec { 
  2.     logoutput => on_failure, 

若不管命令执行成功与否,你都想看到其输出,需使用如下的配置:

 
     
  1. logoutput => true
  •  创建备份文件

 

只需要在配置清单中指定 backup 参数的值:

 
     
  1. file { "/etc/sudoers"
  2.     mode => "440"
  3.     source => "puppet:///modules/admin/sudoers"
  4.     backup => ".bak"

现在,如果 Puppet 替换了旧文件,就会在原始路径下面创建一个扩展名为 .bak 的备份文件。 若希望 Puppet 对所有的文件执行这样的默认备份策略,可以在配置清单中使用如下代码:

 
     
  1. File { 
  2.     backup => ".bak"

要完全禁用备份,使用下面的代码:

 
     
  1. backup => false,  
  •  使用 define 资源

 

操作步骤
  1. 在配置清单中添加如下代码:

     
             
    1. define tmpfile() { 
    2.     file { "/tmp/$name"
    3.         content => "Hello, world"
    4.     } 
    5.  
    6. tmpfile { ["a""b""c"]: } 
  2. 运行 Puppet:

     
            
    1. notice: /Stage[main]//Node[cookbook]/Tmpfile[a]/File[/tmp/a]/ 
    2. ensure: defined content as '{md5}bc6e6f16b8a077ef5fbc8d59d0b931b9' 
    3. notice: /Stage[main]//Node[cookbook]/Tmpfile[b]/File[/tmp/b]/ 
    4. ensure: defined content as '{md5}bc6e6f16b8a077ef5fbc8d59d0b931b9' 
    5. notice: /Stage[main]//Node[cookbook]/Tmpfile[c]/File[/tmp/c]/ 
    6. ensure: defined content as '{md5}bc6e6f16b8a077ef5fbc8d59d0b931b9' 
工作原理

你可以认为 define 就像是一个饼干切割器。它描述了一种模式,Puppet 可以用它创建许多类似的资源。任何时候你都可以在你的配置清单中声明 tmpfile 实例,Puppet 将会插入包含在 tmpfile 定义中的所有资源。

在我们的例子中,名为 tmpfiledefine 包含了一个 file 资源, 其 content"Hello, world";其 path"/tmp/$name"。 如果你用名字 foo 声明了一个 tmpfile 实例,如下所示:

 
     
  1. tmpfile { "foo": } 

会被 Puppet 要创建的实例名字所代替。这就像是我们创建了一个新的资源类型: tmpfile,它包含一个参数(即其名字)。

与常规资源一样,我们不仅可以为其传递一个字符串的名字,我们还可以传递一个数组名, Puppet 会对每一个数组元素创建一个 tmpfile 实例,就像上面的例子那样。

更多用法

在上面的例子中,我们定义的 define 仅有一个名字参数,不同实例的名字不同。 但是我们可以为其添加任何我们想要的参数,只要我们在 define 中声明这些参数即可:

 
      
  1. define tmpfile( $greeting ) { 
  2.     file { "/tmp/$name"
  3.         content => $greeting, 
  4.     } 

当我们声明一个资源的实例时,可以为其传递参数值,例如:

 
     
  1. tmpfile{ "foo": greeting => "Hello, world" } 

你可以使用逗号间隔的列表同时声明多个参数:

 
      
  1. define webapp( $domain, $path, $platform ) { 
  2.     ... 
  3.  
  4. webapp { "mywizzoapp"
  5.     domain   => "mywizzoapp.com"
  6.     path     => "/var/www/apps/mywizzoapp"
  7.     platform => "Rails"