Ansibleでネットワーク構築からインスタンス作成まで Fujitsu Cloud Service for OSS (4OSS) / はじめの一歩

富士通が運用するOpenStack準拠のクラウド基盤「Fujitsu Cloud Service for OSS」略称 4OSS上 にAnsibleを使って、ネットワークの構築からWebサーバーの作成&起動までを行なう方法です。

Fujitsu Cloud Service for OSS ( 4OSS ) の特徴は

  • OpenStack準拠
  • API / Ansible / OpenStack Horizon からコントロール可能
  • 回線費用は無償(ベストエフォート)
  • オブジェクトストレージからのダウンロードも無償(ベストエフォート)
  • Firewall(無償)
  • リモートコンソールでの管理画面へのアクセス
  • 単一ゾーンでのSLA 99.99%
  • アンチ・アフィニティをサポート

などです。回線費用やオブジェクトストレージからのダウンロードが無償のため、パケ死を気にすることなく運用が出来ます。

尚、現時点で上記のスペックを満たすリージョンは、JP-East-3 / JP-West-3 です。他のリージョンでは仕様が異なるので、Ansibleは JP-East-3 / JP-West-3 での利用が前提となります。

HA構成時に特定の仮想マシンが常に違うホストで実行されるアンチ・アフィニティ機能もサポートしており、冗長構成で運用時にSLA 99.99%をクリア出来なかった場合の返金のシステムもあります。

https://blog-plaid.com/wp-content/uploads/2018/03/github-logo-1000x333.png

今回、FUJITSU Cloud Service for OSS (4OSS)のハンズオン用のAnsibleのPlaybookサンプル ( r0ckpineさん作成 )がGit Hubにあるので、これを利用します。

Playbookの入手

https://www.mubit.co.jp/sub/products/blue/img2/arrow-finger.gif  https://github.com/r0ckpine/fjcs-ansible-examples

タイトル

  • Practical playbooks to help you build the system on FUJITSU Cloud Service for OSS

4OSSハンズオン用Playbookの内容

  • ネットワーク 構築(Security Group設定)
  • Linux  Server 構築 (インスタンスの起動)
  • インスタンスへの固定IPをアサイン
  • Web Server 構築 (Yum update & httpd のインストール)

 

評価環境 / 無料トライアルキャンペーンを利用

FUJITSU Cloud Service for OSS  (4OSS) 環境を、30日間無料で利用することが出来ます。12時までに申し込めば、即日発効されます。

 用意するもの

  • 契約番号
  • ユーザー名
  • パスワード
  • プロジェクト名  ( 契約番号-prj )
  • プロジェクトID
  • JP-east-3 / JP-west-3 リージョンの利用設定
  • Ansible 実行用サーバー

作業手順

  • Ansible 実行用のLinuxサーバーを構築 ( CentOS / Ubuntu / Mac )
  • Git Hubから4OSSに対応のPlaybookをダウンロード
  • 構成ファイルの編集(アカウント・パスワード・ID・環境・設定・他)
  • 公開鍵・暗号鍵の作成
  • Ansibleの実行

 

Ansible用のLinux Server 構築 

CentOS 7 / RHEL 7
RDOレポジトリからインストールを推奨
Ansible 2.4.4とOpenStack Queensの関連ライブラリがインストールされます
(※EPELレポジトリを使うと、OpenStackライブラリの依存が満たせなくなるので注意)

# --- install for CentOS7 ---
[root]# yum install centos-release-openstack-queens
[root]# yum install ansible
[root]# yum install python2-shade
[root]# yum install python2-openstackclient

# --- git ---
[root]# yum install git

# --- git clone ---
[root]# git clone https://github.com/r0ckpine/fjcs-ansible-examples

Ubuntu 18.04
PIPで最新版をインストールを推奨
※ Ubuntu PPAからAnsible/CloudArchiveをインストールするとコンフリクト起こしやすいので注意

