repl.info

OpenStack Heatを試す

TerraformにするかHeatにするか悩んで、いったんTerraformにしたのだけど、一応Heatも触っておいた方がいいなあと思ったので軽く触る(決める時に触っておこうよという話だが…)。試すだけであればPackStackが楽。例によって、「触ってみた」以上の情報はない。なお、http://docs.openstack.org/developer/heat/ に全ての情報は書かれており、Mitakaを使って試した。

インスタンスを作成する

何はともあれインスタンスを作ってみよう。以下のようなテンプレートを用意する。

heat_template_version: 2016-04-08



description: テストだよ。



resources:

  my_instance:

    type: OS::Nova::Server

    properties:

      name: hoge

      key_name: r_takaishi

      image: cirros

      flavor: m1.tiny

作成。引数の最後で指定しているのはStackの名前で、Stackとはリソースの集合ということのようだ。また、Terraformはインスタンスの作成などは同期実行だが、HeatはOpenStack上のコントローラーがやってくれるので非同期実行である。

$ openstack stack create -t ./r_takaishi.yml r_takaishi

+---------------------+--------------------------------------+

| Field | Value |

+---------------------+--------------------------------------+

| id | 5d85e9a7-92e9-42b4-8c49-279f3f0cf7be |

| stack_name | r_takaishi |

| description | テストだよ。 |

| creation_time | 2017-02-13T11:58:10Z |

| updated_time | None |

| stack_status | CREATE_IN_PROGRESS |

| stack_status_reason | Stack CREATE started |

+---------------------+--------------------------------------+

スタックの詳細を見てみる。

$ openstack stack show r_takaishi

+-----------------------+--------------------------------------------------------------------------------------------------------------------------+

| Field | Value |

+-----------------------+--------------------------------------------------------------------------------------------------------------------------+

| id | 5d85e9a7-92e9-42b4-8c49-279f3f0cf7be |

| stack_name | r_takaishi |

| description | テストだよ。 |

| creation_time | 2017-02-13T11:58:10Z |

| updated_time | None |

| stack_status | CREATE_COMPLETE |

| stack_status_reason | Stack CREATE completed successfully |

| parameters | OS::project_id: 130a838dafb3440b81fb8b2332b2c965 |

| | OS::stack_id: 5d85e9a7-92e9-42b4-8c49-279f3f0cf7be |

| | OS::stack_name: r_takaishi |

| | |

| outputs | [] |

| | |

| links | - href: http://127.0.0.1:8004/v1/130a838dafb3440b81fb8b2332b2c965/stacks/r_takaishi/5d85e9a7-92e9-42b4-8c49-279f3f0cf7be |

| | rel: self |

| | |

| parent | None |

| disable_rollback | True |

| deletion_time | None |

| stack_user_project_id | f8e641a4c3be4badad9f9facc6948bf9 |

| capabilities | [] |

| notification_topics | [] |

| stack_owner | None |

| timeout_mins | None |

| tags | null |

| | ... |

| | |

+-----------------------+--------------------------------------------------------------------------------------------------------------------------+

作成されたリソース一覧。

$ openstack stack resource list r_takaishi

+---------------+--------------------------------------+------------------+-----------------+----------------------+

| resource_name | physical_resource_id | resource_type | resource_status | updated_time |

+---------------+--------------------------------------+------------------+-----------------+----------------------+

| my_instance | 882382de-9997-451f-9105-1f7577943146 | OS::Nova::Server | CREATE_COMPLETE | 2017-02-13T11:58:10Z |

+---------------+--------------------------------------+------------------+-----------------+----------------------+

Horizonからもいろいろ見ることができる。

トポロジーがあった。ほうほう。

リソース一覧。

イベントの一覧も見られる。ここを見ればどのような操作が行われたのか分かるのは便利そう。

というわけで、インスタンスは無事に作成できた。次は、ネットワークを作成してみる。

ネットワークを作成する

manage-networks のサンプルをコピペしてきて、少しリソース名を変更した。

heat_template_version: 2016-04-08



description: テストだよ。



