Browse Month: May 2016

Packer で AMI を作るときにタイムアウトした

Packer で AMI を作るとき、Provisors で時間がかかってくるようになると、次のようなエラーメッセージが表示されて終了することがあります。
今のところ、Ansible + Serverspec を実行しているため、かなり時間がかかってきたようです。。。


...
2016/05/11 07:52:03 packer: 2016/05/11 07:52:03 Allowing 300s to complete (change with AWS_TIMEOUT_SECONDS)
2016/05/11 07:52:24 ui: ==> amazon-ebs: Creating the AMI: foo-2016-05-10T22-45-36Z
2016/05/11 07:52:25 ui: amazon-ebs: AMI: ami-xxx
2016/05/11 07:52:25 ui: ==> amazon-ebs: Waiting for AMI to become ready...
2016/05/11 07:52:25 packer: 2016/05/11 07:52:25 Waiting for state to become: available
2016/05/11 07:52:25 packer: 2016/05/11 07:52:25 Allowing 300s to complete (change with AWS_TIMEOUT_SECONDS)
2016/05/11 07:54:39 ui: ==> amazon-ebs: Modifying attributes on AMI (ami-xxx)...
2016/05/11 07:54:39 ui: amazon-ebs: Modifying: description
...

こんなときは、メッセージのとおり AWS_TIMEOUT_SECONDS 環境変数を設定してから実行するとよくなりました。
また、標準出力に表示されるログがかなり長くなってきたので、ログファイルに出力するようにしました。

今のところ、次のような環境変数を設定しています。
$packer_name というのは AMI 名、$packer_role は AMI のロール名になります。
今のところ、$packer_name の $packer_role ごとに AMI を作っています。


$ export PACKER_LOG=1
$ export PACKER_LOG_PATH="packer-$packer_name-$packer_role-$(date +%Y%m%d%H%M%S).log"
$ export AWS_TIMEOUT_SECONDS=600

Packer でビルドしているとき、途中で終了しても気づけないことがあるので、ログファイルはちゃんとみた方がよいと思います。
CI などで Packer をビルドしているときは、CI のログを見るのが良いかなと思います。

Ubuntu 14.04 LTS から 16.04 LTS へのアップグレード方法

待望の Ubuntu 16.04 LSTS がリリースされましたね!
さっそく自サーバの Ubuntu 14.04 LTS Server をアップグレードしてみました。

Digital Ocean に詳しい解説がのっていますが、正式には 16.04.01 でアップグレードが正式に対応になることですので、アップグレードする際には自己責任でお願いします。

まずは、現行のものを最新にアップグレードして、必要なら再起動をしておきます。


$ sudo apt-get update
$ sudp apt-get upgrade

あとは、いつもどおり do-release-upgrade でアップグレードするだけです。ただし、現時点では -d オプションをつける必要があります。


$ sudo apt-get install update-manager-core
$ sudo do-release-upgrade -d

僕の環境では無事アップグレードできたのですが、SSH 接続すると、次のようなエラーになってしまいました。


Unable to negotiate with x.x.x.x: no matching key exchange method found. Their offer: curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1

これは、~/.ssh/config に、次のような設定が入っていたからです。


KexAlgorithms diffie-hellman-group1-sha1

これを次のように修正しましたところ、接続はできました。


KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256

あとは、16.04 LTS の新機能をチェックしながら、Ubuntu 16.04 LTS を楽しみたいと思います。

また、まだ EC2 上には公式のイメージは提供されていないようですが、楽しみに待っておきたいと思います。

Ansible on CentOS 7 ですこしハマった

CentOS 7 上で Ansible 2 系を使っていますが、EPEL にある Ansible パッケージが、現時点で最新の 2.0.2.0 にバージョンアップされていました。
さっそくこのバージョンを使ったところ、次のような JSON をパースするような処理がある場合は、エラーとなってしまいました。


- set_fact: foo_aws_access_key_id="{{ cloudformation_outputs | selectattr('OutputKey', 'equalto', 'FooKey') | map(attribute='OutputValue') | join(',') }}"

これは、取得した CloudFormation の JSON データの OUTPUTS から特にキーの値を取得するものですが、これを実行すると、次のようなエラーになります。


An exception occurred during task execution. To see the full traceback, use -vvv. The error was: TemplateRuntimeError: no test named 'equalto'
fatal: [foo]: FAILED! => {"failed": true, "msg": "Unexpected failure during module execution.", "stdout": ""}

原因を調査したところ、どうも Ansible が使っているテンプレートエンジン Jinja2 が 2.7 系のままだったことが原因みたいです。
たしかに yum 経由でインストールされる Jinja2 が 2.7 系のままでした。


sudo yum info python-jinja2.noarch
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.osuosl.org
* epel: mirror.symnds.com
* extras: mirror.confluxtech.com
* updates: mirrors.tripadvisor.com
インストール済みパッケージ
名前 : python-jinja2
アーキテクチャー : noarch
バージョン : 2.7.2
リリース : 2.el7
容量 : 3.0 M
リポジトリー : installed
提供元リポジトリー : base
要約 : General purpose template engine
URL : http://jinja.pocoo.org/
ライセンス : BSD
説明 : Jinja2 is a template engine written in pure Python. It provides a
: Django inspired non-XML syntax but supports inline expressions and an
: optional sandboxed environment.
:
: If you have any exposure to other text-based template languages, such
: as Smarty or Django, you should feel right at home with Jinja2. It's
: both designer and developer friendly by sticking to Python's
: principles and adding functionality useful for templating
: environments

ということで、あまりやりたくはないですが、仕方がなく pip コマンドでアップグレードするようにしました。
けっこう Ansible も Jinaja もリリースされるバージョンに問題があることが多いのでバージョンを固定するようにしました。


$ sudo pip install --upgrade Jinja2==2.8

これで、上のような Playobook もちゃんと通るようになりました。