LoginSignup
5
5

More than 5 years have passed since last update.

Packer + Ansible で Playbook の指定を変数にする

Posted at

サーバのロールごとに playbook を作成して、本番用途と開発用途で playbook を分けて web-app.prd.yml と web-app.dev.yml のようにして作成するAMIの対象を変数で切り替えられるようにしている。

PackerのAnsibleでは role_paths に一つ一つロールを設定しないと role がアップロードされないが、provisioners で roles ディレクトリごとまるっとアップロードするように仕込んで、いちいち指定しなくても良いようにしている。

{
  "variables": {
    "role":    "",
    "env": "",
    "volume_size": "8",
    "ansible_staging_directory": "/tmp/packer-provisioner-ansible-local"
  },
  "builders": [{
    "type": "amazon-ebs",
    "access_key": "<your access_key>",
    "secret_key": "<your secret_key>",
    "region": "ap-northeast-1",
    "source_ami": "ami-4985b048",
    "instance_type": "c3.large",
    "ssh_username": "ec2-user",
    "ssh_timeout": "5m",
    "ami_name": "{{user `role`}}-{{isotime \"20060102-150405 MST\"}}",
    "user_data_file": "combined-userdata.txt",
    "ami_block_device_mappings": [
      { "device_name": "/dev/xvda", "volume_type": "gp2", "volume_size": "{{user `volume_size`}}", "delete_on_termination": true },
      { "device_name": "/dev/sdb", "virtual_name": "ephemeral0" },
      { "device_name": "/dev/sdc", "virtual_name": "ephemeral1" }
    ],
    "tags": {
      "Name": "{{user `role`}}",
      "Environment": "{{user `env`}}"
    }
  }],
  "provisioners": [
    { "type": "shell", "script": "pre-process.sh" },
    {
      "type": "shell",
      "inline": [
        "mkdir -p {{ user `ansible_staging_directory` }}"
      ]
    },
    {
      "type": "file",
      "source": "roles",
      "destination": "{{ user `ansible_staging_directory` }}"
    },
    {
       "type": "ansible-local",
       "playbook_file": "{{user `role`}}.{{user `env`}}.yml"
    }
  ]
}
$ packer build -var 'role=web-app' -var 'env=prd' packer.json
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5