01c. 開発環境構築(Windows 10+Ubuntu+Ansible)(備忘録)(作成中)

Ansibleとは

Ansibleはインフラ業務を自動化できるツールです。今回は、Ansibleを使用してLAMP環境及びLAMR環境を構築していきます。

Ansibleが操作できる対象の一覧
対象 操作の一例
ネットワーク機器 インターフェース設定、VLAN設定などの各種コンフィグの投入など
物理サーバ 電源ON/OFF、IPMIなどの操作
クラウド環境 インスタンスやセキュリティグループなどの作成、削除、編集など
仮想化基盤 仮想マシン、仮想ネットワークの作成、削除、編集など
ストレージ ボリュームの作成や削除、編集など
LinuxやWindowsなどのOS パッケージのインストール、設定ファイルの配布、再起動など

Ubuntuのリセット

Ubuntuを初期化する場合、最初に思い浮かぶのはUbuntuをアンインストール後に再度インストールすることですが、Microsoft Store経由でインストールしたUbuntuは、「リセット」という操作を行うことで設定を初期化できます。

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
	:

参考
Windows 10のWSL環境を初期化してクリーンな状態に戻す

Ansibleのインストール

$ sudo apt update												# パッケージを管理しているDBを最新の状態に更新
$ sudo apt install software-properties-common					# リポジトリの追加用のapt-add-repositoryパッケージをインストール
$ sudo apt-add-repository --yes --update ppa:ansible/ansible	# AnsibleのPPA(Personal Package Archive)をリポジトリに追加
$ sudo apt install ansible										# Ansibleのインストール
$ ansible --version
ansible 2.7.5
	:
$ ansible localhost -m ping -o
localhost | SUCCESS => {"changed": false, "ping": "pong"}		# pingモジュールがpongと応答を返すことを確認

Ansibleの自動化に必要な要素

Ansibleは、4つのインプットを動作時に必要とします。

モジュールとPlaybook

・モジュール
モジュールはAnsibleが「よくある作業を部品化」したもので、標準で2,000近くのモジュールを持っています。このモジュールにパラメータを与え、様々な作用をサーバやネットワーク機器に対して起こしていきます。新たなモジュールを作成することもできます。

モジュールの例
モジュール名 機能
ios_config Cisco社のネットワーク機器にコンフィグを投入
bigip_config F5ネットワーク社のロードバランサにコンフィグを投入
ec2_instance Amazon EC2上でインスタンスを作成、削除
vmware_guest VMware上で仮想サーバを作成、削除
yum OSにパッケージをインストール、アンインストール
systemd OSのサービスを起動、停止、再起動
shell 任意のコマンドをLinux OS上で実行
ping 自動化の対象となるサーバに対して「Ansibleで自動化可能な状態であるか」をチェックする

・Playbook
AnsibleではPlaybookを書くことで、「何をするか」を指示できます。Playbookにモジュールを並べて「何をするか」を指示していきます。

モジュールを単体で呼び出すと、モジュールの挙動を確認できます。

# localhostにshellモジュールを実行
$ ansible localhost -m shell -a 'hostname'
localhost | CHANGED | rc=0 >>
dev01						# ホスト名が表示される

インベントリ

Ansibleでは対象ノードを管理するために、インベントリという情報を使用します。先のコマンドでは、インベントリ中のlocalhostを使用するように指定していました。これはインベントリが定義されていない状態で唯一使用できる、自ホストを表すインベントリの情報になります。

インベントリファイルを以下のように作成します。

$ vi inventory						# 以下のように作成
[localhost]
127.0.0.1 ansible_connection=local

[web]
web01
web02

[db]
db01
db02

$ ansible web -i ./inventory -m ping -o			# webグループに対してpingモジュールを実行

ホストに与えられているansible_connectionオプションは、対象ノードへ接続する際の接続方法に関する情報を与えます。Ansibleが起動する管理ノードのローカルホスト上で処理を実行する際は、localと指定します。デフォルトはsshです。

クレデンシャル

クレデンシャルはAnsibleが対象ノードへ接続する際に使用する認証情報です。インベントリファイルに記述したり、コマンドラインの引数として記述することで、認証情報を渡せます。

$ ansible web -m ping -o -u user01 -k
SSH password:						# パスワードを入力

変数

モジュールには様々なパラメータを付与できますが、これらの値を変数化しておき、実行に上書きできます。

簡単なPlaybookを作成する

PlaybookはYAML形式で記述する必要があります。YAMLはインデント(段下げ)が意味を持つ形式なので、スペースの数に注意が必要です(タブは使用できない)。

・Playbookのサンプル

$ vi playbook.yml						# playbookの作成
- hosts: localhost
  vars:
    sample_vars: software_design_2018
  tasks:
    - shell: uptime
      register: result

    - debug:
        msg: "{{ result.stdout }}"

    - debug:
        msg: "{{ sample_vars }}"

$ ansible-playbook -i ./inventory ./playbook.yml

PLAY [localhost] *******************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
ok: [127.0.0.1]

TASK  ***********************************************************************************************************
changed: [127.0.0.1]

TASK [debug] ***********************************************************************************************************
ok: [127.0.0.1] => {
    "msg": " 13:28:36 up 17:12,  0 users,  load average: 0.52, 0.58, 0.59"
}

TASK [debug] ***********************************************************************************************************
ok: [127.0.0.1] => {
    "msg": "software_design_2018"
}

PLAY RECAP *************************************************************************************************************
127.0.0.1                  : ok=4    changed=1    unreachable=0    failed=0

$