2015-06-17 2 views
0

Я разворачиваю новые виртуальные машины с использованием шаблона жары openstack и получаю список IP недавно созданных виртуальных машин. Я использую Ansible скрипты для того же самого.Openstack Heat & Ansible. Развертывание VM и развертывание приложений

Я могу получить новый список IP-адресов от тепла, и я могу развернуть приложение, используя with_items в последовательном порядке.

Как выполнить параллельное развертывание с использованием Ansible-скриптов, чтобы общее время развертывания на «n» серверах было таким же, как у одного сервера.

ответ

3

Один из вариантов заключается в создании dynamic inventory script, который будет извлекать экземпляр ips из Heat и сделать их доступными для Ansible. Рассмотрим шаблон тепла, который выглядит следующим образом:

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]} 

После развертывания этого стека, мы можем получить список открытых изобр как это:

$ 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" 
} 

Предположим, что мы имеем следующую анзибль пьес:

- 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 будет сериализовывать вещи , не сообщая вам).

+0

Спасибо за ваше предложение. Это один из простых и лучших подходов. Нам удалось заставить его работать без скрипта python. мы определили роли и структурировали оркестровку для развертывания нескольких пакетов на недавно развернутых виртуальных машинах параллельно. Еще раз спасибо. – Sabeepeace

Смежные вопросы