用Ansible管理你的OpenStack cloud[Openstack]

2019-11-12 11:03:58 浏览数 (1)

使用Ansible playbook自动升级、备份和扩展。

在OpenStack上管理应用程序对系统管理员来说是一大挑战,而找到降低复杂性和产生一致性的方法是取得成功的关键因素。通过使用Ansible,一种无代理的IT自动化技术,系统管理员可以创建Ansible剧本,提供一致性和减少复杂性。

OpenStack提供了丰富的API来管理资源,这导致了许多Ansible模块的创建,这些模块可以很容易地适应任何自动化工作流。与OpenStack实例中的任务自动化功能相结合,操作员可以在内部和外部工作,以协调针对环境的复杂操作。

“第一天”操作是指在环境的初始配置和部署期间执行的任务。Ansible的OpenStack模块索引列出了很多在第一天用来完成任务的常用模块。本文将介绍如何创建各种类型的资源,如网络、卷和实例。“第二天”包括以下内容:

升级将如何发生?

如何维护备份?

环境是如何随着需求扩大的?

Ansible可以很容易地处理这些用例。

例如,考虑需要升级的web服务器集群,所有这些服务器都位于OpenStack负载均衡器之后。通过管理vm本身中的基础设施和任务,操作员可以确保执行的事件序列总是按照特定的顺序发生。这里有一个playbook执行滚动升级的简单例子:

代码语言:javascript复制
- hosts: web

  gather_facts: true

  user: centos

  serial: 1  # ensures only one server will update/reboot at a time

  tasks:

  - name: check for pending updates

    yum:

      list: updates

    register: yum_update # check if there are updates before going any further

  - block: 

      - name: remove web server from pool

        os_member:

          state: absent

          name: '{{ ansible_hostname }}'

          pool: weblb_80_pool

        delegate_to: localhost

      - name: update packages

        package:

          name: '*'

          state: latest

        become: true

      - name: reboot server

        shell: sleep 5 && reboot &

        async: 1

        poll: 0

      - name: wait for server

        wait_for_connection:

          connect_timeout: 20

          sleep: 5

          delay: 5

          timeout: 600

        become: true

      - name: put server back in pool

        os_member:

          state: present

          name: '{{ ansible_hostname }}'

          pool: weblb_80_pool

          address: '{{ ansible_default_ipv4.address }}'

          protocol_port: 80

        delegate_to: localhost

    when:

    - yum_update.results | length > 0 # only execute the block if there are updates

这个剧本首先检查是否有任何更新应用。如果是,playbook将从池中删除节点,应用更新并重新启动节点。一旦节点重新联机,它就被添加回池中。Ansible playbook使用serial关键字来确保一次只从池中删除一个节点。

如果数据库在OpenStack云中运行,那么有时必须恢复备份—或者刷新一些测试数据,或者在发生数据损坏事件时。在数据库服务器和Cinder之间编排任务很容易完成与Ansible:

代码语言:javascript复制
- hosts: db

  gather_facts: true

  user: centos

  tasks:

  - name: stop database

    systemd:

      name: mongod

      state: stopped

    become: true

  - name: unmount db volume

    mount:

      path: /var/lib/mongodb

      state: unmounted

    become: true

  - name: detach volume from server

    os_server_volume: 

      state: absent

      server: db0

      volume: dbvol

    delegate_to: localhost

  - name: restore cinder backup

    command: openstack volume backup restore dbvol_backup dbvol

    delegate_to: localhost

    register: vol_restore

    failed_when:

    - vol_restore.rc > 0

    - "'VolumeBackupsRestore' not in vol_restore.stderr"

  - name: wait for restore to finish

    command: openstack volume show -c status -f value dbvol

    register: restore_progress

    until: restore_progress.stdout is search("available")

    retries: 60

    delay: 5

    delegate_to: localhost

  - name: reattach volume to server

    os_server_volume: 

      state: present

      server: db0

      volume: dbvol

      device: /dev/vdb

    delegate_to: localhost

  - name: mount db volume

    mount:

      path: /var/lib/mongodb

      state: mounted

      src: LABEL=dbvol

      fstype: xfs

    become: true

  - name: start database

    systemd:

      name: mongod

      state: started

    become: true

仔细查看playbook,您可能已经注意到恢复是通过OpenStack命令行完成的,而不是一个合适的Ansible模块。在某些情况下,用于任务的模块可能不存在,但Ansible足够灵活,允许在开发模块之前调用剧本中的任意命令。觉得你可以写缺少的模块?考虑通过贡献到Ansible项目来创建它。

这只是系统管理员可能需要在他们的云中编排的两天操作。我和罗杰·洛佩兹将在柏林的OpenStack峰会上提供一个动手操作的实验室,提供真实的场景和相关的Ansible剧本来实现自动化。我们也会把我们的例子和材料上传到GitHub的会议周上,以方便那些不能参加会议的人。

0 人点赞