resources:

  my_instance:

    type: OS::Nova::Server

    properties:

      name: hoge

      key_name: r_takaishi

      image: cirros

      flavor: m1.tiny

  my_net:

    type: OS::Neutron::Net

  my_subnet:

    type: OS::Neutron::Subnet

    properties:

      network_id: { get_resource: my_net }

      cidr: "10.8.1.0/24"

      dns_nameservers: ["8.8.8.8", "8.8.4.4"]

      ip_version: 4

スタックを更新することでネットワークとサブネットが作られる模様。dry-runがあるのでまずはそれを試す。

$ openstack stack update --dry-run -t ./r_takaishi.yml r_takaishi

+-----------+--------------------------------------------------------------------------------------------------------------------------------+

| Field | Value |

+-----------+--------------------------------------------------------------------------------------------------------------------------------+

| added | [ |

| | { |

| | "resource_name": "my_net", |

| | "resource_identity": { |

| | "stack_name": "r_takaishi", |

| | "stack_id": "5d85e9a7-92e9-42b4-8c49-279f3f0cf7be", |

| | "tenant": "130a838dafb3440b81fb8b2332b2c965", |

| | "path": "/resources/my_net" |

| | }, |

| | "description": "", |

| | "stack_identity": { |

| | "stack_name": "r_takaishi", |

| | "stack_id": "5d85e9a7-92e9-42b4-8c49-279f3f0cf7be", |

| | "tenant": "130a838dafb3440b81fb8b2332b2c965", |

| | "path": "" |

| | }, |

| | "stack_name": "r_takaishi", |

| | "creation_time": null, |

| | "resource_action": "INIT", |

| | "resource_status": "COMPLETE", |

| | "updated_time": null, |

| | "required_by": [ |

| | "my_subnet" |

| | ], |

| | "resource_status_reason": "", |

| | "physical_resource_id": "", |

| | "attributes": { |

| | "status": null, |

| | "subnets": null, |

| | "qos_policy_id": null, |

| | "admin_state_up": null, |

| | "tenant_id": null, |

| | "mtu": null, |

| | "port_security_enabled": null, |

| | "name": null |

| | }, |

| | "resource_type": "OS::Neutron::Net", |

| | "metadata": {} |

| | }, |

| | { |

| | "resource_name": "my_subnet", |

| | "resource_identity": { |

| | "stack_name": "r_takaishi", |

| | "stack_id": "5d85e9a7-92e9-42b4-8c49-279f3f0cf7be", |

| | "tenant": "130a838dafb3440b81fb8b2332b2c965", |

| | "path": "/resources/my_subnet" |

| | }, |

| | "description": "", |

| | "stack_identity": { |

| | "stack_name": "r_takaishi", |

| | "stack_id": "5d85e9a7-92e9-42b4-8c49-279f3f0cf7be", |

| | "tenant": "130a838dafb3440b81fb8b2332b2c965", |

| | "path": "" |

| | }, |

| | "stack_name": "r_takaishi", |

| | "creation_time": null, |

| | "resource_action": "INIT", |

| | "resource_status": "COMPLETE", |

| | "updated_time": null, |

| | "required_by": [], |

| | "resource_status_reason": "", |

| | "physical_resource_id": "", |

| | "attributes": { |

| | "name": null, |

| | "enable_dhcp": null, |

| | "network_id": null, |

| | "tenant_id": null, |

| | "dns_nameservers": null, |

| | "allocation_pools": null, |

| | "host_routes": null, |

| | "ip_version": null, |

| | "gateway_ip": null, |

| | "cidr": null |

| | }, |

| | "resource_type": "OS::Neutron::Subnet", |

| | "metadata": {} |

| | } |

| | ] |

| deleted | [] |

| replaced | [] |

| unchanged | [] |

