web-dev-qa-db-ja.com

AWS opsworks Chefクックブックをローカルで作成してテストするための最良のワークフローは何ですか?

何ヶ月もの間、opsworksにプッシュする前に、ローカルでawsopsworksクックブックを構築およびテストするための最適なワークフローを見つけるのに苦労してきました。

何度も行き詰まった試みの後で、Mike Greilingによるブログ投稿を見つけ、それ以来、私にとってうまく機能する環境に落ち着きました。動く部分がたくさんあるので、セットアップ/構成を共有したいと思います。

シェフ用の独自のビルド/テスト環境を持っていて、特にopsworksクックブックを対象としている人は、ここにも回答を投稿することをお勧めします- -ありがとう!!。

1
Peter M

Mike Greilingのブログ投稿 Simplify OpsWorks Development With Packer と彼のgithubリポジトリ opsworks-vmをチェックすることを強くお勧めします。 opsworksエージェントのインストールを含むopsworksスタック全体をモックして、アプリのデプロイレシピ、複数のレイヤー、複数のインスタンスなどを同時にテストすることもできます。これは非常に印象的です。

MikeGreilingのPackerVirtualboxビルドを使用する前に、環境を準備するために必要なすべてのセットアップを含めました。

Ubuntu14.04でのクイックスタート

注:virtualboxは64ビットマシンのネストされた仮想化をサポートしていないため、これはubuntu仮想マシンからは実行できません。

  1. インストール ChefDK
    1. _mkdir /tmp/packages && cd /tmp/packages_
    2. _wget https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chefdk_0.8.1-1_AMD64.deb_
    3. _Sudo dpkg -i chefdk_0.8.0-1_AMD64.deb_
    4. _cd /opt/chefdk/_
    5. _chef verify_
    6. _which Ruby_
    7. echo 'eval "$(chef Shell-init bash)"' >> ~/.bash_profile && source ~/.bash_profile
  2. インストール VirtualBox
    1. _echo 'deb http://download.virtualbox.org/virtualbox/debian vivid contrib' > /etc/apt/sources.list.d/virtualbox.list_
    2. _wget -q https://www.virtualbox.org/download/Oracle_vbox.asc -O- | Sudo apt-key add -_
    3. _Sudo apt-get update -qqy_
    4. _Sudo apt-get install virtualbox-5.0 dkms_
  3. インストール Vagrant
    1. _cd /tmp/packages_
    2. _wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.4_x86_64.deb_
    3. _Sudo dpkg -i vagrant_1.7.4_x86_64.deb_
    4. _vagrant plugin install vagrant-berkshelf_
    5. _vagrant plugin install vagrant-omnibus_
    6. _vagrant plugin list_
  4. インストール Packer
    1. _mkdir /opt/packer && cd /opt/packer_
    2. _wget https://dl.bintray.com/mitchellh/packer/packer_0.8.6_linux_AMD64.Zip_
    3. _unzip packer_0.8.6_linux_AMD64.Zip_
    4. _echo 'PATH=$PATH:/opt/packer' >> ~/.bash_profile && source ~/.bash_profile_
  5. Packer を使用してMikeGreilingの opsworks-vm virtualboxイメージをビルドします。
    1. _mkdir ~/packer && cd ~/packer_
    2. _git clone https://github.com/pixelcog/opsworks-vm.git_
    3. _cd opsworks-vm_
    4. _rake build install_
    5. これにより、新しいvirtualbox vmが〜/ .vagrant.d/boxes/ubuntu1404-opsworks /にインストールされます。

単一のopsworksインスタンスをモックするには、次のように新しいVagrantfileを作成します。

_Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu1404-opsworks"
  config.vm.provision :opsworks, type: 'Shell', args: 'path/to/dna.json'
end
_

_dna.json_ファイルパスはVagrantfileを基準にして設定され、OpsWorksChefに送信するJSONデータが含まれている必要があります。

例えば:

_{
  "deploy": {
    "my-app": {
      "application_type": "php",
      "scm": {
        "scm_type": "git",
        "repository": "path/to/my-app"
      }
    }
  },
  "opsworks_custom_cookbooks": {
    "enabled": true,
    "scm": {
      "repository": "path/to/my-cookbooks"
    },
    "recipes": [
      "recipe[opsworks_initial_setup]",
      "recipe[dependencies]",
      "recipe[mod_php5_Apache2]",
      "recipe[deploy::default]",
      "recipe[deploy::php]",
      "recipe[my_custom_cookbook::configure]"
    ]
  }
}
_

複数のopsworksインスタンスをモックしてレイヤーを含めるには、彼の AWS OpsWorks "Getting Started" Example を参照してください。これには以下の stack.json が含まれます。

Vagrantfile(複数のインスタンス用)

_Vagrant.configure("2") do |config|

  config.vm.box = "ubuntu1404-opsworks"

  # Create the php-app layer
  config.vm.define "app" do |layer|

    layer.vm.provision "opsworks", type:"Shell", args:[
      'ops/dna/stack.json',
      'ops/dna/php-app.json'
    ]

    # Forward port 80 so we can see our work
    layer.vm.network "forwarded_port", guest: 80, Host: 8080
    layer.vm.network "private_network", ip: "10.10.10.10"
  end

  # Create the db-master layer
  config.vm.define "db" do |layer|

    layer.vm.provision "opsworks", type:"Shell", args:[
      'ops/dna/stack.json',
      'ops/dna/db-master.json'
    ]

    layer.vm.network "private_network", ip: "10.10.10.20"
  end
end
_

stack.json

_{
  "opsworks": {
    "layers": {
      "php-app": {
        "instances": {
          "php-app1": {"private-ip": "10.10.10.10"}
        }
      },
      "db-master": {
        "instances": {
          "db-master1": {"private-ip": "10.10.10.20"}
        }
      }
    }
  },
  "deploy": {
    "simple-php": {
      "application_type": "php",
      "document_root": "web",
      "scm": {
        "scm_type": "git",
        "repository": "dev/simple-php"
      },
      "memcached": {},
      "database": {
        "Host": "10.10.10.20",
        "database": "simple-php",
        "username": "root",
        "password": "correcthorsebatterystaple",
        "reconnect": true
      }
    }
  },
  "mysql": {
    "server_root_password": "correcthorsebatterystaple",
    "tunable": {"innodb_buffer_pool_size": "256M"}
  },
  "opsworks_custom_cookbooks": {
    "enabled": true,
    "scm": {
      "repository": "ops/cookbooks"
    }
  }
}
_

Vagrantに慣れていない場合は、_vagrant up_を実行してインスタンスを開始します。次に、クックブックをローカルで変更し、_vagrant provision._を使用して既存のインスタンスに対してchefを再実行することで、変更を適用できます。_vagrant destroy_および_vagrant up_を最初から実行できます。 。

4
Peter M