[root]# apt-install python-pip
[root]# pip install python-openstackclient
[root]# pip install shade
[root]# pip install ansible

Macもpipのセットアップ後は同じ方法で出来ます

 

管理ポータル

JP-east-3 / JP-west-3 リージョンを利用できるように設定します

  • 契約番号
  • ユーザー名  例 4oss-user
  • パスワード  例 16桁以上のパスワード

の入力順となります。

*パスワードは3ケ月毎に変更する必要があります(半角英数字で16文字以上64文字以下)

*API / Ansibleでアクセスの際にもパスワードは使用します

*パスワードの変更はポリシーはAPI / Ansibleでアクセスの際にも適用されます(注意 3ヶ月毎のパスワード変更時には、API / Ansibleに埋め込んだパスワードも変更する必要があります)

https://www.mubit.co.jp/pb-blog/wp-content/uploads/2018/09/4oss-11.png

運用するリージョンの選択

  • 管理 ーー> IaaS管理を選択

https://www.mubit.co.jp/pb-blog/wp-content/uploads/2018/09/4oss-60-768x650.png

jp-east-3 や jp-west-3 を選択

  • リージョン ーー> jp-east-3 / jp-west-3 を選択
  • 「利用開始」をクリック

Ansibleの構成ファイルに登録するプロジェクト名とプロジェクトIDを入手します

  • プロジェクトを選択

  • プロジェクト名  例 契約番号-prj
  • プロジェクトID

 

作成するネットワーク&サーバー構成

 

dir構成

fjcs-ansible-examples/
├── clouds.yml ・・・・・・・OpenStackの認証情報       ← アカウント情報 編集
├── webserver.yml  ・・・・・Ansible playbook
└── webserver_vars.yml ・・・Playbookで読み込む変数 ← 必要に応じて編集

 

とりあえず使うには

clouds.yml のアカウント情報のみを設定すれば動作します

 

clouds.yml の記述内容 ( jp-east-3の場合)

4OSSのアカウント情報を設定します

clouds:
jp-east-3:
auth:
auth_url: https://identity.jp-east-3.cloud.global.fujitsu.com/v3
username: “YOUR USERNAME”          ←ユーザー名
password: "YOUR PASSWORD"          ←パスワード
project_domain_name: "YOUR DOMAIN NAME"  ←契約番号
user_domain_name: "YOUR DOMAIN NAME"     ←契約番号
project_name: "YOUR PROJECT NAME"        ←プロジェクト名=契約番号-prj
#project_id: "YOUR PROJECT UUID"     ←プロジェクトID / 設定しなくても動作します
identity_api_version: '3'
region_name: jp-east-3

webserver_vars.yml の記述内容

target_cloud: jp-east-3             ←利用するリージョンを指定
network_name: test-network               ←ネットワーク名
subnet_name: test-subnet             ←サブネット名
subnet_cidr: 192.168.100.0/24          ←LAN
dns_servers: [ 8.8.8.8 ]                 ←DNS
router_attached_network: fip-net       ←fip-net名は変更禁止
router_name: test-router                ←router名
keypair_name: ansible_key
keypair_public_key_file_path: ./id_rsa_ansible.pub ←SSH鍵は事前作成してパス指定
keypair_private_key_file_path: ./id_rsa_ansible
volume_name: test-volume
volume_image: "CentOS 7.3 64bit (English) 01" ←サンプルはCentOS
volume_size: 35                      ←HDDサイズ指定 35GB (min 30GB/CentOS)
server_name: test-server                ←サーバー名
server_flavor: C3-1                ←サーバースペックを指定 (1vCPU/2GB)

webserver.yml:
OpenStackでネットワーク・インスタンス作成

Ansibleを実行するホストからOpenStackを操作する
ネットワーク、インスタンス作成までを行います。
作成されたインスタンスを続くPlayで操作する準備をします。