| updated | [ |

| | { |

| | "resource_name": "my_instance", |

| | "resource_identity": { |

| | "stack_name": "r_takaishi", |

| | "stack_id": "5d85e9a7-92e9-42b4-8c49-279f3f0cf7be", |

| | "tenant": "130a838dafb3440b81fb8b2332b2c965", |

| | "path": "/resources/my_instance" |

| | }, |

| | "description": "", |

| | "stack_identity": { |

| | "stack_name": "r_takaishi", |

| | "stack_id": "5d85e9a7-92e9-42b4-8c49-279f3f0cf7be", |

| | "tenant": "130a838dafb3440b81fb8b2332b2c965", |

| | "path": "" |

| | }, |

| | "stack_name": "r_takaishi", |

| | "creation_time": "2017-02-13T11:58:10Z", |

| | "resource_action": "CREATE", |

| | "resource_status": "COMPLETE", |

| | "updated_time": "2017-02-13T11:58:10Z", |

| | "required_by": [], |

| | "resource_status_reason": "state changed", |

| | "physical_resource_id": "882382de-9997-451f-9105-1f7577943146", |

| | "attributes": { |

| | "OS-EXT-STS:task_state": null, |

| | "addresses": { |

| | "public": [ |

| | { |

| | "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:a6:79:ad", |

| | "version": 4, |

| | "addr": "172.24.4.229", |

| | "OS-EXT-IPS:type": "fixed" |

| | } |

| | ] |

| | }, |

| | "links": [ |

| | { |

| | "href": "http://127.0.0.1:8774/v2.1/130a838dafb3440b81fb8b2332b2c965/servers/882382de-9997-451f-9105-1f7577943146", |

| | "rel": "self" |

| | }, |

| | { |

| | "href": "http://127.0.0.1:8774/130a838dafb3440b81fb8b2332b2c965/servers/882382de-9997-451f-9105-1f7577943146", |

| | "rel": "bookmark" |

| | } |

| | ], |

| | "image": { |

| | "id": "dd058582-d46c-4cef-84cf-2c96c0429ef2", |

| | "links": [ |

| | { |

| | "href": "http://127.0.0.1:8774/130a838dafb3440b81fb8b2332b2c965/images/dd058582-d46c-4cef-84cf-2c96c0429ef2", |

| | "rel": "bookmark" |

| | } |

| | ] |

| | }, |

| | "OS-EXT-STS:vm_state": "active", |

| | "OS-EXT-SRV-ATTR:instance_name": "instance-00000002", |

| | "OS-SRV-USG:launched_at": "2017-02-13T11:58:18.000000", |

| | "flavor": { |

| | "id": "1", |

| | "links": [ |

| | { |

| | "href": "http://127.0.0.1:8774/130a838dafb3440b81fb8b2332b2c965/flavors/1", |

| | "rel": "bookmark" |

| | } |

| | ] |

| | }, |

| | "id": "882382de-9997-451f-9105-1f7577943146", |

| | "security_groups": [ |

| | { |

| | "name": "default" |

| | } |

| | ], |

| | "user_id": "0e4b78ebf745422ea8acaa4aa3df754b", |

| | "OS-DCF:diskConfig": "MANUAL", |

| | "accessIPv4": "", |

| | "accessIPv6": "", |

| | "progress": 0, |

| | "OS-EXT-STS:power_state": 1, |

| | "OS-EXT-AZ:availability_zone": "nova", |

| | "metadata": {}, |

| | "status": "ACTIVE", |

| | "updated": "2017-02-13T11:58:18Z", |

| | "hostId": "e829214bd5943100a3546508fe272237d372572620c6f47c70a68641", |

| | "OS-EXT-SRV-ATTR:host": "controller", |

| | "OS-SRV-USG:terminated_at": null, |

| | "key_name": "r_takaishi", |

| | "OS-EXT-SRV-ATTR:hypervisor_hostname": "controller", |

| | "name": "hoge", |

| | "created": "2017-02-13T11:58:11Z", |

| | "tenant_id": "130a838dafb3440b81fb8b2332b2c965", |

| | "os-extended-volumes:volumes_attached": [], |

| | "config_drive": "" |

| | }, |

| | "resource_type": "OS::Nova::Server", |

| | "metadata": {} |

| | } |

| | ] |

+-----------+--------------------------------------------------------------------------------------------------------------------------------+

滅茶苦茶長いが、追加したmy_netとmy_subnetがaddedにあることが分かる。これ、リソース増えた時収集つくのだろうか?

ひとまずそれは置いておき、本番実行する。

$ openstack stack update -t ./r_takaishi.yml r_takaishi

+---------------------+--------------------------------------+

