Sep 012014
 

其实这篇文章,是UnitedStack UOS安装多节点OpenStack延续,不过那篇文章太长了,所有就把heat的安装独立出来一篇文章。

必须强调,这几篇文档,都是翻译老外的文档完成https://github.com/MarouenMechtri/OpenStack-Heat-Installation/blob/master/Create-your-first-stack-with-Heat.rst

其实我是无比佩服他们,那么长的文档,我居然没发现一个错误。这要花费多少时间才能做到这种程度。

等我完全搞定在UOS下测试,一定联系这位朋友,告诉他的好消息,在OpenStack下安装OpenStack。

前段时间,有朋友微博发heat工程师招聘,2w的推荐费,看的真的很激动,牙痒痒,后悔怎么不早点让弟兄们开始研究这个呢?真的很后悔,所以今晚好好把heat安装整理一遍。

Heat,其实对于很多Openstack开发工程师,都是比较陌生的一个东西。不过Openstack的未来,很多故事都是需要Heat的完成,例如所谓的弹性扩展,没有Heat,是搞不定的。最热门的App Store,其实都是要考Heat去实现。这也就为啥大家都在下注Heat。当你的IaaS平台稳定后,你感觉还是无法满足你的需求,还是很麻烦,那么你就需要Heat,帮助你减轻负担。

下面这个例子是创建虚拟机,其实还可以帮助你安装,部署虚拟机里的应用。

controller heat

下面的操作都是在控制节点进行就可以。

安装heat

apt-get install -y heat-api heat-api-cfn heat-engine

创建heat数据库 mysql –u root –p

CREATE DATABASE heat;
GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'localhost' IDENTIFIED BY 'HEAT_DBPASS';
GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'%' IDENTIFIED BY 'HEAT_DBPASS';
exit;

创建服务用户

source creds

keystone user-create --name=heat --pass=service_pass --email=heat@domain.com
keystone user-role-add --user=heat --tenant=service --role=admin

注册服务和endpoint

keystone service-create --name=heat --type=orchestration --description="Orchestration"
keystone endpoint-create \
--service-id=$(keystone service-list | awk '/ orchestration / {print $2}') \
--publicurl=http://192.168.100.11:8004/v1/%\(tenant_id\)s \
--internalurl=http://10.0.0.11:8004/v1/%\(tenant_id\)s \
--adminurl=http://10.0.0.11:8004/v1/%\(tenant_id\)s

keystone service-create --name=heat-cfn --type=cloudformation --description="Orchestration CloudFormation"
keystone endpoint-create \
--service-id=$(keystone service-list | awk '/ cloudformation / {print $2}') \
--publicurl=http://192.168.100.11:8000/v1 \
--internalurl=http://10.0.0.11:8000/v1 \
--adminurl=http://10.0.0.11:8000/v1

创建heat_stack_user 角色

keystone role-create --name heat_stack_user

安装Openstack客户端

apt-get install -y python-openstackclient

创建heat domain

source creds

OS_TOKEN=$(keystone token-get |awk "/ id / { print \$4}")

KEYSTONE_ENDPOINT_V3=http://10.0.0.11:5000/v3

HEAT_DOMAIN_ID=$(openstack --os-token $OS_TOKEN --os-url=$KEYSTONE_ENDPOINT_V3 \
--os-identity-api-version=3 domain create heat \
--description "Owns users and projects created by heat" | grep ' id ' | awk "{ print \$4}")

创建 heat_domain_admin 用户

openstack --os-token $OS_TOKEN --os-url=$KEYSTONE_ENDPOINT_V3 \
--os-identity-api-version=3 user create --password service_pass \
--domain $HEAT_DOMAIN_ID heat_domain_admin \
--description "Manages users and projects created by heat"

openstack --os-token $OS_TOKEN --os-url=$KEYSTONE_ENDPOINT_V3 \
--os-identity-api-version=3 role add --user heat_domain_admin \
--domain $HEAT_DOMAIN_ID admin

Create heat_stack_owner role and give role to users (admin and demo) who create Heat stacks:

keystone role-create --name heat_stack_owner

keystone user-role-add --user=demo --tenant=demo --role=heat_stack_owner
keystone user-role-add --user=admin --tenant=demo --role=heat_stack_owner
keystone user-role-add --user=admin --tenant=admin --role=heat_stack_owner

编辑 /etc/heat/heat.conf文件

下面修改需要注意的是stack_user_domain的id,这个你需要用命令去获得

echo $HEAT_DOMAIN_ID

 

[DEFAULT]

instance_user=heat

deferred_auth_method=trusts

heat_metadata_server_url = http://10.0.0.11:8000

heat_waitcondition_server_url = http://10.0.0.11:8000/v1/waitcondition

stack_user_domain=82908ff8d4b4480e8492b63ae12bbb45

stack_domain_admin=heat_domain_admin

stack_domain_admin_password=service_pass

log_dir=/var/log/heat

rabbit_host=10.0.0.11

[database]

connection = mysql://heat:HEAT_DBPASS@10.0.0.11/heat


[ec2authtoken]

auth_uri = http://10.0.0.11:5000/v2.0

[keystone_authtoken]


auth_host = 10.0.0.11
auth_port = 35357
auth_protocol = http
auth_uri = http://10.0.0.11:5000/v2.0
admin_tenant_name = service
admin_user = heat
admin_password = service_pass

初始化数据库

heat-manage db_sync

删除sqllite数据库

rm /var/lib/heat/heat.sqlite

重启服务

