Openstack Heat& Ansible。 VM spup和App部署

时间:2015-06-17 14:33:52

标签: ansible openstack

我正在使用openstack热模板启动新虚拟机并获取新启动的虚拟机的IP列表。我正在使用Ansible脚本。

我能够从热门中获取新的IP列表,并且能够以顺序方式使用with_items部署应用程序。

如何使用Ansible脚本并行部署,以便在" n"服务器与One服务器的服务器相同。

1 个答案:

答案 0 :(得分:3)

一个选项是创建一个dynamic inventory script,它将从Heat获取实例ips并使其可用于Ansible。考虑一个看起来像这样的Heat模板:

heat_template_version: 2014-10-16

resources:

  nodes:
    type: OS::Heat::ResourceGroup
    properties:
      count: 3
      resource_def:
        type: node.yaml

outputs:

  nodes:
    value: {get_attr: [nodes, public_ip]}

这将定义三个nova实例,其中每个实例定义为:

heat_template_version: 2014-10-16

resources:

  node:
    type: OS::Nova::Server
    properties:
      image: rhel-atomic-20150615
      flavor: m1.small
      key_name: lars
      networks:
        - port: {get_resource: node_eth0}

  node_eth0:
    type: OS::Neutron::Port
    properties:
      network: net0
      security_groups:
        - default
      fixed_ips:
        - subnet: 82d04267-635f-4eec-8211-10e40fcecef0

  node_floating:
    type: OS::Neutron::FloatingIP
    properties:
      floating_network: public
      port_id: {get_resource: node_eth0}

outputs:

  public_ip:
    value: {get_attr: [node_floating, floating_ip_address]}

在部署此堆栈后,我们可以获得这样的公共ips列表:

$ heat output-show mystack nodes
[
  "172.24.4.234", 
  "172.24.4.233", 
  "172.24.4.238"
]

我们可以编写一个简单的Python脚本来实现动态库存界面:

#!/usr/bin/python

import os
import argparse
import json
import subprocess

def parse_args():
    p = argparse.ArgumentParser()
    p.add_argument('--list',
                   action='store_true')
    p.add_argument('--host')
    return p.parse_args()

def get_hosts():
    hosts = subprocess.check_output([
        'heat', 'output-show', 'foo', 'nodes'])

    hosts = json.loads(hosts)
    return hosts

def main():
    args = parse_args()

    hosts = get_hosts()

    if args.list:
        print json.dumps(dict(all=hosts))
    elif args.host:
        print json.dumps({})
    else:
        print 'Use --host or --list'
        print hosts

if __name__ == '__main__':
    main()

我们可以测试一下它是否有效:

$ ansible all -i inventory.py -m ping
172.24.4.238 | success >> {
    "changed": false,
    "ping": "pong"
}

172.24.4.234 | success >> {
    "changed": false,
    "ping": "pong"
}

172.24.4.233 | success >> {
    "changed": false,
    "ping": "pong"
}

假设我们有以下Ansible剧本:

- hosts: all
  gather_facts: false
  tasks:
  - command: sleep 60

这将在每个主机上运行sleep 60命令。这应该花费大约一分钟来并行运行,如果事情被序列化则需要大约三分钟。

测试出来:

$ time ansible-playbook -i inventory.py playbook.yaml
PLAY [all] ******************************************************************** 

TASK: [command sleep 60] ****************************************************** 
changed: [172.24.4.233]
changed: [172.24.4.234]
changed: [172.24.4.238]

PLAY RECAP ******************************************************************** 
172.24.4.233               : ok=1    changed=1    unreachable=0    failed=0   
172.24.4.234               : ok=1    changed=1    unreachable=0    failed=0   
172.24.4.238               : ok=1    changed=1    unreachable=0    failed=0   


real    1m5.141s
user    0m1.771s
sys 0m0.302s

如您所见,该命令在所有三个上并行执行 主机,这是你正在寻找的行为(但要注意 this thread, 它描述了Ansible将序列化事物的情况 没有告诉你)。