使用 Vagrant 开发 puppet

Puppet 是什么? 请先 Google ~

这篇文章记录一下我本地开发调试 puppet 配置文件的步骤。

实验环境

Mac OS X 10.10 
Vagrant: 1.7.2 
Vagrant box: ubuntu/trusty64 
VirtualBox: 4.3

Vagrant 配置

使用下面 Vagrant 配置定义几个主机。设定好 hostname。

# -*- mode: ruby -*-
# vi: set ft=ruby :

domain = 'localdomain'

puppet_nodes = [  
  {hostname: 'puppet', ip: '192.168.33.10', master: true, fwdhost: 8140, fwdguest: 8140, ram: 512},
  {hostname: 'client1', ip: '192.168.100.11', ram: 512},
  {hostname: 'client2', ip: '192.168.100.12'},
]

Vagrant.configure("2") do |config|  
  config.vm.provision "shell", inline: <<-SHELL
      sudo echo '192.168.33.10 puppet' >> /etc/hosts
  SHELL

  puppet_nodes.each do |node|
    config.vm.define node[:hostname] do |node_config|
      node_config.vm.box = node[:box] ? node[:box] : 'ubuntu/trusty64'
      node_config.vm.box_url = 'http://files.vagrantup.com/' + node_config.vm.box + '.box'
      node_config.vm.hostname = node[:hostname] + '.' + domain
      node_config.vm.network :private_network, ip: node[:ip]
      config.vm.synced_folder "/puppet", "/home/vagrant/puppet"

      if node[:fwdhost]
        node_config.vm.network :forwarded_port, guest: node[:fwdguest], host: node[:fwdhost]
      end

      memory = node[:ram] ? node[:ram] : 256;
      node_config.vm.provider :virtualbox do |vb|
        vb.customize [
          'modifyvm', :id,
          '--name', node[:hostname],
          '--memory', memory.to_s
        ]
      end
    end
  end
end

将上面的配置保存为 Vagrantfile 文件,同时在文件的所在目录建立一个 data 目录,其中的文件会被同步到所有虚拟机的 /data 目录中。

使用 vagrant up 启动虚拟机 , 现在你就有了 3 台主机, 1 台 puppet master, 2 台 client,可使用 vagrant ssh <hostname> 连接进指定的虚拟机。

另:我是在 vagrant 的初始化 shell 中加了如下代码来安装 3.8 版本的 puppet。

wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb  
sudo dpkg -i puppetlabs-release-trusty.deb  
rm puppetlabs-release-trusty.deb  
apt-get update  
apt-get install -y puppet puppetmaster

连接进入 puppet master 主机,使用命令 puppet config print config 打印出 puppet.conf 的路径,在其中加入以下配置:

[main]
environmentpath = /data

[master]
certname = puppet.localdomain  
autosign = true

autosign 是为了避免每次客户端连接的时候需要在 master 手动 sign,但是当在生产环境开启此选项时,请确保你在一个安全的私有网络内。 
environmentpath 配置了多环境的目录,你可以将你的 puppet 环境配置放到你项目的 data 目录中来方便的开发。

多环境开发请参见 文档

在 master 主机上使用 puppet master --no-daemonize 命令来开启一个在前台运行的 master 服务。 
在 client 主机上使用 puppet agent -t 来连接 puppet 主机。

后面开发的流程就是: