Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CloudOpen 2014 - Extending Cloud Automation: Wh...

CloudOpen 2014 - Extending Cloud Automation: When OpenStack Meets Ansible

cloud automation it ansible openstack avoid

Benjamin Zores

October 14, 2014
Tweet

More Decks by Benjamin Zores

Other Decks in Technology

Transcript

  1. COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED. 1 Benjamin Zores,

    Alcatel-Lucent Enterprise CloudOpen 2014 – 14th October 2014 – Dusseldorf, Germany Extending Cloud Automation: When OpenStack Meets Ansible
  2. 2 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible A Few Things About Me … ALCATEL LUCENT ENTERPRISE TECHNICAL DIRECTOR, PERSONAL CLOUD SOLUTIONS • Cloud Architecture and Application/Infrastructure Design • R&D Development, Automation, Operations … OPEN SOURCE PROJECT FOUNDER, LEADER AND/OR CONTRIBUTOR FOR: • OpenBricks & GeeXboX : Embedded Linux cross-build tool and distribution. • uShare UPnP A/V & DLNA Media Server, FFMpeg, MPlayer … LINUX FOUNDATION CONFERENCES REGULAR LINUX FOUNDATION’S EVENTS SPEAKER • Various talks on: • Linux Embedded Systems at Embedded Linux Conference (Europe) • Android Architecture and Device Porting at Android Builder Summit GNU/LINUX MAGAZINE FRANCE RECURRENT TECHNICAL WRITER • Various publications on: • Android Architecture Internals • Cloud (OpenStack, Ansible …)
  3. 3 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Self-Promotion Time ! Series of articles published in GNU/Linux Magazine France Android 4: Fondements Internes Benjamin Zores, Ed. Diamond – Sept. 2014
  4. 5 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. A Good

    Developer Is A Lazy Developer ! Don’t do over and over again things that someone else can do for you. (especially if that someone is a bot) Extending Cloud Automation: When OpenStack Meets Ansible Why we’re here ?
  5. 6 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible How one feels after deploying its servers through shell scripts … #!/bin/sh echo “net.core.rmem_default=16384" | sudo tee -a /etc/sysctl.conf echo “deb http://nwps.ws/pub/mariadb/repo/5.5/debian wheezy main” | \ sudo tee –a /etc/apt/conf.d/mariadb.conf sudo apt-get -y install mariadb-server […] AWESOME !!
  6. 7 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Shell Scripts + Money = ? ( © John Lynch, http://goo.gl/gkmKGN ) “Model-driven orchestration frameworks for complex infrastructure management and automation”
  7. 9 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible State of the Art Original Rockstars ! - Great Tools - Field Pioneers But just incredibly complex to start with, even for simple cases. Not everyone is managing 500 servers in the cloud after all …
  8. 11 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Introducing Ansible … A fictional machine capable of instantaneous or superluminal communication (© Wikipedia). Design Goals: 1.  Minimal in nature: Python based with no dependencies on the environment. 2.  Consistent. 3.  Secure: relies on OpenSSH only, with no vulnerable remote agents. 4.  Highly-Reliable: N re-deployments provide the same result. 5.  Low Learning Curve. -  SW to manage and configure computers. -  Python + Jinja2 + YAML + SSH (that’s it !). -  Manages nodes over SSH. -  Does not require additional remote dependencies. -  First Release: February 20th 2012.
  9. 12 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Ansible Architecture
  10. 13 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Ansible Default Model: Push to Nodes © Julien Ponge, http://goo.gl/CB5f8a
  11. 14 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Ansible Alternative Model: Pull From Server © Julien Ponge, http://goo.gl/CB5f8a
  12. 15 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Introduction to Ansible [lan1] 192.168.0.1 192.168.0.2 # ansible -i inventory.txt lan1 -m shell -a "/bin/echo Hello World" 192.168.0.1 | success | rc=0 >> Hello World 192.168.0.2 | success | rc=0 >> Hello World # ansible -i inventory.txt lan1 -u ben --sudo -m shell -a "/bin/echo Hello World" Ansible Inventory File Module Arguments Module Name
  13. 16 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Ansible Inventory [europe] foo.domain.com [usa] 192.168.0.1 [world:children] europe usa [webservers] www[01:50].domain.com [databases] db-[a:f].domain.com Hosts can be described by FQDN or IP With support for infinite depth inheritance [targets] localhost ansible_connection=local web1.domain.com ansible_connection=ssh ansible_ssh_user=user1 web2.domain.com ansible_connection=ssh ansible_ssh_user=user2 With support for wildcards And per-host tuning variables.
  14. 17 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Ansible Variables [lan1] 192.168.0.1 msg="Hey !" 192.168.0.2 msg= "What’s up ?" # ansible -i inventory.txt lan1 -m shell \ -a "/bin/echo {{msg}}" 192.168.0.1 | success | rc=0 >> Hey ! 192.168.0.2 | success | rc=0 >> What’s up ? Inventory.txt: [europe:vars] domain=my.domain.eu [usa:vars] domain=my.domain.com ./group_vars/europe : -- domain: my.domain.eu ./group_vars/usa : -- domain: my.domain.com YAML File Format
  15. 18 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Ansible Modules (235 in Ansible v1.7.1) # ansible-doc -l acl Sets and retrieves file ACL information. add_host Add a host (and alternatively a group) to the ansible-playbook alternatives Manages alternative programs for common commands apache2_module Enables/disables a module of the Apache2 webserver apt Manages apt-packages apt_key Add or remove an apt key apt_repository Add and remove APT repositories [...] xattr Set/retrieve extended attributes yum Manages packages with the `yum' package manager zfs Manage zfs zypper Manage packages on SuSE and openSuSE
  16. 19 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Ansible Module How-To # ansible-doc shell > SHELL The [shell] module takes the command name followed by a list of space-delimited arguments. It is almost exactly like the [command] module but runs the command through a shell (`/bin/sh') on the remote node. Options (= is mandatory): - chdir cd into this directory before running the command - creates a filename, when it already exists, this step will *not* be run. - executable change the shell used to execute the command. Should be an absolute path to the executable. = free_form The shell module takes a free form command to run, as a string. There's not an actual option named "free form". See the examples! - removes a filename, when it does not exist, this step will *not* be run. Notes: If you want to execute a command securely and predictably, it may be better to use the [command] module instead. Best practices when writing playbooks will follow the trend of using [command] unless [shell] is explicitly required. When running ad-hoc commands, use your best judgement. # Execute the command in remote shell; stdout goes to the specified # file on the remote - shell: somescript.sh >> somelog.txt
  17. 20 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Ansible Playbooks As appealing as they are, they’ve got nothing to do with this !
  18. 21 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Ansible Playbooks --- - hosts: lan1 remote_user: ben sudo: no vars: name: ”My First Playbook” tasks: - name: verify servers activity ping: - name: say hello shell: /bin/echo "{{name}} {{msg}}” notify: - we are done handlers: - name: we are done shell: /bin/echo ”That’s it !" YAML File Format
  19. 22 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Ansible Playbooks # ansible-playbook -i inventory.txt playbook.yml -v PLAY [lan1] *********************************************************** GATHERING FACTS ***************************************************** ok: [192.168.0.1] ok: [192.168.0.2] TASK: [verify servers activity] ********************************************* ok: [192.168.0.1] => {"changed": false, "ping": "pong”} ok: [192.168.0.2] => {"changed": false, "ping": "pong"} TASK: [say hello] ******************************************************* changed: [192.168.0.1] => {"changed": true, "cmd": "/bin/echo \”My First Playbook Hey !\" ", "delta": "0:00:00.005264", "end": "2014-07-06 16:42:54.115860", "rc": 0, "start": "2014-07-06 16:42:54.110596", "stderr": "", "stdout": ”My First Playbook Hey !"} changed: [192.168.0.2] => {"changed": true, "cmd": "/bin/echo \”My First Playbook What’s up ?\" ", "delta": "0:00:00.002732", "end": "2014-07-06 16:42:54.078013", "rc": 0, "start": "2014-07-06 16:42:54.075281", "stderr": "", "stdout": ”My First Playbook What’s up ?"} […]
  20. 23 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Ansible Playbooks NOTIFIED: [we are done] **************************************** changed: [192.168.0.1] => {"changed": true, "cmd": "/bin/echo \"That’s it !\" ", "delta": "0:00:00.005559", "end": "2014-07-06 16:42:54.312184", "rc": 0, "start": "2014-07-06 16:42:54.306625", "stderr": "", "stdout": "That’s it !"} changed: [192.168.0.2] => {"changed": true, "cmd": "/bin/echo \"That’s it !\" ", "delta": "0:00:00.002824", "end": "2014-07-06 16:42:54.306878", "rc": 0, "start": "2014-07-06 16:42:54.304054", "stderr": "", "stdout": "That’s it !"} PLAY RECAP ************************************************** 192.168.0.1 : ok=4 changed=2 unreachable=0 failed=0 192.168.0.2 : ok=4 changed=2 unreachable=0 failed=0
  21. 24 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Ansible Playbook vars_file: - “vars/common.yml” - “vars/production.yml” tasks: - include: tasks/nginx.yml - include: tasks/php-fpm.yml - include: tasks/mariadb.yml
  22. 25 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Example: (Parts of) MariaDB Cluster Automation [mariadb] 192.168.0.1 name=my-db-maria1 192.168.0.2 name=my-db-maria2 192.168.0.3 name=my-db-maria3 tasks/hosts.yml: - name: declare hosts lineinfile: dest=/etc/hosts regexp='.*{{ item }} .*$' line="{{item}} {{ hostvars[item]['name'] }} {{ hostvars[item]['name'] }}.{{domain}}" state=present with_items: groups['{{hosts_list}}'] - hosts: mariadb vars: domain : domain.com hosts_list: mariadb tasks: - include: tasks/hosts.yml Targets /etc/hosts: 192.168.0.1 my-db-maria1 my-db-maria1.domain.com 192.168.0.2 my-db-maria2 my-db-maria2.domain.com 192.168.0.3 my-db-maria3 my-db-maria3.domain.com
  23. 26 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Example: (Parts of) MariaDB Cluster Automation tasks/mariadb-galera.yml: - name: Add MariaDB APT key apt_key: url=http://keyserver.ubuntu.com/pks/lookup? op=get&fingerprint=on&search=0xcbcb082a1bb943db - name: Add MariaDB APT repository apt_repository: repo='deb http://ftp.igh.cnrs.fr/pub/mariadb/repo/5.5/debian wheezy main' - name: APT pinning for MariaDB action: copy src=files/mariadb.pref dest=/etc/apt/preferences.d/mariadb.pref \ owner=root group=root mode=0644 vars: mariadb_debian_password: my_debian_password mariadb_root_password: my_root_password mariadb_cluster_name: my_cluster mariadb_cluster_list: "{{ groups['mariadb'] }}” mariadb_gcache_size: 4G mariadb_extra_cfg: skip-external-locking: ~ skip-name-resolve: ~ # Force no DNS resolution tasks: - include: tasks/mariadb-galera.yml
  24. 27 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Example: (Parts of) MariaDB Cluster Automation tasks/mariadb-galera.yml: - name: install mariadb-galera-server action: apt name=mariadb-galera-server update_cache=yes - name: copy mysql_secure_installation credentials when: mariadb_root_password is defined action: template src=templates/mariadb_secure_installation.j2 \ dest=/tmp/mariadb_secure_installation owner=root group=root mode=0600 templates/mariadb_secure_installation.j2: {{ mariadb_root_password }} {{ mariadb_root_password }}
  25. 28 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Example: (Parts of) MariaDB Cluster Automation tasks/mariadb-galera.yml: - name: write conf.d/mariadb.cnf action: template src=templates/mariadb.cnf.j2 dest=/etc/mysql/conf.d/mariadb.cnf templates/mariadb.cnf.j2: [mysqld] wsrep_provider=/usr/lib/galera/libgalera_smm.so {% if mariadb_cluster_name is defined %} wsrep_cluster_name='{{ mariadb_cluster_name }}’ {% endif %} {% if mariadb_cluster_list is defined %} wsrep_cluster_address=gcomm:// {{ mariadb_cluster_list[0] }}{% for node in mariadb_cluster_list[1:] %},{{ node }}{% endfor %}{% endif %} Targets /etc/mysql/mariadb.cnf: wsrep_cluster_name=‘my_cluster’ wsrep_cluster_address=gcomm://192.168.0.1,192.168.0.2,192.168.0.3 Jinja2 Syntax
  26. 29 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Example: (Parts of) MariaDB Cluster Automation templates/mariadb.cnf.j2: [mysqld] wsrep_node_address={{ ansible_eth0.ipv4.address }} wsrep_node_name='{{ ansible_hostname }}’ {% if mariadb_extra_cfg is defined %} {% for key, value in mariadb_extra_cfg.iteritems() %} {{ key }}{% if value is not none %}={{ value }}{% endif %} {% endfor %} {% endif %} Target /etc/mysql/mariadb.cnf: wsrep_node_address=192.168.0.1 wsrep_node_name=my-db-maria1 skip-external-locking skip-name-resolve
  27. 31 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible OpenStack in a Nutshell - #1 (most widely adopted) Open-Source IaaS project. - Awesome REST Management API. - Perfect for instant spawning of new Virtual Machines (VMs) - But VMs yet to be configured ... What if I could connect OpenStack VMs with Ansible for nightly CI ?
  28. 32 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible (One of my) Cloud application: OpenTouch TeamShare -  Online collaboration tool for SMBs. -  Provides multi-projects file storage and sharing for enterprises. -  With project management, chat and collaboration capabilities.
  29. 33 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible (One of my) Cloud application network topology -  2x HAProxy Load-Balancers -  2x NGINX frontal Web Servers -  2x NGINX frontal Web File Servers -  2x PHP Backends -  1x SMTP Server -  3x MariaDB Master-Master Galera Cluster + 2x Galera Arbiters -  2x MongoDB Master-Slave Cluster + 1x MongoDB Arbiter -  3x RabbitMQ Master-Master Clusters -  1x LibreOffice Server -  1x NFS Server Now let’s say that I want to test both my application and my infrastructure every single night for non-regression !
  30. 35 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible AvOID: Ansible OpenStack Instances Deployer -  Open Source software by Alcatel-Lucent Enterprise. -  Written in Python with dependencies to OpenStack Nova/Neutron APIs. -  Relies on Ansible with IaaS bindings: -  Currently OpenStack only -  But wide open to support many much more … who knows … -  Comes as a library with both CLI and Web clients. How it works: 1.  Describe your infrastructure topology in a YAML file once and for all. 2.  Run avoid-cli. Grab a coffee, that’s it. How it (internally) works: 1.  Parses your topology file. 2.  Optionally terminates (all) OpenStack VMs and spawn new ones and build Ansible inventory file. 3.  Creates VMs dependency graph for parallelized post-configuration by Ansible. 4.  Post-configure VMs through Ansible playbooks (continuous-integration style).
  31. 36 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible AvOID: Ansible OpenStack Instances Deployer Check it out on GitHub: https://github.com/OpenTouch/AvOID
  32. 37 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible AvOID Topology File - globals: env: dev ssh_key: /path/to/ssh_private_key.pem ssh_user: remote_user os_user: openstack_user os_passwd: openstack_password os_tenant: openstack_tenant os_auth_url: http://my.private.cloud.com:5000/v2.0 os_image: Debian – Wheezy os_network: My OpenStack Tenant Network os_ssh_key: My OpenStack Tenant SSH Key Name ansible_inventory_template: /path/to/ansible/inventory_template.txt ansible_playbooks_directory: /path/to/ansible/playbooks
  33. 38 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible AvOID Topology File nodes: - node: name: web-server-1 flavor: m1.small ansible_config_keys: webserver playbook: webserver additional_network: LAN Network 2, LAN Network 3 security: http, https depends: file-server-1 floating_ips: 1.2.3.4, 5.6.7.8, 10.20.30.40 vips: 10.0.1.2, 10.0.2.2, 10.0.3.2 - node: name: file-server-1 flavor: m3.medium ansible_config_keys: fileserver playbook: fileserver volumes: - { name: web-volume1, size: 1 } - { name: web-volume2, size: 10 }
  34. 39 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible AvOID command-line # avoid-cli Usage: avoid-cli <topology_file.yml> <command> [opts] where <command> is: - status: list topology status - redeploy <list of playbooks or VM names>: terminate VM, spawn a new one and restart playbook - redeployall: redeploy all nodes - runplaybook <list of playbooks>: restart playbook as it - runallplaybooks: restart all playbooks - geninventory: generate Ansible inventory file based on topology.yml
  35. 40 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible AvOID Web UI # avoid-web my-topo-dev.yml Read of my-dev.yml done: 32 VMs and 22 playbooks Now go to http://localhost:8888/ !
  36. 41 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. 32 VMs

    fully deployed in 19mn40s (5mn40s for OpenStack and 14mn and for Ansible post-configuration)
  37. 43 COPYRIGHT © 2014 ALCATEL-LUCENT. ALL RIGHTS RESERVED. Extending Cloud

    Automation: When OpenStack Meets Ansible Let’s keep in touch … benjaminzores @gxben #Benjamin Zores