こんにちは。
ディーネットで構築業務を担当しております、下地です。
ゴールデンウィークは、色々遊びつつ合間にAWS Innovateを見たりして過ごしたのですが、5月7日のInnovate終了後に沢山修了書が届きました(ちゃんと全部見るとカテゴリ別に修了書もらえるようです
さて、今回はAnsibleについてです。
私は個人的に構成管理ツールやInfrastracture as Codeといった考え方が好きなのですが、今回はCloudFormationではなくて、AnsibleでVPCやEC2といったAWSリソースを作成してみようと思います。
宜しくお願いします。
目次
Ansibleについて簡単に
Ansibleはマルチレイヤーに対応している構成管理ツールです。
OSやミドルウェアの設定など、従来の守備範囲であるConfiguration Managementに加えて、Bootstrappingの領域までカバーします。
更には、A10やF5、CiscoといったNW機器も操作する事ができます。
今回はこれら豊富な機能の中から、AWSにおけるBootstrappingの処理をAnsibleでやってみます。
AnsibleでAWSやAzureなどのパブリッククラウドのリソースを操作するモジュールは「Cloud modules」に分類されます。
下準備
まずターゲットとなるAWSアカウント内でEC2を立てて、その中でAnsibleを実行する形で試します。
普通にEC2を作成して使っても良いのですが、2019年4月よりCloud9が東京リージョンでも利用できるようになった為「早速使いたい!」という理由で、今回はCloud9環境にAnsibleをインストールして実行してみようと思います。
参考:Amazon Web Services ブログ AWS Cloud9 が東京リージョンに対応しました
Cloud9の環境づくり
これはマネジメントコンソールからポチポチと3ステップで作成できます。
まずCloud9のメニューを開いて、環境を作ります。「Create environment」をクリック。
詳細を設定していきます。
まずStep1。Nameを入力します。
Descriptionは必要であれば都度入れますが、今回は空欄としました。
次にStep2。
Cloud9が動作するEC2インスタンスの詳細を決めていきます。
以下の部分は全てデフォルトにしました。
「After 30 minutes」の部分は、ほったらかしておくとEC2を自動でシャットダウンしてくれるまでの時間です。
これにより「オンデマンドでEC2の料金を沢山請求される」という事を防げます。
下にスクロールすると、VPCとサブネットを選択するプルダウンが出ます。
今回はあらかじめCloud9用に用意しておいたVPCとサブネットを利用します。
次に進むとStep3は確認画面ですので、Create environmentで作成できます。
するとしばらく実行中となり、その後環境が作成されてブラウザから利用できるようになります。
こんな感じでできました。
ブラウザから統合開発環境として利用できます。
また、下のウィンドウでEC2上のコンソール操作をブラウザ経由で行う事ができます。
基盤はEC2なので、Cloud9用に作成されたインスタンスも確認できます。
これで環境ができました。
Ansibleをインストールする
Cloud9ではブラウザからbashを操作できます。
最初はec2-userでシェルログインしています。
この環境にpip及びAnsibleをインストールしました。
まず現況を確認して、
pipのインストールスクリプトをダウンロードします。
ダウンロードしたスクリプトを実行してpipをインストールします。
インストールしたpipを利用してAnsibleをインストールします。
これでAnsibleが動作するので、適当なAnsibleコマンドを利用して動作確認をします。
(コードを記述したら表示がおかしくなったので画像で失礼します)
Cloud9用のEC2にIAMロールをかぶせておく
今回はAdministratorAccessを付与したテスト用IAMロールを用意して、それをアタッチしました。
Playbookを作成する
ここからAnsibleのPlaybookを記述します。
このPlaybookで作成されるAWSリソースは、
- VPC
- インターネットゲートウェイ
- サブネット
- ルートテーブル
- ルート
- セキュリティグループ
- キーペア
- EC2インスタンス
です。
PlaybookはCloud9を使って記述します。
まずは新規ファイルを作成。
名前は「ansibletest.yml」としました。
これを開くと、右側のエディタで編集ができます。
初期設定だと操作はvimモードで行えます。
エディタは設定変更でEmacsや他モードも利用できますよ。
以下の感じで書いていきます。
これでplaybookを作成しました。
一部自社の拠点IPの記載部分のみ伏字にしております。
---
- hosts: localhost
tasks:
- name: "create vpc"
ec2_vpc_net:
name: "testvpcbyansible"
cidr_block: "10.0.0.0/16"
region: ap-northeast-1
tags:
mytag: ansiblemade
register: vpc_net
- name: "create internet gataway"
ec2_vpc_igw:
state: present
region: ap-northeast-1
vpc_id: "{{ vpc_net.vpc.id }}"
tags:
Name: testigwbyansible
mytag: ansiblemade
register: vpc_igw
- name: "create subnet"
ec2_vpc_subnet:
state: present
vpc_id: "{{ vpc_net.vpc.id }}"
region: ap-northeast-1
cidr: 10.0.0.0/24
tags:
Name: testsubnetbyansible
mytag: ansiblemade
register: vpc_subnet
- name: "create routetable for subnet"
ec2_vpc_route_table:
state: present
region: ap-northeast-1
vpc_id: "{{ vpc_net.vpc.id }}"
subnets: "{{ vpc_subnet.subnet.id }}"
routes:
- dest: 0.0.0.0/0
gateway_id: "{{ vpc_igw.gateway_id }}"
tags:
Name: testroutetablebyansible
mytag: ansiblemade
- name: "create securitygroup for ec2"
ec2_group:
name: testsecuritygroupbyansible
description: http and denet office
region: ap-northeast-1
vpc_id: "{{ vpc_net.vpc.id }}"
rules:
- proto: tcp
from_port: 80
to_port: 80
cidr_ip: 0.0.0.0/0
- proto: tcp
from_port: 0
to_port: 65535
cidr_ip: ■■■.■■■.■■■.■■■/32
tags:
Name: testsecuritygroupbyansible
mytag: ansiblemade
register: ec2_securitygroup
- name: "create key-pair for ec2"
ec2_key:
region: ap-northeast-1
name: mytestkey_madebyansible
register: ec2_keypair
- name: "create ec2"
ec2:
region: ap-northeast-1
key_name: "{{ ec2_keypair.key.name }}"
instance_type: t2.micro
image: ami-0f9ae750e8274075b
group: "{{ ec2_securitygroup.group_name }}"
wait: yes
vpc_subnet_id: "{{ vpc_subnet.subnet.id }}"
assign_public_ip: yes
volumes:
- device_name: /dev/xvda
volume_type: gp2
volume_size: 8
instance_tags:
Name: shimojitestserverbyansible
mytag: ansiblemade
count_tag:
Name: shimojitestserverbyansible
exact_count: 1
それでは実行してみます。
一般ユーザだと上手く行かなかったのでrootユーザにスイッチして実施してみました。
webのインターフェースから実施。
すると最後までちゃんと流れました。
また、キーペアを作成したときの秘密鍵情報はどうやって出力するのかな?と思っていたのですが、
実行結果にそのまま文字列として出力されました。
ただし-vオプションが必要です。
加えて、冪等性を確認するため、もう一度実施してみます。
すると以下の感じで、既にリソースが作成されているため、全てOKでスキップされました。
単純に2回流すと冪等性は大丈夫のようです。
実際に作成されたリソースを確認すると、例えばEC2はちゃんと出来ています。
作成されたキーペアを利用してのSSH接続も大丈夫でした。
こんな感じでAnsibleでもAWSリソースを操作できることが分かりました。
気になる点
作成したPlaybookを色々試していると、以下のような挙動がありました。
- リソースの名前を変えるとリネームされるのではなく新しくリソースがまた作成される
- EC2の冪等性はcount_tagとexact_countを組み合わせる必要があり多少面倒
などなどです。
CloudFormationだとChangeSetを利用してリソースの更新ができますが、Ansibleは難しそうです。
検証しておいて何ですが、わざわざリソース操作にAnsibleを使うよりは、CloudFormationやTerraformを素直に使ったほうが良いかなと感じました。
まとめ
今回はとりあえず出来るかどうかを試す感じでしたが、Ansibleでもクラウドリソースを操作することができました。
ただ他にも便利なサービスやツールが色々ありますので、適材適所でそれぞれを使えるともっと良さそうです。
またCloud9はコードを書くツールとして今後も使ってみようかと思いました。
今回もお読み頂きありがとうございました。