在安装官方提供的开源版本的 Puppet 软件之前,Puppet Server 和 agent 首先需要都安装官方的软件源 (Puppet 对各种 Linux 发行版都有提供支持,本文以 Ubuntu 14.04 系统为例):
下载官方软件源的安装包:
wget https://apt.puppetlabs.com/puppetlabs-release-pc1-trusty.deb
更新软件源:
sudo dpkg -i puppetlabs-release-pc1-trusty.deb sudo apt-get update
安装 Puppet Server
sudo apt-get install puppetserver
启动 PuppetServer
sudo service puppetservice start
安装 PuppetAgent
sudo apt-get install puppet-agent
编辑/etc/puppetlabs/puppet/puppet.conf 文件,设置该 agent 的 puppet server 的地址:
[main] server = puppetmaster
注:puppetmaster 是 puppetserver 的主机名。
启动 puppet service
sudo /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true
编写第一个配置文件
第一个 Hello World 配置文件
作为第一个实例配置文件,我们想让节点做一件最简单的事情:在/etc/文件夹下面创建一个文件 helloworld.txt,文件的内容是”hello world from puppet!\n”。
首先我们在 puppetserver 上进入/etc/puppetlabs/code/environments/production/manifests 文件夹,创建 site.pp 文件:
node puppetagent { file { 'helloworld': path => '/etc/helloworld.txt', owner => 'root', group => 'root', mode => '655', content => "hello world from puppet!\n", } }
site.pp 就是节点的配置文件,里面可以包含对各个节点的配置描述。在实例配置文件中,”puppetagent”就是节点的主机名。包含在 puppetagent 中的配置描述就是该节点的资源集合的描述。
配置文件创建好后,节点会周期性地查询 PuppetServer 来获取自己的配置文件并在本地应用。当然 Puppet 也支持手动获取自己的配置。在本例中,我们通过手动的方式来进行配置更新。我们在 PuppetAgent 上手动执行命令:
root@puppetAgent:/opt/puppetlabs/bin# ./puppet agent --test 2016-05-21 14:24:14.858673 WARN puppetlabs.facter - locale environment variables were bad; continuing with LANG=C LC_ALL=C Info: Using configured environment 'production' Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for puppetagent Info: Applying configuration version '1463811856' Notice: /Stage[main]/Main/Node[puppetagent]/File[helloworld]/ensure: defined content as '{md5}c3aa68786c58c94ef6f3e2399920f268' Notice: Applied catalog in 0.02 seconds root@puppetAgent:/opt/puppetlabs/bin# cat /etc/helloworld.txt hello world from puppet!
我们看到节点成功从 Puppet Server 获取配置文件,并且在本地应用,对应的文件成功创建。
进阶:执行脚本任务作为进阶的任务,我们希望节点可以执行一些更加复杂一点的任务。我们希望节点可以从 PuppetServer 获取一个命令脚本,并且执行该脚本。
我们首先在/etc/puppetlabs/code/environments/production/modules 中创建一个名叫”test”的模块,在 test 模块下面创建一个”files”文件夹。在这个文件夹里的文件是可以被节点获取的。然后我们在这个”files”文件夹里创建一个 shell 脚本 test.sh,路径如下:
/etc/puppetlabs/code/environments/production/modules/test/files/test.sh
test.sh 文件内容:
touch /etc/helloworld.log echo "helloworld" >> /etc/helloworld.log
该脚本会在/etc/目录下创建 helloworld.log 文件,然后在文件里添加”hello world”内容。
进入目录/etc/puppetlabs/code/environments/production/manifests,然后我们再来编辑 site.pp 文件:
node puppetagent { file { 'test.sh': path => '/etc/test.sh', owner => 'root', group => 'root', mode => '655', source => 'puppet:///modules/test/test.sh', } exec { 'execute ': command => 'bash /etc/test.sh', require => File['test.sh'], path => ["/bin/"], } }
其中,我们定义了两个资源:一个文件资源和一个执行命令资源。同时这两个资源有依赖关系,命令执行资源依赖于文件资源,所以 Puppet 会优先处理文件资源。执行命令资源会在文件资源存在后再执行。
我们看下客户端的执行结果:
root@puppetAgent:/opt/puppetlabs/bin# ./puppet agent --test 2016-05-21 15:39:39.817370 WARN puppetlabs.facter - locale environment variables were bad; continuing with LANG=C LC_ALL=C Info: Using configured environment 'production' Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for puppetagent Info: Applying configuration version '1463816381' Notice: /Stage[main]/Main/Node[puppetagent]/File[test.sh]/ensure: defined content as '{md5}2ce060ad2ddab2fe416ca8fb6f8da32a' Notice: /Stage[main]/Main/Node[puppetagent]/Exec[execute ]/returns: executed successfully Notice: Applied catalog in 0.05 seconds root@puppetAgent:/opt/puppetlabs/bin# cat /etc/helloworld.log helloworld
我们可以看到,helloworld.log 文件被正确的创建,说明脚本文件被正确地执行。
结束语