name: create webserver instance and the network
hosts: localhost                ← 実行対象はローカルホスト
connection: local               ← 実行対象はローカルホスト
gather_facts: no
vars_files:
- webserver_vars.yml
tasks:
- name: create a network

OpenStackでネットワーク作成

name: create a subnet
os_subnet:  OpenStack subnet module
name: "{{ subnet_name }}"
network_name: "{{ network_name }}"
cidr: "{{ subnet_cidr }}"                   ← ネットワーク名、CIDR
dns_nameservers: "{{ dns_servers }}"        ←DNSなどを指定/サブネット作成
cloud: "{{ target_cloud | default(omit) }}"
state: present

OpenStackでセキュリティグループ・ルール作成

- name: create SSH security group
os_security_group:              ←OpenStack security group module
name: ssh                       ←sshというsecurity groupを作成
cloud: "{{ target_cloud | default(omit) }}"
state: present
- name: create rule to allow SSH connections
os_security_group_rule:         ← OpenStack security group rule module
security_group: ssh             ← ssh SGに、port 22のリモート接続許可
protocol: tcp
port_range_min: 22
port_range_max: 22
remote_ip_prefix: 0.0.0.0/0
cloud: "{{ target_cloud | default(omit) }}"
state: present

OpenStackにキーペアを登録

webserver_vars.yml

- name: register an public key as keypair
os_keypair: ←OpenStack keypair module
name: "{{ keypair_name }}"
cloud: "{{ target_cloud | default(omit) }}"
public_key_file: "{{ keypair_public_key_file_path }}"  ←インスタンスログインに使用するSSH鍵を指定
state: present

OpenStackでインスタンス起動

name: create instance and boot from the volume
os_server:                                ← OpenStack server module
name: "{{ server_name }}"
flavor: "{{ server_flavor }}"
key_name: "{{ keypair_name }}"
boot_volume: "{{ volume_name }}"
security_groups:
- default
- ssh
- http
network: "{{ network_name }}"
auto_ip: yes                              ← Floating IPを自動で付与する
userdata: "{{ server_userdata | default(omit) }}"
meta: "{{ server_meta | default(omit) }}"
cloud: "{{ target_cloud | default(omit) }}"
state: present

作成したインスタンスをInventory登録

- name: retrieve facts about the instance
os_server_facts: ← OpenStack server_facts module
server: "{{ server_name }}"
cloud: "{{ target_cloud | default(omit) }}"
register: nova_webserver                 ← 取得したインスタンス情報を登録
- name: add webserver to inventory
add_host:                                ← インスタンス情報を基にInventory追加
name: "{{ item.name }}"
groups: webservers
ansible_host: "{{ item.accessIPv4 }}"
ansible_user: k5user
ansible_ssh_private_key_file: "{{ keypair_private_key_file_path }}"
ansible_ssh_extra_args: "-o StrictHostKeyChecking=no -o
UserKnownHostsFile=/dev/null"
with_items: "{{ nova_webserver.ansible_facts.openstack_servers }}"

インスタンスのアップデートとhttpdインストールを行う

- name: perform yum update and httpd installation
hosts: webservers                    ← “webservers” に対するPlaybook
vars_files:
- webserver_vars.yml
become: yes
tasks:
- name: perform yum update           ← yum updateとhttpd インストールを実施
yum:
name: '*'
state: latest
environment: "{{ proxy_env | default(omit) }}“
- name: install the latest version of httpd
yum:
name: httpd
state: latest
environment: "{{ proxy_env | default(omit) }}"

 

OpenStackでインスタンスを再起動しポートを開ける

