LoginSignup
6
5

More than 3 years have passed since last update.

FUJITSU Cloud Service for OSS (旧K5)をAnsibleで操作する

Last updated at Posted at 2018-08-24

はじめに

FUJITSU Cloud Service for OSS (旧K5、表記の便宜上、以降K5と記載します)の第3リージョンでAnsibleが使えるというお話を聞いたので試してみました。
openstackで構築されているため、openstackのモジュールがそのまま利用できます。
まっさらの状態から、ネットワークの設定、インスタンスを起動し、SSHで接続ができるところまでを記録しています。

※本項目の内容には、不具合情報など、現在進行形で流動的な内容が多く含まれるため、できるだけ更新は拾いたいと思いますが、賞味期限は短い可能性があります。

追記:
第二回の記事も投稿しました。

追記2:
ansible-2.6.4 + openstacksdk 2.2.0 の環境でos_routerの不具合は、エラーは出なくなりましたが、まだ正しくは動作しないようです。

事前準備

第3リージョンの利用開始

K5のポータルにログイン後、IaaS管理を選択し、左側のメニューのリージョンから、jp-east-3, jp-west-3 の利用開始ボタンを押します。

Ansibleで利用するK5の各種ID等の情報収集

必要な情報は以下です。
- auth_url → https://identity.リージョン.cloud.global.fujitsu.com/v3
- username → ポータルへログインする際のユーザー名
- password → ポータルへログインする際のパスワード
- project_domain_name → ポータルへログインする際の契約番号
- user_domain_name → project_domain_nameと同じ
- project_name → IaaS管理のプロジェクトメニューで確認できるプロジェクト名
- project_id → IaaS管理のプロジェクトメニューで確認できるプロジェクトID
- region_name → jp-east-3 または jp-west-3

※ここの情報の分類及び説明は、筆者が正確に理解していないため不正確な可能性があります

Ansibleの実行

ansibleの準備

手元のCentOS6のrpm導入済みのpython3.x(epel)ではうまく動作しなかったため、pyenvを利用して環境を構築します。
Pyenvの使い方を参照させて頂きました。

pipでインストールするAnsible、shadeのバージョンを指定していますが、2018/8/24時点での最新版(2.6.3)では、一部機能がどうしても動作しなかったため、うまく動作する組み合わせを指定しています。

以下のコマンドで導入しました。

$ curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
$ cat << _EOF >> ~/.bashrc
export PATH="\$HOME/.pyenv/bin:\$PATH"
eval "\$(pyenv init -)"
eval "\$(pyenv virtualenv-init -)"
_EOF
$ source ~/.bashrc
$ pyenv install 3.6.6
$ pyenv global 3.6.6
$ pip install ansible==2.5.5
$ pip install shade==1.28.0
$ pip install python-novaclient

ansible のplaybookの用意

以下の2ファイルを用意します。

  • clouds.yml .... 利用するアカウントの情報を記載します。上の項目で用意した情報を記載してください。
clouds:
 jp-east-3:
  auth:
   auth_url: https://identity.jp-east-3.cloud.global.fujitsu.com/v3
   username: ****
   password: ****
   project_domain_name: ****
   user_domain_name: ****
   project_name: ****
   project_id: ****
  identity_api_version: '3'
  region_name: ****
  • site.yml .... こちらが処理の本体です。少々長いですが、今回は1ファイルで済ませました。 少々冗長ではあるのですが、複数のルールを登録する場合など、ansibleに慣れていなかった筆者は記法がなかなかわからず困ったので、そのまま残しています。
---
- hosts: localhost
  tasks:
    - name: create network
      os_network:
        cloud: jp-east-3
        state: present
        name: demo-net
    - name: create subnet
      os_subnet:
        cloud: jp-east-3
        name: demo-subnet
        network_name: demo-net
        cidr: 10.122.0.0/24
        dns_nameservers: 8.8.8.8
        state: present
    - name: create router
      os_router:
        cloud: jp-east-3
        name: demo-router
        state: present
        network: fip-net
        interfaces:
          - demo-subnet
    - name: create secutiry group mng
      os_security_group:
        cloud: jp-east-3
        state: present
        name: mng
    - name: add secutiry group rule mng from XXX.XXX.XXX.XXX/XX
      os_security_group_rule:
        cloud: jp-east-3
        state: present
        security_group: mng
        protocol: tcp
        port_range_min: 1
        port_range_max: 65535
        remote_ip_prefix: XXX.XXX.XXX.XXX/XX
    - name: add secutiry group rule mng from YYY.YYY.YYY.YYY/YY
      os_security_group_rule:
        cloud: jp-east-3
        state: present
        security_group: mng
        protocol: tcp
        port_range_min: 1
        port_range_max: 65535
        remote_ip_prefix: YYY.YYY.YYY.YYY/YY
    - name: create secutiry group common
      os_security_group:
        cloud: jp-east-3
        state: present
        name: common
      register: security_group_common
    - name: add secutiry group rule common tcp
      os_security_group_rule:
        cloud: jp-east-3
        state: present
        security_group: common
        protocol: tcp
        port_range_min: 1
        port_range_max: 65535
        remote_group: common
    - name: add secutiry group rule common udp
      os_security_group_rule:
        cloud: jp-east-3
        state: present
        security_group: common
        protocol: udp
        port_range_min: 1
        port_range_max: 65535
        remote_group: common
    - name: add secutiry group rule common icmp
      os_security_group_rule:
        cloud: jp-east-3
        state: present
        security_group: common
        protocol: icmp
        remote_group: common
    - name: create keypair
      os_keypair:
        cloud: jp-east-3
        state: present
        name: demo-key
      register: keypair
