2014-03-05 4 views
3

설정하고 그 문제에 대해 실행됩니다: 어느 EC2_AMITOOL_HOME 또는 EC2_HOME 환경 변수는 내가 아마존 AMI를 구축하는 포장을 사용

  1. 기본 AMI (ami-a4bdd194가) ec2-ami-tools 그래서 내가 쓴 설치되어 있지 않습니다 provision 속성을 사용하여 설치하는 작은 스크립트.
  2. /usr/local/bin에 성공적으로 설치되었지만 AMI를 빌드 할 때 여전히 다음과 같은 오류가 발생합니다.

도움이 될 것입니다. 감사!

// 콘솔 오류 로그

amazon-instance: /usr/local/bin/ec2-bundle-vol: line 3: EC2_HOME: Neither of EC2_AMITOOL_HOME or EC2_HOME environment variables are set 
    amazon-instance: 
    amazon-instance: 
    amazon-instance: 
    amazon-instance: 
    amazon-instance: 
==> amazon-instance: Volume bundling failed. Please see the output above for more 
==> amazon-instance: details on what went wrong. 

// packer.json

{ 
    "variables": { 
    "access_key": "", 
    "secret_key": "", 
    "x509_cert_path": "", 
    "x509_key_path": "" 
    }, 
    "builders": [ 
    { 
     "access_key": "{{user `access_key`}}", 
     "secret_key": "{{user `secret_key`}}", 
     "x509_cert_path": "{{user `x509_cert_path`}}", 
     "x509_key_path": "{{user `x509_key_path`}}", 
     "account_id": "123456789012", 
     "ami_name": "my-packer-example {{timestamp}}", 
     "instance_type": "i2.xlarge", 
     "region": "us-west-2", 
     "s3_bucket": "my_bucket/my_folder", 
     "source_ami": "ami-a4bdd194", 
     "ssh_username": "ubuntu", 
     "type": "amazon-instance" 
    } 
    ], 
    "provisioners": [ 
    { 
     "type": "shell", 
     "scripts": [ 
     "../tools/install-ec2-ami-tools.bash" 
     ] 
    } 
    ] 
} 

// 설치-EC2-AMI-tools.bash

#!/bin/bash 

function trimString() 
{ 
    echo "${1}" | sed -e 's/^ *//g' -e 's/ *$//g' 
} 

function isEmptyString() 
{ 
    if [[ "$(trimString ${1})" = '' ]] 
    then 
     echo 'true' 
    else 
     echo 'false' 
    fi 
} 

function installEC2AMITools() 
{ 
    if [[ "$(isEmptyString ${EC2_HOME})" = 'true' || "$(which 'ec2-bundle-vol')" = '' ]] 
    then 
     sleep 10 && 
     sudo apt-get update && 
     sudo apt-get install -y 'unzip' 'wget' && 
     rm -rf 'ec2-ami-tools' && 
     rm -f 'ec2-ami-tools.zip' && 
     wget -q 'http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.zip' && 
     unzip -q 'ec2-ami-tools.zip' && 
     mv ec2-ami-tools-* 'ec2-ami-tools' && 
     sudo rsync -a --no-o --no-g 'ec2-ami-tools/' '/usr/local' && 
     rm -rf 'ec2-ami-tools' && 
     rm -f 'ec2-ami-tools.zip' 
    else 
     echo -e "\033[1;32mec2-ami-tools has already been installed!\033[0m" 
    fi 
} 

function main() 
{ 
    installEC2AMITools 
} 

main 

답변

5

다음은 작동하는 설정 파일의 예입니다. ,

{ 
    "variables": { 
    "x509_cert_path": "/etc/aws/aws.cert", 
    "x509_key_path": "/etc/aws/aws.key", 
    "environment": "staging" 
    }, 

    "builders": [ 
    { 
     "type": "amazon-instance", 
     "name": "chef-server-{{user `environment`}}", 
     "region": "eu-west-1", 
     "availability_zone": "eu-west-1a", 
     "source_ami": "ami-46ba5331", 
     "instance_type": "m1.medium", 
     "ssh_username": "ubuntu", 
     "ami_name": "chef-server-{{user `environment`}} {{isotime | clean_ami_name}}", 
     "s3_bucket": "provisioning-images", 
     "ami_description": "Chef Server instance", 
     "account_id": "xxxx-yyyy-zzzz", 
     "x509_cert_path": "{{user `x509_cert_path`}}", 
     "x509_key_path": "{{user `x509_key_path`}}", 
     "bundle_vol_command": "sudo -n EC2_HOME=/usr/local ec2-bundle-vol --no-filter -k {{.KeyPath}} -u {{.AccountId}} -c {{.CertPath}} -r {{.Architecture}} -e {{.PrivatePath}}/* -d {{.Destination}} -p {{.Prefix}} --batch", 
     "bundle_upload_command": "sudo -n EC2_HOME=/usr/local ec2-upload-bundle -b {{.BucketName}} -m {{.ManifestPath}} -a {{.AccessKey}} -s {{.SecretKey}} -d {{.BundleDirectory}} --batch --location EU --retry" 
    } 
    ], 

    "provisioners": [ 
    { 
     "type": "shell", 
     "inline": [ 
     "sleep 3 && sudo apt-get install zip -y > /dev/null", 
     "wget --quiet http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.zip", 
     "unzip -qq ec2-ami-tools.zip", 
     "sudo -E rsync -a --no-o --no-g ec2-ami-tools-*/ /usr/local/", 
     "sudo apt-get install ruby -y >/dev/null" 
     ] 
    }, 

    { 
     "type": "chef-solo", 
     "execute_command": "{{if .Sudo}}sudo {{end}}chef-solo -E {{user `environment`}} --no-color -c {{.ConfigPath}} -j {{.JsonPath}}", 
     "cookbook_paths": ["{{pwd}}/lib/cookbooks"], 
     "data_bags_path": "{{pwd}}/../../data_bags", 
     "encrypted_data_bag_secret_path": "/etc/chef/databags.pem", 
     "environments_path": "{{pwd}}/environments", 
     "run_list": ["recipe[chef::server]"], 
     "json": { 
     "openssh": { 
      "server": { 
      "allow_users": "deployer ubuntu", 
      "use_p_a_m": "yes" 
      } 
     }, 
     "chef_client": { 
      "config": { 
      "environment": "{{user `environment`}}" 
      } 
     } 
     } 
    } 
    ] 
} 
+0

덕분에이 재정의 어떻게 내가 그 권리입니다 :' "bundle_vol_command": "sudo는 -n EC2_HOME =/usr/지방 EC2-번들 비결은 필요한 경로를 포함하는 실제 명령을 무시하는 것입니다 -vol --no-filter -k {{.KeyPath}} -u {{.AccountId}} -c {{.CertPath}} -r {{.Architecture}} -e {{.PrivatePath}}/* - "bundle_upload_command": "sudo -n EC2_HOME =/usr/local ec2-upload-bundle -b {{.BucketName}} -m {{.Destination}} -p {{.Prefix}} --batch", " -batch --location EU --retry " –

+0

예,'bundle_vol_command' 및'bundle_vol_command'는 {{.ManifestPath}} -a {{.AccessKey}} -s {{.SecretKey}} -d {{.BundleDirectory} bundle_upload_command'는 사용자가 덮어 쓸 필요가있는 것들입니다. 또한보십시오 : http://www.packer.io/docs/builders/amazon-instance.html – JeanMertz

+0

빙고, 감사 @ JeanMertz –