富士通が運用する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のマーケットプレイス