| Field | Value |

+---------------------+--------------------------------------+

| id | 5d85e9a7-92e9-42b4-8c49-279f3f0cf7be |

| stack_name | r_takaishi |

| description | テストだよ。 |

| creation_time | 2017-02-13T11:58:10Z |

| updated_time | 2017-02-13T12:19:35Z |

| stack_status | UPDATE_IN_PROGRESS |

| stack_status_reason | Stack UPDATE started |

+---------------------+--------------------------------------+

完了。ネットワークとサブネットが作成されたのか、イベントを見てみる。なお、CLIからも見られるのでそちらを試す。

$ openstack stack event list r_takaishi

2017-02-13 11:58:10Z [r_takaishi]: CREATE_IN_PROGRESS Stack CREATE started

2017-02-13 11:58:11Z [r_takaishi.my_instance]: CREATE_IN_PROGRESS state changed

2017-02-13 11:58:19Z [r_takaishi.my_instance]: CREATE_COMPLETE state changed

2017-02-13 11:58:19Z [r_takaishi]: CREATE_COMPLETE Stack CREATE completed successfully

2017-02-13 12:19:35Z [r_takaishi]: UPDATE_IN_PROGRESS Stack UPDATE started

2017-02-13 12:19:35Z [r_takaishi.my_net]: CREATE_IN_PROGRESS state changed

2017-02-13 12:19:35Z [r_takaishi.my_net]: CREATE_COMPLETE state changed

2017-02-13 12:19:35Z [r_takaishi.my_subnet]: CREATE_IN_PROGRESS state changed

2017-02-13 12:19:36Z [r_takaishi.my_subnet]: CREATE_COMPLETE state changed

2017-02-13 12:19:36Z [r_takaishi]: UPDATE_COMPLETE Stack UPDATE completed successfully

ちゃんと作成されているようだ。リソース一覧もCLIから見られるので見てみよう。

$ openstack stack resource list r_takaishi

+---------------+--------------------------------------+---------------------+-----------------+----------------------+

| resource_name | physical_resource_id | resource_type | resource_status | updated_time |

+---------------+--------------------------------------+---------------------+-----------------+----------------------+

| my_net | e219ca84-d822-4d49-bfeb-339328f1fdc7 | OS::Neutron::Net | CREATE_COMPLETE | 2017-02-13T12:19:35Z |

| my_subnet | 9af0d331-1d87-441f-8061-1aa0f8046c21 | OS::Neutron::Subnet | CREATE_COMPLETE | 2017-02-13T12:19:35Z |

| my_instance | 882382de-9997-451f-9105-1f7577943146 | OS::Nova::Server | CREATE_COMPLETE | 2017-02-13T11:58:10Z |

+---------------+--------------------------------------+---------------------+-----------------+----------------------+

ふむふむ〜。トポロジーを見ると、ネットワークとサブネットが追加されていた。

しかし、ネットワークトポロジーを見ると、パブリックネットワークに繋がっているが、今作成したネットワークには繋がっていない。インスタンスのネットワークを設定していないので、当然である。

 

というわけで、次はmy_netにインスタンスを繋げる。

インスタンスをネットワークに繋げる

my_instanceでnetworksを設定してやるだけでよい。なお、Publicネットワークとの接続はなくなるはず。

heat_template_version: 2016-04-08



description: テストだよ。



resources:

  my_instance:

    type: OS::Nova::Server

    properties:

      name: hoge

      key_name: r_takaishi

      image: cirros

      flavor: m1.tiny

      networks:

        - network: { get_resource: my_net }

  my_net:

    type: OS::Neutron::Net

  my_subnet:

    type: OS::Neutron::Subnet

    properties:

      network_id: { get_resource: my_net }

      cidr: "10.8.1.0/24"

      dns_nameservers: ["8.8.8.8", "8.8.4.4"]

      ip_version: 4

dry-runの結果は滅茶苦茶長いので省略。

$ openstack stack update -t ./r_takaishi.yml r_takaishi

+---------------------+--------------------------------------+

| Field | Value |

+---------------------+--------------------------------------+

| id | 5d85e9a7-92e9-42b4-8c49-279f3f0cf7be |

