信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

2019

13

3月

Deployerでも動的にデプロイするホストを変更したい!

テクログ

↑ってなりますよね?なるなるー



ホストが固定だと、deploy.phpにホストを書いて終わり、ってなるんですけど、

AWSなどで

今動いてるホストがコロコロ変わるとしたら

deploy.phpには固定で書けないですね。



うーんこまったどうしよう。



そんなときはこれ!hosts.yml〜


くわしくはこちら!

https://deployer.org/docs/hosts.html



hosts.ymlにしたがってデプロイするよってしておけば、

hosts.ymlを事前に生成すれば動的にできるんだ!

(deploy.phpには inventory('hosts.yml');って書けば使われるよ。まあリンク先↑に書いてある。)



なんだって!すごいね!



はいソース の 例。



pythonのほうが楽なんだけどいじりやすいようにphpにしましたですよ?


雛形(SOURCE_hosts.yml)をつくっておいて、それのIPとインスタンスIDをリプレースしてるっす。わかるっすよね。

雛形はじぶんでつくってね!(リンク先参照とかテストとかして)


対象EC2はタグで絞り込んだりとかもしてます。


これを使ってなにかあっても責任は全く取れませんなので十分に検証してね!

hosts.yml生成するだけですけど。


これをjenkinsに呼ばせるなら、失敗時はexit(1);とかすれば進まないのでは。


ではいいかんじのDeployerライフを。



<?php
require 'aws_v3.phar';

use Aws\Ec2\Ec2Client as Ec2Client;
use Aws\Exception\AwsException;

echo 'generate_autoscale_yml START' . PHP_EOL . PHP_EOL;

/**設定箇所 開始**/
//認証情報
$auth = [
        "key"   => "ああああ",
        "secret" => "いいいい",
        "region" => "ap-northeast-1",
        "version" => "2016-11-15",
];
//タグ、AutoScaleGroupの値
$AutoScaleGroup_value = 'もがもが';

//hosts.ymlの雛形となるものを読んでおく
$source_hosts_yml_string = file_get_contents('./SOURCE_hosts.yml', FILE_USE_INCLUDE_PATH);

//結果ファイル名
$hosts_yml_filename = './hosts.yml';
/**設定箇所 終了**/


//hosts.ymlに結果として書き出す文字列の殻
$hosts_yml_string = '';

try{
    //動いている(running)、タグが該当のインスタンスを取得
    $ec2client = Ec2Client::factory($auth);

    $result = $ec2client->describeInstances([
            'Filters' => [
                    [
                            'Name' => 'tag:AutoScaleGroup',
                            'Values' => [$AutoScaleGroup_value],
                    ],
                    [
                            'Name' => 'instance-state-name',
                            'Values' => ['running'],
                    ],
            ],
            'MaxResults' => 100,
    ]);

    //値の分解と使用
    $reservations = $result['Reservations'];
    foreach ($reservations as $reservation) {
        $instances = $reservation['Instances'];
        foreach ($instances as $instance) {
            //もととなる文字のコピー
            $mod_hosts_yml_string = $source_hosts_yml_string;
            //置き換えに使う文字
            $InstanceId = $instance['InstanceId'];
            $publicip   = '';
            foreach ($instance['NetworkInterfaces'] as $networkinterface) {
                $publicip = $networkinterface['Association']['PublicIp'];
            }
            //[INSTANCE_ID]と[PUBLIC_IP_ADDRESS]を置き換え
            $mod_hosts_yml_string = str_replace('[INSTANCE_ID]', $InstanceId, $mod_hosts_yml_string);
            $mod_hosts_yml_string = str_replace('[PUBLIC_IP_ADDRESS]', $publicip, $mod_hosts_yml_string);

            $hosts_yml_string .= $mod_hosts_yml_string;
        }
    }
    //書き込み
    file_put_contents($hosts_yml_filename, $hosts_yml_string);
} catch(AwsException $e){
    var_dump($e->getMessage());
    echo 'ERROR' . PHP_EOL . PHP_EOL;
}

echo 'generate_autoscale_yml END' . PHP_EOL . PHP_EOL;


この記事を書いた人

マスオさん

tzwy

所 属:
WEBインテグレーション事業部
出身地:
saitama
仕事内容:
いろいろ検証、作成、障害対応とか品質向上とか