【備忘録】Ansibleでプロビジョニング AzureのVMにping疎通をするまで

■はじめに

以前のエントリでTerraformからVMを構築したと思いますがこのままだとただの箱なので、VM上に設定を入れていこうと思います。


ただ手作業でプロビジョニングすると結構手間です。 今回はこのプロビジョニングをとても有名なツールAnsibleで行なっていきます。

www.ansible.com

本日はAzureのVMへの疎通までを行います。

■環境前提

macOS Catalina(10.15.4)
Homebrew 2.2.17
ansible 2.9.9

■事前準備

ちょっと前回エントリのTerraform設定にDNSラベル名を入れ忘れたので、手動で入れておきましょう(ダサい。。後日tfファイル直しておきます)
AzureのVM画面はキャプチャを貼ると機微情報だらけで全体的にモザイクになってしまうので、文面での説明で失礼します。

指定のVMを選択すると画面右側にDNS名が未設定で表示されています。
こちらを任意の文字列で設定しておいてください。
こちらがFQDNとなります。

また、前回のtfファイルを見ていただくとわかりますが実は既にSSH公開鍵の配布をしてあります。
ansibleはSSHでコントロールノードからターゲットノードへアクセスしてプロビジョニング処理を行います。
ですので事前にコントロールノード側(今回はmac)で公開鍵を作成しておいてください。

■ansibleの準備

とても簡単です。
brewコマンドであっさりインストールされます。
この辺りは色々な方が既に様々なブログ等で情報を書いてくださっているので省略します。

brew install ansible

ローカルにインストールされたあとは、2つのファイルを準備します。

①inventory.ini

inventory.iniには該当するサーバを記載します。

[test]
Azureで設定したFQDNを指定

[test:vars]
ansible_port=22
ansible_user=test


②playbook.yml

playbook.ymlにはプロビジョニングの操作を記載します。

(注意)
playbookの設定に関しては、簡単に説明ができなかったので一旦イメージが連想できるような記載をしていますが、当記載はまだ疎通が取れていない内容になっています
飽くまで参考程度に眺めてください。(次回以降の別エントリで書きます→書きました

---
# targetセクション
# hosts allにするとinventoryのターゲットがそのまま使用される
# rootでアクセスしたのちansibleユーザに切り替えてからsuする
- name: selenoid_VM
  hosts: all
  gather_facts: true
  remote_user: qa
  become: true
  become_method: su
# varsセクション
# 引数として設定値があれば定義しておく
# vars:
#
# tasksオプション
# 構成管理の本体
  tasks:
    - name: Upgrade
      apt:
        name: "*"
        state: latest
    - name: 基本インストール
      apt:
        name:
          - apt-transport-https
          - ca-certificates
          - curl
          - gnupg-agent
          - software-properties-common
        force: yes
    - name: docker関連の削除
      apt:
        name:
          - docker
          - docker-engine
          - docker.io
          - containerd
          - runc
        state: absent
    - name: リポジトリの追加
      apt_repository:
        repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable
        state: present
    - name: docker再インストール
      apt:
        name:
          - docker-ce=5:19.03.8~3-0~ubuntu-bionic
          - docker-ce-cli=5:19.03.8~3-0~ubuntu-bionic
          - containerd.io
    # - name: ユーザ追加
    #   gpasswd:
    #     user: qa
    #     group: docker
    - name: パーミッション変更
      file:
        path: /var/run/docker.sock
        mode: '0666'


■疎通をしてみる

さて、ping疎通です。
inventoryファイルをカレントディレクトリとして以下を実行してください。

ansible -i inventory.ini FQDN -m ping


うまくいったでしょうか?

実はボクはこんなエラーが出ました。

FQDN | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r\n@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @\r\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r\nPermissions 0644 for '/Users/ユーザ名/.ssh/id_rsa' are too open.\r\nIt is required that your private key files are NOT accessible by others.\r\nThis private key will be ignored.\r\nLoad key \"/Users/ユーザ名/.ssh/id_rsa\": bad permissions\r\n test@FQDN: Permission denied (publickey).",
    "unreachable": true
}

どうも公開鍵のパーミッションは644だと開きすぎの模様。
自分以外のユーザ権限を全て閉じてしまいます。

chmod 600 id_rsa.pub

 % ll
total 24
-rw-------@ 1 ユーザ名  staff  1766  6  1 22:21 id_rsa

今一度実行してみましょう。

 % ansible -i inventory.ini FQDN -m ping
Enter passphrase for key '/Users/ユーザ名/.ssh/id_rsa': 
[DEPRECATION WARNING]: Distribution Ubuntu 18.04 on host FQDN should use /usr/bin/python3, but is using /usr/bin/python for backward 
compatibility with prior Ansible releases. A future Ansible release will default to using the discovered platform python for this host. See 
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. This feature will be removed in version 2.12. Deprecation warnings
 can be disabled by setting deprecation_warnings=False in ansible.cfg.
FQDN | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

AzureのVMと疎通ができました。


さて次回はplaybookの記述に関して進めて行きます。

ではでは。