富士通が運用する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%をクリア出来なかった場合の返金のシステムもあります。

今回、FUJITSU Cloud Service for OSS (4OSS)のハンズオン用のAnsibleのPlaybookサンプル ( r0ckpineさん作成 )がGit Hubにあるので、これを利用します。
Playbookの入手
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に埋め込んだパスワードも変更する必要があります)

運用するリージョンの選択
- 管理 ーー> IaaS管理を選択

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からの操作
超簡単 Fujitsu Cloud Service for OSS (4OSS)を初期設定する
4OSS リモートコンソールの利用設定
4OSS Ansibleでの操作
Ansibleで4OSSのNetWork構築やサーバー設定を行なう
4OSS メモリスワップの追加
4OSSのLinuxサーバーにmemory swap を設定する
4OSS Webサーバーを構築
4OSS SSLクライアント認証Webを構築
4OSS ワンタイムパスワード認証Webを構築
4OSS Webをロードバランスする
4OSSでWeb/https (443) をロードバランスする
4OSS SSLクライアント認証&リバースプロキシ
4OSSでクライアント認証後に既存Webへリバースプロキシ転送する
4OSS ロードバランサ&SSLクライアント認証&リバースプロキシ
4OSSでロードバランサー配下でクライアント認証後に既存Webへリバースプロキシ転送する
4OSS 多要素認証&リバースプロキシ対応のWebを構築
富士通マーケットプレース
Fujitsu MetaArc Marketplace / Fujitsu Cloud Service for OSS (4OSS)
Fujitsu Cloud Service for OSSのマーケットプレイス
