Ansible 自動構築環境を作る②(Azure もくもく会 2018/06/09(土))

前回のもくもく会に引き続き、今回も Ansible で Azure 構築環境を作成します。
前回の記事は[こちら](https://qiita.com/tkmry/items/7a9270bf8b41bdaac5a0)から。

作業内容を書いていたら大分長くなってしまったので、
ざっと見する場合は、冒頭の部分と懇親会と参考リンクを見ていただければ概ね内容は分かるかなと思います。

# もくもく会と今回の目標設定

## Azure もくもく会

Azure もくもく会については、こちらのリンクから。
https://azure-moku2.connpass.com/event/88900/

端的に言うと、エンジニアが一ケ所に集まって(主に)Azureに関する技術を各個人ごとに目標設定して作業する場です。
とは言え、そんなに堅苦しくやる感じではないです。

主催者のkingkinoさんはMicrosoft MVP for Microsoft Azureを受賞されている方で、現在はPMとして活躍されているとのことです。

## タイムテーブルと今回の目標設定

■ タイムテーブル(もくもく会)

| 時間  | 内容  |
| ----- | ----- |
| 13:00 | 開会 |
| 13:10 | 会の説明 |
| 13:20 | 自己紹介/今日やることの宣言 |
| 13:30 | もくもく開始 |
| 17:10 | 目標・成果発表タイム（1人5分＊5） |
| 17:40 | 各人成果報告 |
| 18:00 | 撤収 |

■ 今回の目標

1. Azure Cloud Shell 上で Ansible で仮想マシンのデプロイ
2. Windows Subsystems for Linux から Ansible から Azure に仮想マシンのデプロイ
3. 作成した仮想マシンに Ansible から接続
4. 連番のホスト名の仮想マシンをデプロイ
5. デプロイ処理の一連の中で仮想マシンに何かしらの処理を実行

# 作業と成果

## 環境

* Windows 10 Pro 64bit (1803)
* Windows Subsystem for Linux(Ubunt 16.04)
* Azure Cloud Shell (Bash)
* サクラエディタ

WSL の Ubuntu には 16.04LTS と 18.04LTS がありましたが、16.04LTS を入れてしまいました。
両者は共存できるようなので後で 18.04LTS を入れて試してみようと思います。

## 作業概要

1. エディタの導入
2. Azure Cloud shell 上で Ansible を利用
3. WSL より Azure Cloud に仮想マシンデプロイ
4. デプロイした仮想マシンに対してAzure CloudのAnsibleを実行
5. 複数の仮想マシンを連番でデプロイ

## 作業内容

### 1. エディタの導入

今日の作業に使うかなと思ってサクラエディタを導入しました。

1. 以下より v2 をダウンロードしてインストール  
   https://sakura-editor.github.io/
2. 正規表現を使えるようにするために、bregonig.dll の差し替え(もしかすると最初から使えるかも)  
   http://k-takata.o.oo7.jp/mysoft/bregonig.html  
   bron412.zip をダウンロードして、中に次のファイルを以下のフォルダに配置  
   * bregonig.dll  
     -> C:\Users\(User)\AppData\Roaming\sakura

### 2. Azure Cloud shell 上で Ansible を利用

先日、何気なく Azure Cloud Shell(bash) で ansible と叩いたら usage が返ってきました。
どんな感じに利用できるのか気になったので、使ってみることにしました。

Azure Cloud Shell からの仮想マシン構築ですが、
ここの記事に必要十分な情報が記載されているので、参考にて作業してみます。

* Ansible を使用して、Azure の完全な Linux VM を作成する | Microsoft Docs  
https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/ansible-create-complete-vm

#### 2.1. リソースグループの作成

まず、仮想マシンを作る前提としてリソースグループを作る必要があるので、
Cloud Shell より作成しておきます。

1. Azure Portal に接続してログインする。  
   https://portal.azure.com
2. 右上のアイコンから [>_] を選択する。
3. 起動する Shell に Bash を選ぶ。
4. 以下を入力する。  

```shell
# Azure Cloud
> az group create --name myResourceGroup --location eastus
```

リソースグループを作成していないと、後述の作業で次の用に怒られます。

> fatal: [localhost]: FAILED! => {"changed": false, "msg": "Error retrieving resource group myResourceGroup - Resource group 'myResourceGroup' could not be found."}



#### 2.2. Ansible プレイブックの作成

1. Cloud Shell より vim (emacs) で以下のフォルダおよびファイルを作成します。

```shell
# 念のためホームへ移動
> cd

# 作業用フォルダの作成と移動
> mkdir work
> cd work

# ssh公開鍵の確認(出力結果を後で使う)
> cat ~/.ssh/id_rsa.pub

# プレイブックを作成
> vi playbook.yml
```

以下の内容を入力して保存する。

```yaml:playbook.yml
- name: Create Azure VM
  hosts: localhost
  connection: local
  tasks:
  - name: Create virtual network
    azure_rm_virtualnetwork:
      resource_group: myResourceGroup
      name: myVnet
      address_prefixes: "10.0.0.0/16"
  - name: Add subnet
    azure_rm_subnet:
      resource_group: myResourceGroup
      name: mySubnet
      address_prefix: "10.0.1.0/24"
      virtual_network: myVnet
  - name: Create public IP address
    azure_rm_publicipaddress:
      resource_group: myResourceGroup
      allocation_method: Static
      name: myPublicIP
  - name: Create Network Security Group that allows SSH
    azure_rm_securitygroup:
      resource_group: myResourceGroup
      name: myNetworkSecurityGroup
      rules:
        - name: SSH
          protocol: Tcp
          destination_port_range: 22
          access: Allow
          priority: 1001
          direction: Inbound
  - name: Create virtual network inteface card
    azure_rm_networkinterface:
      resource_group: myResourceGroup
      name: myNIC
      virtual_network: myVnet
      subnet: mySubnet
      public_ip_name: myPublicIP
      security_group: myNetworkSecurityGroup
  - name: Create VM
    azure_rm_virtualmachine:
      resource_group: myResourceGroup
      name: myVM
      vm_size: Standard_DS1_v2
      admin_username: azureuser
      ssh_password_enabled: false
      ssh_public_keys: 
        - path: /home/azureuser/.ssh/authorized_keys
          key_data: "*** ~/.ssh/id_rsa.pub の内容を入力 ***"
      network_interfaces: myNIC
      image:
        offer: CentOS
        publisher: OpenLogic
        sku: '7.3'
        version: latest
```

key_data の部分を自分用に修正する必要があります。
先ほど出力した内容をコピペで張り付けましょう。

ちゃんと自分用のに書き換えていないと、以下のメッセージが出て怒られます。

> fatal: [localhost]: FAILED! => {"changed": false, "msg": "Error creating or updating virtual machine myVM - Azure Error: InvalidParameter\nMessage: The value of parameter linuxConfiguration.ssh.publicKeys.keyData is invalid.\nTarget: linuxConfiguration.ssh.publicKeys.keyData"}


#### 2.3. Ansible プレイブックの実行

1. 以下のコマンドより実行します。

```bash
# Ansible playbook の実行
> ansible-playbook playbook.yml
```

何事もなければ myVM なる仮想マシンが出来上がってるはずです。


### 3. WSL より Azure Cloud に仮想マシンデプロイ

WSL を使って Ansibl から Azure に仮想マシンをデプロイするには、以下の準備が必要です。

* WSL に Ubuntu をインストール(今回は Ubuntu 16.04 を利用)
* Python 仮想環境を構築(pip を利用するため)
* Azure CLI, Ansible 関連パッケージを導入
* プレイブックの実行

#### 3.1. WSL に Ubuntu をインストール(今回は Ubuntu 16.04 を利用)

まずは WSL に Ubuntu を導入します。

1. Windows Store に接続して、Ubuntu をインストールする。  
   https://www.microsoft.com/ja-jp/p/ubuntu/9nblggh4msv6
2. 起動したら、ユーザ名とパスワードを設定する。
3. パッケージが古いかもしれないので適当に上げちゃいましょう。

```bash
# apt よりパッケージ情報を更新
> sudo apt update

# apt よりパッケージの更新(dist-upgrade でもいいかも)
> sudo apt upgrade
```

#### 3.2. Python 仮想環境を構築(pip を利用するため)

1. 以下のコマンドを入力する。

```bash
# Python 仮想環境を作成(ansibleフォルダを作成)
> python -m venv ansible

# Python 仮想環境に入る
> cd ansible
> source bin/activate
   # 仮想環境から離れる場合は "> deactivate" コマンドを実行する。

# pip のバージョンが古い場合があるので更新する
> pip install -U pip
```


#### 3.3. Azure CLI, Ansible 関連パッケージを導入

1. 以下のリンクを参考に、Azure CLI を導入します。  
   [apt を使用して Linux に Azure CLI 2.0 をインストールする | Microsoft Docs](
   https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-apt?view=azure-cli-latest)  
   　※ ここで az login 認証を済ませておきます。
2. Ansible と関連するパッケージを導入する。

```bash
# Ansible のインストール
> pip install ansible==2.5.3

# 関連するパッケージの導入
> pip install packaging msrestazure ansible[azure]
```

#### 3.4. プレイブックの実行

同名のリソースが存在すると失敗するので、事前に Azure Portal へ接続して削除しておきましょう。
また、プレイブックは先ほど使ったものを流用します。

1. Azure Portal へ接続して、myResourceGroup を削除する。  
   https://portal.azure.com
2. 先ほど使用したプレイブックを vim 等を利用してローカルに保存する。
3. 以下のコマンドを実行する。

```bash
> ansible-playbook playbook.yml
```

という事で、WSL 上からでも Ansible -> Azure へ仮想マシンをデプロイできました。

### 4. デプロイした仮想マシンに対してAzure CloudのAnsibleを実行

Azure のインベントリ情報を取得するスクリプト(azure_rm.py)というのがあるようなので、
そちらを使用してみます。

* Ansible を使用した Azure の動的インベントリの管理 | Microsoft Docs  
  https://docs.microsoft.com/ja-jp/azure/ansible/ansible-manage-azure-dynamic-inventories

1. Azure Portal に接続してログインする。  
   https://portal.azure.com
2. 右上のアイコンから [>_] を選択する。
3. 起動する Shell に Bash を選ぶ。
4. 以下を入力する。  

```shell
# azure_rm.py のダウンロード
> wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/azure_rm.py

# 実行権限の付与
> chmod +x azure_rm.py

# Ansible の実行
> ansible -i azure_rm.py myVM -m ping -e ansible_ssh_user=azureuser
   # 昨日は上手くいったのに、今日は上手くいかない。
   # 何か足りない設定が分かったら追記します。
```

これでできるはずです。

### 5. 複数の仮想マシンを連番でデプロイ

今回使用したプレイブックに、配列とループを埋め込むだけで作れます。
変数 ids を追加してます。

プレイブックを以下の通りに修正して、`ansible-playbook playbook.yml` を実行します。

```yaml:playbook.yml
- name: Create Azure VM
  hosts: localhost
  connection: local
  vars:
    ids: [1,2]
  tasks:
  - name: Create ResourceManager
    azure_rm_resourcegroup:
      name: linuxResourceGroup
      location: japaneast
  - name: Create virtual network
    azure_rm_virtualnetwork:
      resource_group: linuxResourceGroup
      name: linuxVnet
      address_prefixes: "10.0.1.0/24"
  - name: Add subnet
    azure_rm_subnet:
      resource_group: linuxResourceGroup
      name: linuxSubnet
      address_prefix: "10.0.1.0/24"
      virtual_network: linuxVnet
  - name: Create public IP address
    azure_rm_publicipaddress:
      resource_group: linuxResourceGroup
      allocation_method: Static
      name: "linuxPublicIP{{ item }}"
    with_items: "{{ ids }}"
  - name: Create Network Security Group that allows SSH
    azure_rm_securitygroup:
      resource_group: linuxResourceGroup
      name: linuxNetworkSecurityGroup
      rules:
        - name: SSH
          protocol: Tcp
          destination_port_range: 22
          access: Allow
          priority: 1001
          direction: Inbound
  - name: Create virtual network inteface card
    azure_rm_networkinterface:
      resource_group: linuxResourceGroup
      name: "linuxNIC{{ item }}"
      virtual_network: linuxVnet
      subnet: linuxSubnet
      public_ip_name: "linuxPublicIP{{ item }}"
      security_group: linuxNetworkSecurityGroup
    with_items: "{{ ids }}"
  - name: Create VM
    azure_rm_virtualmachine:
      resource_group: linuxResourceGroup
      name: "linuxVM{{ item }}"
      vm_size: Standard_DS1_v2
      admin_username: azureuser
      ssh_password_enabled: false
      ssh_public_keys:
        - path: /home/azureuser/.ssh/authorized_keys
          key_data: "*** ~/.ssh/id_rsa.pub の内容を入力 ***"
      network_interfaces: "linuxNIC{{ item }}"
      image:
        offer: CentOS
        publisher: OpenLogic
        sku: '7.3'
        version: latest
    with_items: "{{ ids }}"
```

仮想マシンがデプロイされました。

# 今日のもくもく会を終えて

## 振り返り(実績、上手くできた事、反省)と感想

### 実績
1. Azure Cloud Shell 上で Ansible で仮想マシンのデプロイ  
   → 〇 出来ました
2. Windows Subsystems for Linux から Ansible から Azure に仮想マシンのデプロイ  
   → 〇 出来ました
3. 作成した仮想マシンに Ansible から接続  
   → 〇 出来ました
4. 連番のホスト名の仮想マシンをデプロイ  
   → 〇 出来ました
5. デプロイ処理の一連の中で仮想マシンに何かしらの処理を実行  
   → × 時間が足りず出来なかった。 あと、Ansible では一度のプレイブック処理で、インベントリを変更できないかも。

### 上手くできたこと

* 集中して作業できた。
* 概ね想定していた通りに作業を進められた。
* Slack に素早く反応できた(回答できたとは言っていない)

### 反省

* 記事の作成に時間がかかってしまった。  
  → デプロイ中など時間が余っていたので、その時間に記事を書き始めたほうが良かった。
* 周囲の人が何をしていたのか全く追えてなかった。  
  → 最初の今日の目標をメモしてみようかな。
* LT の最中にも作業をしていて、細かく聞けてなかった。
  → せっかくなので次回以降はメモ取る。

### 感想

前回の参加もそうでしたが、Azure もくもく会は集中しやすい環境にあります。
周囲にハイスキルなエンジニアがいるため、引っ張られるように作業に取り組めました。

凄腕のエンジニアが集まっているので、自分以外の人の作業(どんな技術を触っているのか、どういう市場に向けた技術なのか)を伺えればと思いました。

## 懇親会での話

もくもく会よりも、こっちの方が盛り上がってたかも。
話題に上がった内容をリストアップして、分かりやすい記事があればリンクも張っておきます(参考リンクとは別)




* [JetBrains ReSharper - .NET 開発者向けの Visual Studio 拡張プラグイン : エクセルソフト](https://www.xlsoft.com/jp/products/jetbrains/resharper.html):  
  Visual Studio のコード分析拡張で、リファクタリングのアドバイスや肥大したClassのコード分割を行ってくれるとのこと。  
  参考: [ReSharperのすすめ - Qiita](https://qiita.com/papeMK2/items/f85c21ad07d3ba04e572)
* VS Code の設定ファイルの同期で2回目以降の初期設定が楽:  
  参考: [Visual Studio Code 入門～導入から Gist による設定管理まで～ - 雀巽の日記帳](https://necojackarc.hatenablog.com/entry/2017/03/12/184557)
* [サクラエディタ SourceForge から github への移行](
  http://blog.clock-up.jp/entry/2018/05/20/sakura-github):  
  現在コントリビュータを募集で興味のある方は[開発方針が書かれた Wiki](https://github.com/sakura-editor/sakura/wiki) を見てみるといいかも。  
  参考: [「サクラエディタ」プロジェクトが“SourceForge.net”から“GitHub”への移行を検討 - 窓の杜](https://forest.watch.impress.co.jp/docs/news/1122960.html)
* MS の Github 買収(75億ドル):  
  スティーブバルマー氏はOSS嫌いとして有名だったが、在任中に実はOSSと手を取り合うための準備を進めていたとのこと。バルマー後任のナディ氏による[ヒットリフレッシュ](https://www.amazon.co.jp/dp/4822255336)に書いてあるらしい。  
  参考: [マイクロソフト、GitHub を 75 億ドルで買収へ - News Center Japan](https://news.microsoft.com/ja-jp/2018/06/05/microsoft-to-acquire-github-for-7-5-billion/)
* プロジェクト管理/タスク管理のこと
    * [Nulab Backlog](
       https://nulab-inc.com/ja/products/backlog/):
      優先順位や作業時間などを管理しやすいらしい。
    * [Github プロジェクト](
      https://help.github.com/articles/about-project-boards/):
      カンバン方式でタスク管理できる。[参考1](https://qiita.com/Yamotty/items/95bcd4743ab10da89db5)、[参考2](https://qiita.com/ISLA/items/ae71d94a55b844fbecc7)
    * [Redmine](http://redmine.jp/):
      プロジェクト、タスク管理の有名所。[Github の issse と連携](https://qiita.com/n_slender/items/54cd282c140fadbbb322)できる。
* AI が美容院を予約、会話の中で予約しないという判断もする:  
  参考: [これはきづかない！AIが電話で美容院を予約　アドリブを聞かせたスムーズな会話に衝撃 – grape [グレイプ]](https://grapee.jp/500098)
* 電子決済:   
  [Line Pay](https://line.me/ja/pay)  
  [メルカリ 売上金の現金化](https://www.mercari.com/jp/box/q2653a9f0f143c5a1/) 180日以内に現金化しようね、という話  
* 投げ銭ビジネス:  
  動画配信者やコンテンツ配給側が過激な事をしがちなので注意しないと危ないね、という話でした。
    * [お寿司](https://osushi.love/):  
      寿司(概念)を開発者等に渡せる。 たまったお寿司は商品と交換できる。  
      リリース直後に炎上してサービス停止していたらしい。  
      参考1: [“投げ銭”サービス「Osushi」、トラブル相次ぎ休止　運営元が返金対応 - ITmedia NEWS](http://www.itmedia.co.jp/news/articles/1802/02/news090.html)  
      参考2: [なぜpaymoやKyashやpolcaがよくて、Osushiが法律的にアウトなのか？PayPalも諦めた日本の「送金」事情。 | hajipion.com](https://hajipion.com/2663.html)
    * Youtube superchat:  
      Youtube でライブ配信中に投げ銭できる。  
      参考: [Youtube superchat](https://support.google.com/youtube/answer/7277005?hl=ja)

多分他にも色々話していたと思うんですけど、書ききれないのでこのぐらいで。

# 参考リンク一覧

* Azure 自動構築環境を作る①(Azureもくもく会 2018/05/26) - Qiita  
  https://qiita.com/tkmry/items/7a9270bf8b41bdaac5a0
* 第二十三回 Azureもくもく会 @ 品川 - connpass  
  https://azure-moku2.connpass.com/event/88900/
* Azure Cloud Shell での Bash を使用した Ansible の実行 | Microsoft Docs  
  https://docs.microsoft.com/ja-jp/azure/ansible/ansible-run-playbook-in-cloudshell
* サクラエディタ  
  https://sakura-editor.github.io/
* K.Takata's software: bregonig.dll  
  http://k-takata.o.oo7.jp/mysoft/bregonig.html
* Ubuntu を入手 - Microsoft Store ja-JP  
  https://www.microsoft.com/ja-jp/p/ubuntu/9nblggh4msv6
* apt を使用して Linux に Azure CLI 2.0 をインストールする | Microsoft Docs  
  https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-apt?view=azure-cli-latest
* azure_rm_virtualmachine - Manage Azure virtual machines. — Ansible Documentation  
  https://docs.ansible.com/ansible/2.3/azure_rm_virtualmachine_module.html
* Ansible を使用した Azure の動的インベントリの管理 | Microsoft Docs  
  https://docs.microsoft.com/ja-jp/azure/ansible/ansible-manage-azure-dynamic-inventories


# 追記
まだなし