#    - debug: var=keypair
    - name: Create local public key
      when: keypair.changed
      local_action:
        module: copy
        content: "{{ keypair.key.public_key }}"
        dest: "~/.ssh/jp-east-3-{{ keypair.key.name }}.pub"
    - name: Create local private key
      when: keypair.changed
      local_action:
        module: copy
        content: "{{ keypair.key.private_key }}"
        dest: "~/.ssh/jp-east-3-{{ keypair.key.name }}"
        mode: 0600
      ignore_errors: True
    - name: create instance
      os_server:
        cloud: jp-east-3
        state: present
        name: demo-instance
        image: "CentOS 7.8 64bit (English) 01"
        flavor: P3-1
        key_name: demo-key
        security_groups:
          - mng
          - common
        network: demo-net
        auto_ip: yes
        boot_from_volume: True
        volume_size: 35
      register: server
    - debug: var=server

行っている処理は以下の通りです。

  • ネットワークの作成
  • Subnetの作成
  • ルータの作成
  • セキュリティグループの作成 (mng, common)
    • mngは外部からの管理アクセスのようなものを想定(例では全ポートだが、SSH等を想定)
    • commonはローカル内での通信の許可
  • セキュリティグループへのルールの追加
    • mng向け: XXX.XXX.XXX.XXX/XX、YYY.YYY.YYY.YYY/YY から全TCPポートでのアクセス許可
    • common向け: tcp, udp, icmpの全許可
  • sshで使用するkeypairの作成及び変数への登録
  • 作成したpublic key, private keyのファイルへの保存
    • ※keypairの作成に成功した場合、~/.ssh/jp-east-3-demo-key, ~/.ssh/jp-east-3-demo-key.pub を上書きするので、念の為注意してください
  • インスタンスの作成 (Global IPを割り当てています)
  • debugでaccessIPv4が確認できるように表示する

ansible-playbookの実行

$ ansible-playbook site.yml

無事成功すれば、accessIPv4 で確認できるIPアドレスに以下で接続できるはず…!

$ ssh -i ~/.ssh/jp-east-3-demo-key k5user@確認したIPアドレス

はまった点

  • epelで入るpython3.4.x にpip で導入したansibleでは、以下のようなエラーが出て最初のnetworkの作成から成功せずに先に進めませんでした。
fatal: [localhost]: FAILED! => {"changed": false, "msg": "NotFoundException:
404: Client Error for url:
https://networking.jp-east-3.cloud.global.fujitsu.com/v2.0/networks.json,
{\"error\": {\"message\": \"The resource could not be found.\", \"code\":
404, \"title\": \"Not Found\"}}"} 
  • 2018/8/24現在の最新のansibleでは、create routerで、外部接続用networkを指定するとエラーになりました。
atal: [localhost]: FAILED! => {"changed": false, "msg": "Error creating router demo-router: Client Error for url: https://networking.jp-east-3.cloud.global.fujitsu.com/v2.0/routers.json, {\"NeutronError\": {\"message\": \"{u'external_gateway_info': {u'network_id': u'XXXXXXXX', u'enable_snat': True}, 'nuage_backhaul_rd': None, 'nuage_backhaul_vnid': None, u'name': u'demo-router', 'tunnel_type': 'DEFAULT', u'admin_state_up': True, 'rt': None, 'tenant_id': u'XXXXXXXX', 'description': '', 'nuage_backhaul_rt': None, 'ecmp_count': None, 'net_partition': None, 'nuage_router_template': None, 'rd': None, 'project_id': u'XXXXXXXX', 'nuage_underlay': None} is disallowed by policy rule (rule:create_router and (rule:create_router:external_gateway_info and (rule:create_router:external_gateway_info:network_id and rule:create_router:external_gateway_info:enable_snat))) with {'project_id': u'XXXXXXXX', 'domain': None, 'project_name': u'XXXXXXXX', 'user_id': u'XXXXXXXX', 'roles': [u'_member_', u'cpf_org_manager', u'cpf_admin'], 'user_domain_id': None, 'service_project_id': None, 'project_domain': None, 'tenant_id': u'XXXXXXXX', 'service_user_domain_id': None, 'service_project_domain_id': None, 'service_roles': [], 'is_admin_project': True, 'service_user_id': None, 'is_admin': False, 'user': u'XXXXXXXX', 'tenant_name': u'XXXXXXXX', 'user_domain': None, 'user_name': u'XXXXXXXX', 'tenant': u'XXXXXXXX', 'project_domain_id': None} \", \"type\": \"PolicyNotAuthorized\", \"detail\": \"\"}}"}

本エラーを確認したのは以下の組み合わせ。
- ansible 2.6.3, openstacksdk 0.17.2
- ansible 2.5.5, shade 1.29.0

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5