- name: restart the instance, then allow HTTP connections
hosts: localhost      ←実行対象をローカルホストに戻して
connection: local    ←OpenStackを操作
gather_facts: no
vars_files:
- webserver_vars.yml
tasks:
- name: stop the instance
os_server_action:                             ← OpenStack server_action module
action: stop                                  ← でstop/startを実行
server: “{{ server_name }}”
cloud: "{{ target_cloud | default(omit) }}"
timeout: 180
- name: start the instance
os_server_action:
action: start
server: "{{ server_name }}"
cloud: "{{ target_cloud | default(omit) }}"
timeout: 180

webserver.ymlの構成

5つのPlayで構成

開始
OpenStack操作

  • OpenStackでネットワーク・インスタンス作成

インスタンス操作

  • インスタンスが接続可能になるまで待つ
  • インスタンスにApacheをインストール

OpenStack操作

  • OpenStackでインスタンス再起動、SG更新

情報を表示

終了

 

—————–   ここから実行 —————–

Keypair登録用の公開鍵・暗号鍵を作成

  • Keypairのパスフレーズを入力(空にするとパスフレーズ無しで生成)
[root]# cd fjcs-ansible-examples
[root]# ssh-keygen -f id_rsa_ansible
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): <-- パスフレーズを入力

Ansible実行 (数分程度の時間がかかります)

  • 途中でパスフレーズを入力(Keypair 登録時と同一のパスフレーズ)
[root]# ansible-playbook webserver.yml
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

PLAY [create webserver instance and the network] ********************************************************************************

TASK [create a network] ********************************************************************************
changed: [localhost]

TASK [create a subnet] ********************************************************************************
changed: [localhost]

TASK [create a router] ********************************************************************************
changed: [localhost]

TASK [create SSH security group] ********************************************************************************
changed: [localhost]

TASK [add rule to allow SSH connections] ********************************************************************************
changed: [localhost]

TASK [create HTTP security group] ********************************************************************************
changed: [localhost]

TASK [register an public key as keypair] ********************************************************************************
changed: [localhost]

TASK [create a new volume] ********************************************************************************
ok: [localhost]

TASK [create instance and boot from the volume] ********************************************************************************
changed: [localhost]

TASK [retrieve facts about the instance] ********************************************************************************
ok: [localhost]

