AnsibleでOpenStackにインスタンス作成

スポンサーリンク

Ansibleについて

Ansibleの構築と詳細はこちら

OpenStackについて

OpenStackの構築と詳細はこちら

今回やってみること

APIが用意されているクラウド環境(AWS、OpenStack等)では、Ansibleを利用して、クラウド環境の構成管理を行うことができます。

クラウド環境は、Webブラウザを利用して、GUIでインスタンスやネットワークの構築が簡単に行うことができまが、多数の仮想ホストを管理するようになると時間や手間がかかり、管理も大変になります。

そこで、Ansibleの出番です!

Ansibleで、クラウド環境を自動で構築と管理するようにして、オペレーションミスや管理の手間から開放されましょう!

今回はその第一歩として、Ansibleを利用して、OpenStackにインスタンス(仮想ホスト)を作成します。

実行環境

Ansible

  • CentOS7.4
    • Ansible 2.4.3.0
    • python 2.7.5

OpenStack

認証ファイルの確認

  • OpenStackをインストールしたサーバにログインし、認証情報を確認する
# cat ~/keystonerc_admin 
unset OS_SERVICE_TOKEN
    export OS_USERNAME=admin
    export OS_PASSWORD='p@ssw0rd'
    export OS_AUTH_URL=http://192.168.1.10:5000/v3
    export PS1='[\u@\h \W(keystone_admin)]\$ '

export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_IDENTITY_API_VERSION=3

AnsibleからAPIを叩く際に、利用するのでメモをとっておきましょう!

認証ファイルの作成

  • Ansible コントローラにログイン後にcloud.ymlファイル(認証ファイル)を作成
# vi 任意のディレクトリ/clouds.yml 

確認した認証情報を元に以下の通りに作成する(環境に合わせて変更してください)

---
clouds:
  mycloud:
    auth:
      auth_url: http://192.168.1.10:5000/v3 → OS_AUTH_URL
      username: admin                       → OS_USERNAME
      password: p@ssw0rd                    → OS_PASSWORD
      project_domain_id: default            → OS_PROJECT_DOMAIN_NAM
      project_name: admin                   → OS_PROJECT_NAME
      user_domain_id: default               → OS_USER_DOMAIN_NAME
    identity_api_version: '3'               → OS_IDENTITY_API_VERSION

Playbookの作成と実行

playbookの作成

# vi 任意のディレクトリ/test_setup_instance.yml 
---
clouds:
  mycloud:
    auth:
      auth_url: http://192.168.1.10:5000/v3
      username: admin
      password: p@ssw0rd
      project_domain_id: default
      project_name: admin
      user_domain_id: default
    identity_api_version: '3'
(venv) [root@router openstack-ansible]# cat test_setup_instance.yml 
---
- name: Setup env for OpenStack
  hosts: localhost
  gather_facts: false

# 変数定義
  vars:
    cloud_credential: mycloud → 認証ファイルを指定
    internal_network:
      name: int_net           → 接続ネットワーク名
      subnet_name: int_sub    → サブネット名
    external_network:
      name: ext_net           → 外部ネットワーク名
      router_name: public_router → 接続ルータ名
    instance:
      name: nginx             → インスタンス名
      key: ansible-con    → 公開鍵名
      sec_name: default       → セキュリティグループ名

# 内部ネットワークを作成      
  tasks:
    - name: Deploy network
      os_network:
        cloud: "{{ cloud_credential }}"
        state: present
        name: "{{ internal_network.name }}"

# 内部ネットワークのサブネットを作成
    - name: Setup subnet
      os_subnet:
        cloud: "{{ cloud_credential }}"
        state: present
        name: "{{ internal_network.subnet_name }}"
        network_name: "{{ internal_network.name }}"
        cidr: 192.168.5.0/24
        gateway_ip: 192.168.5.1
        dns_nameservers: 8.8.8.8

# ルータの作成
    - name: Setup router
      os_router:
        cloud: "{{ cloud_credential }}"
        state: present
        name: "{{ external_network.router_name }}"
        network: "{{ external_network.name }}"
        interfaces: "{{ internal_network.subnet_name }}"

# インスタンスの作成
    - name: Setup instance
      os_server:
        cloud: "{{ cloud_credential }}"
        state: present
        name: "{{ instance.name }}"
        image: centos7.4_dhcp       → インストールするイメージを指定
        key_name: "{{ instance.key }}"
        flavor: 2                   → フレーバーを指定する
        network: "{{ internal_network.name }}"
        security_groups: "{{ instance.sec_name }}" 
        wait: yes

Playbookの実行

  • インベントリは指定しません(localhostに対して、実行するため)
# ansible-playbook test_setup_instance.yml
(venv) [root@router openstack-ansible]# ansible-playbook test_setup_instance.yml 
 [WARNING]: Unable to parse /etc/ansible/hosts as an inventory source

 [WARNING]: No inventory was parsed, only implicit localhost is available

 [WARNING]: provided hosts list is empty, only localhost is available. Note
that the implicit localhost does not match 'all'


PLAY [Setup env for OpenStack] *************************************************

TASK [Deploy network] **********************************************************
ok: [localhost]

TASK [Setup subnet] ************************************************************
ok: [localhost]

TASK [Setup router] ************************************************************
ok: [localhost]

TASK [Setup instance] **********************************************************
changed: [localhost]

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

ブラウザからインスタンスが作成されているかを確認する

openstack-instance

作成できていますね!

SSHでログインする

# ssh 192.168.1.21 -l centos
Last login: Thu Mar  8 02:26:07 2018
[root@host-192-168-5-11 ~]# 
[root@host-192-168-5-11 ~]# 

今回は、ここまでです!

最後に

Ansibleでクラウド環境を管理するPlaybookを作成することで、構築と管理の作業の時間を大幅に削減することができます。

今回のPlaybookを少し手を加えるだけでも、任意のイメージのインスタンスを複数ホスト作成することができると思います。

コマンドを入力してサーバを構築することも重要ですが、これからは構成管理のツールを利用してクラウド環境か仮想ホストを構築することが主流となると考えられます。

次回は、ダイナミックインベントリを取り扱います!

コメント

タイトルとURLをコピーしました