| stack_name | r_takaishi |

| description | テストだよ。 |

| creation_time | 2017-02-13T11:58:10Z |

| updated_time | 2017-02-13T12:28:40Z |

| stack_status | UPDATE_IN_PROGRESS |

| stack_status_reason | Stack UPDATE started |

+---------------------+--------------------------------------+

イベント一覧を見ると、インスタンスが更新されていることがわかる。

$ openstack stack event list r_takaishi

2017-02-13 11:58:10Z [r_takaishi]: CREATE_IN_PROGRESS Stack CREATE started

2017-02-13 11:58:11Z [r_takaishi.my_instance]: CREATE_IN_PROGRESS state changed

2017-02-13 11:58:19Z [r_takaishi.my_instance]: CREATE_COMPLETE state changed

2017-02-13 11:58:19Z [r_takaishi]: CREATE_COMPLETE Stack CREATE completed successfully

2017-02-13 12:19:35Z [r_takaishi]: UPDATE_IN_PROGRESS Stack UPDATE started

2017-02-13 12:19:35Z [r_takaishi.my_net]: CREATE_IN_PROGRESS state changed

2017-02-13 12:19:35Z [r_takaishi.my_net]: CREATE_COMPLETE state changed

2017-02-13 12:19:35Z [r_takaishi.my_subnet]: CREATE_IN_PROGRESS state changed

2017-02-13 12:19:36Z [r_takaishi.my_subnet]: CREATE_COMPLETE state changed

2017-02-13 12:19:36Z [r_takaishi]: UPDATE_COMPLETE Stack UPDATE completed successfully

2017-02-13 12:28:40Z [r_takaishi]: UPDATE_IN_PROGRESS Stack UPDATE started

2017-02-13 12:28:41Z [r_takaishi.my_instance]: UPDATE_IN_PROGRESS state changed

2017-02-13 12:28:46Z [r_takaishi.my_instance]: UPDATE_COMPLETE state changed

2017-02-13 12:28:47Z [r_takaishi]: UPDATE_COMPLETE Stack UPDATE completed successfully

インスタンスを見てみる。

$ openstack server show hoge

+--------------------------------------+----------------------------------------------------------+

| Field | Value |

+--------------------------------------+----------------------------------------------------------+

| OS-DCF:diskConfig | MANUAL |

| OS-EXT-AZ:availability_zone | nova |

| OS-EXT-SRV-ATTR:host | controller |

| OS-EXT-SRV-ATTR:hypervisor_hostname | controller |

| OS-EXT-SRV-ATTR:instance_name | instance-00000002 |

| OS-EXT-STS:power_state | Running |

| OS-EXT-STS:task_state | None |

| OS-EXT-STS:vm_state | active |

| OS-SRV-USG:launched_at | 2017-02-13T11:58:18.000000 |

| OS-SRV-USG:terminated_at | None |

| accessIPv4 | |

| accessIPv6 | |

| addresses | r_takaishi-my_net-v26sicemoajs=10.8.1.8 |

| config_drive | |

| created | 2017-02-13T11:58:11Z |

| flavor | m1.tiny (1) |

| hostId | e829214bd5943100a3546508fe272237d372572620c6f47c70a68641 |

| id | 882382de-9997-451f-9105-1f7577943146 |

| image | cirros (dd058582-d46c-4cef-84cf-2c96c0429ef2) |

| key_name | r_takaishi |

| name | hoge |

| os-extended-volumes:volumes_attached | [] |

| progress | 0 |

| project_id | 130a838dafb3440b81fb8b2332b2c965 |

| properties | |

| security_groups | [{u'name': u'default'}] |

| status | ACTIVE |

| updated | 2017-02-13T11:58:18Z |

| user_id | 0e4b78ebf745422ea8acaa4aa3df754b |

+--------------------------------------+----------------------------------------------------------+

my_netに繋がっている。ネットワークトポロジーを見ても、my_netに繋がっていることが分かった。

まとめ

Heatを使ってインスタンスを作成した。また、ネットワーク・サブネットを追加したあと、最初に作ったインスタンスをそのネットワークに繋げてみた。

参考リンクは以下の通りです。