【问题标题】:Provisioning with Puppet using Vagrant, correct approach使用 Vagrant 配置 Puppet,正确的方法
【发布时间】:2016-09-05 19:36:54
【问题描述】:

我正在尝试使用 Virtualbox 和 Vagrant 构建一个虚拟环境。目标是能够从 PC 浏览器访问在虚拟机“服务器”上运行的应用程序,该应用程序与虚拟机“数据库”交互。

我设法创建了虚拟机,并且项目没问题。 这是目录结构:

├── MyProject
│   ├── environment
│   │   ├── Vagrantfile
│   │   ├── Manifest
│   │   │   ├── site.pp
│   │   ├── Modules
│   │   │   ├── Java
│   │   │   ├────── manifest
│   │   │   │        ├── init.pp
│   │   │   ├── Postgres
│   │   │   ├────── manifest
│   │   │   │        ├── init.pp
│   │   │   ├── Tomee
│   │   │   ├────── manifest
│   │   │   │        ├── init.pp
│   ├── Project
│   │   ├── postgres-driver 
│   │   ├── tomee.xml 
│   │   ├── app.war

我不确定我使用 Puppet 的方法是否正确。例如,我必须在虚拟机“web”上安装 Java8。 在 Vagrant 文件中:

config.vm.provision :shell do |shell|
    shell.inline = "mkdir -p /etc/puppet/modules;
                   puppet module install puppetlabs/apt"
 end
       config.vm.provision :puppet do |puppet|
    puppet.manifests_path = "puppet/manifests"
    puppet.manifest_file = "site.pp"
    puppet.module_path = "puppet/modules"

然后在Java文件夹的init.pp中:

class java {
    include apt

    apt::ppa { 'ppa:openjdk-r/ppa': 
      ensure => present, } 

    exec { 'apt-update':
      command => '/usr/bin/apt-get update',
      require => [
      Apt::Ppa['ppa:openjdk-r/ppa']
    ],
  }

    package { 'openjdk-8-jdk':
       require  => [
      Exec['apt-update'],
      Apt::Ppa['ppa:openjdk-r/ppa'],
    ],} }

这是使用 Puppet 的有效方式吗?还是应该避免在 Vagrantfile 中使用 shell 命令来安装模块?

我还想知道 Puppet 是如何从这个 init.pp 文件中下载 mysql 的。没有安装 puppet 模块。

class mysql {
  package { ['mysql-server']:
    ensure => present;
  }

  service { 'mysql':
    ensure  => running,
    require => Package['mysql-server'];
  }

  file { '/etc/mysql/my.cnf':
    source  => 'puppet:///modules/mysql/my.cnf',
    require => Package['mysql-server'],
    notify  => Service['mysql'];
  }

  exec { 'set-mysql-password':
    unless  => 'mysqladmin -uroot -proot status',
    command => "mysqladmin -uroot password root",
    path    => ['/bin', '/usr/bin'],
    require => Service['mysql'];
  }

  exec { 'load-dynamic-sql':
    command => 'mysql -u root -proot < /vagrant/sites/dynamic.sql',
    path    => ['/bin', '/usr/bin'],
    require => Exec['set-mysql-password'];
  }
}

【问题讨论】:

    标签: java vagrant puppet provisioning


    【解决方案1】:

    一个问题有好几道题。

    1. 处理 puppet 依赖项或模块

    可能有多种方法来处理它,我还使用 shell 脚本来提供 puppet 模块的安装 - 这样的脚本看起来像

    #!/bin/bash
    
    mkdir -p /etc/puppet/modules;
    
    if [ ! -d /etc/puppet/modules/puppetlabs-java ]; then
      puppet module install puppetlabs-java --version 1.4.1
    fi
    

    在你的内联脚本之上,我检查了 puppet 模块的存在,所以如果我需要稍后运行配置,它会检测到模块是否已安装。其次,我坚持使用特定的模块版本;如果您不是模块所有者,则无法确定演变过程,坚持使用版本会给您提供更高的机会,即配置在几个月内仍能正常工作,否则模块可能已更改,您不知道为什么。

    如前所述,还有其他方法:您可以直接从主机下载模块(但您也需要确保下载模块依赖项);你可以使用图书管理员,vagrant 有插件来管理 puppet 图书管理员的依赖关系。

    1. 使用 puppet 模块

    您可以编写自己的 puppet 模块,最终您将需要编写 shell 命令,但如果您计划分发该模块,您可能需要在 OS 系列上进行测试并根据 OS 编写不同的命令。

    我仍然可能会推荐使用专用模块;在您的情况下,puppetlabs/java 可以完成这项工作

    1. mysql 示例

    您的示例是设置和导入数据库的示例,而不是安装 sql 服务器,它可能在 mysql-server 包中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多