service heat-api restart
service heat-api-cfn restart
service heat-engine restart

这样heat就装好了

source creds
heat stack-list

这时候应该什么都没有。下面就使用模板创建一个虚拟机

模板地址

https://raw.githubusercontent.com/MarouenMechtri/OpenStack-Heat-Installation/master/heat%20templates/first-stack.yml

创建一个文件  first-stack.yml

这个yml文件,大概是需要完成下面的工作

  1. 创建一个私有网络
  2. 创建一个路由器
  3. 连接好外部网络和内部网络
  4. 创建两个虚拟机,绑定floating ip

这些工作手工完成,估计工作量不小,下面就一个文件搞定。

stack-resources

运行下面命令就可以

 

source creds

NET_ID=$(nova net-list | awk '/ ext-net / { print $2 }')

SEC_ID=$(nova secgroup-list | awk '/ default / { print $2 }')

heat stack-create -f first-stack.yml \
-P image_id=cirros-0.3.2-x86_64 \
-P public_net=$NET_ID \
-P secgroup_id=$SEC_ID First_Stack

这个时候,虚拟机就开始创建

root@controller:~# heat stack-list
+--------------------------------------+-------------+-----------------+----------------------+
| id                                   | stack_name  | stack_status    | creation_time        |
+--------------------------------------+-------------+-----------------+----------------------+
| 77a63774-239b-4690-89a6-6564e4c58172 | First_Stack | CREATE_COMPLETE | 2014-09-01T14:06:25Z |
+--------------------------------------+-------------+-----------------+----------------------+

看看创建的虚拟机

root@controller:~# nova list
+--------------------------------------+-----------+--------+------------+-------------+-----------------------------------------+
| ID                                   | Name      | Status | Task State | Power State | Networks                                |
+--------------------------------------+-----------+--------+------------+-------------+-----------------------------------------+
| e339f36c-d07d-4906-b589-bef883030758 | Server1   | ACTIVE | -          | Running     | private-net=172.16.2.2, 192.168.100.105 |
| e7b8fedc-ef80-42cc-8e5e-22676ff81d96 | Server2   | ACTIVE | -          | Running     | private-net=172.16.2.3, 192.168.100.104 |
| bf4bca5b-c22e-4a6b-b4c5-869de3723d23 | instance1 | ACTIVE | -          | Running     | int-net=172.16.1.2, 192.168.100.102     |
+--------------------------------------+-----------+--------+------------+-------------+-----------------------------------------+
root@controller:~#

  29 Responses to “OpenStack Heat Installation Guide”

  1. 第三步:创建服务用户的时候
    keystone user-role-add –user=heat –tenant=service –role=admin

    Openstack 自带的tenant是services,而不是service

  2. 注册服务和创建endpoint 的时候少了:
    keystone service-create –name=heat-cfn –type=cloudformation –description=”Heat CloudFormation API”

    • 谢谢指出,那天验证文档才发现。不过后来理解一下,如果我不用aws的CFN,这个endpoint其实是可以不需要。

  3. 你好陈老师:
    按照这个教程,做到将heat 安装成功后,然后使用heat stack-list ,什么都不会显示(连列名都没有),查看/var/log/heat/heat-api.log 错误信息如下:
    Unable to connect to AMQP server :client 0-10,server:9-1
    安装了两次都是同一个错误。但是我排查了以后发现heat.conf里面的rabbitmq信息并没有配置错误。这会是哪方面的原因呢?

    • 使用 heat stack-create 命令也是毫无反应

      • 问题解决了,不过还是不知道什么原因,使用packstack重新装了以下heat。
        还有个问题要问您:NET_ID=$(nova net-list | awk ‘/ ext-net / { print $2 }’)
        这条命令中ext-net 这个网络是我要手动创建的?

        • 对,因为这个文档是参考上一个文档,他的外部网络是已经建立好的。我想这个hot模板,不包括建立外部网络。因为外部网络,不了解实际情况,根本没法创建。

          • 谢谢,陈老师。问题已经全部解决。在搞和docker 的集成。

  4. 陈老师你好,我们公司最近已经开始用Openstack作为私有云,在上面创建很多虚拟机来提供线上服务。
    我想问一下,使用Cinder创建的volume能否设定为支持动态大小的?像VM那样,创建一个1TB的volume,但实际上空间只占很小一部分,挂载到虚拟机上后,虚拟机看的是1TB,但实际上在存储空间中只占了可能20G不到,后期根据虚拟机的使用情况自动向上增长?

  5. 请问一下,一个heat能够用于多个openstack吗?

  6. 我在centos安装 heat的后 进行验证时提示
    Unable to establish connection to http://controller:8004/v1
    然后我查看openstack-heat-api 及openstack-heat-api-cfn 的状态时
    提示 已经死 pid文件还存在 google不了问题所在 ,请问您遇到过这样的问题吗?

  7. 陈老师,heat-cfntools用过吗。

  8. 要我说,OpenStack社区就直接上Chef/Puppet好了。

    何必要去紧跟AWS CloudFormation,再造弄一套复杂工具出来呢?

  9. 陈老师,用Heat实例化了一个Stack,然后想要对这个Stack进行手动缩容(scalein),请问怎么用Heat去做缩容呢?

    • 我没研究过。主要是我认为,你实现了,其实也是一个玩具。在伸缩上,靠cpu和内存作为依据,是不够了。

      • 最近在看heat,也听过用heat做autoscaling不合适的说法。
        陈老师认为实现autoscaling最适合的工具应该是什么呢?

 Leave a Reply

(required)

(required)