TASK [add webserver to inventory] **********************************************************************************************************************
changed: [localhost] => (item={u'vm_state': u'active', u'OS-EXT-STS:task_state': None, u'addresses': 

PLAY [wait for port 22 to be ready] ********************************************************************************

TASK [wait 300 seconds for port 22 to become open] ********************************************************************************
ok: [test-server]

PLAY [perform yum update and httpd installation] ********************************************************************************

TASK [Gathering Facts] ********************************************************************************
Enter passphrase for key './id_rsa_ansible': <-- パスフレーズを入力
ok: [test-server]

TASK [perform yum update] ********************************************************************************
[WARNING]: could not parse environment value, skipping: [u'{{ proxy_env | default(omit) }}']

TASK [perform yum update] ********************************************************************************
[WARNING]: could not parse environment value, skipping: [u'{{ proxy_env | default(omit) }}']

^[[B^[[Bchanged: [test-server]

TASK [install the latest version of httpd] ********************************************************************************
[WARNING]: could not parse environment value, skipping: [u'{{ proxy_env | default(omit) }}']

changed: [test-server]

TASK [enable httpd service] ********************************************************************************
changed: [test-server]

TASK [put a simple web page] ********************************************************************************
changed: [test-server]

PLAY [restart the instance, then allow HTTP connections] ********************************************************************************

TASK [stop the instance] ********************************************************************************
changed: [localhost]

TASK [start the instance] ********************************************************************************
changed: [localhost]

TASK [add rule to allow HTTP connections] ********************************************************************************
changed: [localhost]

TASK [add rule to allow HTTP connections] ********************************************************************************
changed: [localhost]

TASK [add rule to allow HTTP connections] ********************************************************************************
changed: [localhost]

PLAY [print message] ********************************************************************************

TASK [debug] ********************************************************************************
ok: [test-server] => {
"msg": "Please open http://234.62.66.76/"  <-- 自動でアサインされたグローバルIP
}

PLAY RECAP ********************************************************************************
localhost : ok=16 changed=14 unreachable=0 failed=0
test-server : ok=7 changed=4 unreachable=0 failed=0
[root]#

 

インスタンスへの接続-1 ( ssh  access  by  k5user )

  • 例   IP=234.62.66.76
  • パスフレーズを入力(Keypair 登録時と同一のパスフレーズ)
[root]# ssh -i id_rsa_ansible k5user@234.62.66.76
Enter passphrase for key 'id_rsa_ansible':      <-- パスフレーズを入力
Last login: Thu Oct 25 12:38:12 2018 from 234.62.82.49
[k5user@test-server ~]$
[k5user@test-server ~]$ sudo su -l
[root@test-server ~]# pwd
/root
[root@test-server ~]#

インスタンスへの接続-2 ( web )

  • http://234.62.66.76/

今回のサンプルでは、ブラウザに「FUJITSU Cloud Service for OSS」の表示がされれば成功です

 

ネットワークの削除など

作成された各種のルーターやネットワーク設定情報を削除して、初期の状態にする場合の手順(GUIからの操作手順)

  • サーバーの停止
  • 仮想ルーターのインターフェース(ポート)削除
  • 仮想ルーターの削除
  • 仮想ネットワークの削除(fip-netは削除出来ません)
  • セキュリティグループの削除(defaultは削除できません)

 

 

Fujitsu Cloud Service for OSS (4OSS) の設定&構築

4OSS  GUIからの操作

https://www.mubit.co.jp/sub/products/ca/img2/arrow-finger.gif 超簡単 Fujitsu Cloud Service for OSS (4OSS)を初期設定する

4OSS  リモートコンソールの利用設定

https://www.mubit.co.jp/sub/products/ca/img2/arrow-finger.gif 4OSS上のサーバーへパスワードログインをする

4OSS  Ansibleでの操作

https://www.mubit.co.jp/sub/products/ca/img2/arrow-finger.gif Ansibleで4OSSのNetWork構築やサーバー設定を行なう

4OSS  メモリスワップの追加

https://www.mubit.co.jp/sub/products/ca/img2/arrow-finger.gif 4OSSのLinuxサーバーにmemory swap を設定する

4OSS  Webサーバーを構築

https://www.mubit.co.jp/sub/products/ca/img2/arrow-finger.gif Powered BLUE 870 の構築

4OSS  SSLクライアント認証Webを構築

https://www.mubit.co.jp/sub/products/ca/img2/arrow-finger.gif Powered BLUE Private CA の構築

4OSS  ワンタイムパスワード認証Webを構築

https://www.mubit.co.jp/sub/products/ca/img2/arrow-finger.gif Powered BLUE 870/OTPの構築

4OSS  Webをロードバランスする

https://www.mubit.co.jp/sub/products/ca/img2/arrow-finger.gif 4OSSでWeb/https (443) をロードバランスする

4OSS  SSLクライアント認証&リバースプロキシ

https://www.mubit.co.jp/sub/products/ca/img2/arrow-finger.gif 4OSSでクライアント認証後に既存Webへリバースプロキシ転送する

4OSS  ロードバランサ&SSLクライアント認証&リバースプロキシ

https://www.mubit.co.jp/sub/products/ca/img2/arrow-finger.gif 4OSSでロードバランサー配下でクライアント認証後に既存Webへリバースプロキシ転送する

4OSS 多要素認証&リバースプロキシ対応のWebを構築

https://www.mubit.co.jp/sub/products/ca/img2/arrow-finger.gif 多要素認証&リバースプロキシ対応のWebサーバーを構築

 

富士通マーケットプレース

Fujitsu MetaArc Marketplace / Fujitsu Cloud Service for OSS (4OSS)

Fujitsu Cloud Service for OSSのマーケットプレイス