puppet来管理文件和软件包

puppet来管理文件和软件包

1 exec的使用,可以运行shell命令

为配置文件添加配置,指示写了关键部分,其他配置省略没写

代码示例如下:

[root@pup manifests]# cat wenjian.pp 
class motd::wenjian{
     define append_if_no_such_line($file, $line) {
    exec { "/bin/echo '$line' >> '$file'":
        unless => "/bin/grep -q '$line' '$file'",   #看文件是否存在,不存在在追加
    }
}

append_if_no_such_line { "enable-ip-conntrack":
    file => "/etc/modules", 
    line => "ip_conntrack",
}

}

客户端过程如下

1 Notice: /Stage[main]/Motd::Wenjian/Motd::Wenjian::Append_if_no_such_line[enable-ip-conntrack]/Exec[/bin/echo 'ip_conntrack' >> '/etc/modules']/returns: executed successfully
2 Notice: Finished catalog run in 1.37 seconds
View Code

 2时时保持文件内容的更新

使用 exec 资源将若干配置片段串接成一个文件,示例如下,稍微复杂点

 1 首先创建/etc/puppet/modules/admin/manifests/rsyncdconf.pp文件
 2 class admin::rsyncdconf {
 3     file { "/etc/rrp":
 4         ensure => directory,
 5     }
 6 
 7     exec { "update-rsyncd.conf":
 8         command => "/bin/cat /etc/rrp/*.conf > /etc/rsyxin.conf",
 9         refreshonly => true,
10     }
11 }

然后别忘记在init.pp文件包含这个类,接着

 1 创建如下/etc/puppet/modules/myapp/manifests/rsyncpp.pp
 2 class myapp::rsyncpp {
 3     include admin::rsyncdconf    #包含上边刚创建的类
 4 
 5     file { "/etc/rrp/myapp.conf":
 6         ensure  => present,
 7         source  => "puppet:///modules/myapp/myapp.rsync",
 8         require => File["/etc/rrp"],
 9         notify  => Exec["update-rsyncd.conf"],  文件一旦改变,就会执行
10     }
11 }
12 include myapp::rsyncpp

接着在file里面创建文件

创建 /etc/puppet/modules/myapp/files/myapp.rsync 文件:
[myapp]
    uid = myappuser
    gid = myappuser
    path = /opt/myapp/shared/data
    comment = Data for myapp
    list = no
    read only = no
    auth users = myappuser

在客户端测试

1 Notice: /Stage[main]/Admin::Rsyncdconf/File[/etc/rrp]/ensure: created
2 Notice: /Stage[main]/Myapp::Rsyncpp/File[/etc/rrp/myapp.conf]/ensure: defined content as '{md5}d85e5aa28aca2faf3e32b98e96b405e4'
3 Info: /Stage[main]/Myapp::Rsyncpp/File[/etc/rrp/myapp.conf]: Scheduling refresh of Exec[update-rsyncd.conf]
4 Notice: /Stage[main]/Admin::Rsyncdconf/Exec[update-rsyncd.conf]: Triggered 'refresh' from 1 events
5 Notice: Finished catalog run in 2.04 seconds
View Code

说明下

(notify => Exec["update-rsyncd.conf"]只要 /etc/rrp 目录中有一个配置片段被更新,exec 资源就会执行一次

上面的说法也可以应用到 Apache 的 conf.d 目录或 PHP 的 php-ini.d 目录

 2源码包编译安装的构建(常用)

使用puppet完成以下步骤

  • 下载源码包

  • 解压源码包

  • 配置(Configure)并构建(build)程序

  • 安装已构建的程序

 如下实例:

[root@pup manifests]# cat install_app.pp 
class myapp::install_app{
   exec { "Discuz_X3.2_SC_GBK.zip":
    cwd => "/usr/local/src",
    command => "/usr/bin/wget  http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_GBK.zip"&& /bin/unzip  Discuz_X3.2_SC_GBK.zip && cd   Discuz_X3.2_SC_GBK.zip  && && ./Configure  --prefix=/usr/local &&make  && make install,
    creates =>"/usr/local/Discuz_X3.2_SC_GBK",
    logoutput => on_failure,
    timeout => 0,
}
  

}

说明如下:

exec 命令被 && 运算符分割成了五个阶段。也就是说每个阶段的命令若执行失败, 整个命令将会失败且停止运行。 当你想确保每个子命令都成功运行之后才运行下一个子命令时,这是一种有用的构造方法。

creates =>"/usr/local/Discuz_X3.2_SC_GBK",

由于这是一个漫长的过程,你不想每次运行 Puppet 时都运行它,我们指定了一个条件, 即被创建的文件是否存在,存在的话么就不在执行,无论出于任何原因,如果需要重建,你可以删除此文件。

logoutput => on_failure

错误并非只发生在首次编译的情况。在出现问题时,我们指定了 logoutput 参数, 它将为我们显示编译或构建过程中的出错信息

最后,因为编译过程可能会持续一段时间,所以将 timeout 参数设置成了 0 (默认情况下,Puppet 执行 exec 命令 5 分钟后就会超时)

最后一点

如果你有一批必须从源代码构建的软件,那么将上述的 exec 放入一个 define 函数会使这一构建过程变得更方便,因为你可以使用大致相同的代码构建每个包。

posted @ 2017-01-20 22:39  Dicky_Zhang  阅读(386)  评论(0编辑  收藏  举报