tripleo-operator-ansible - Ansible 角色和模块,用于与 TripleO 交互

https://blueprints.launchpad.net/tripleo/+spec/tripleo-operator-ansible

作为 TripleO 部署的操作员,我希望能够使用支持的 Ansible 角色和模块,以便在我的自动化中执行与 TripleO 相关的操作。

问题描述

现有的 tripleo-ansible 仓库当前包含角色、插件和模块,这些角色、插件和模块被 TripleO 使用来执行实际的部署和配置。由于这些是 TripleO 的内部实现,我们不希望操作员直接使用它们。 tripleo-ansible 仓库也是分支化的,这意味着仓库内的内容和打包方式特定于单个发布版本。 本规范建议创建一个新的仓库,用于针对任何受支持版本进行外部自动化。

目前,操作员没有一组官方的 Ansible 角色和模块可用于部署和管理 TripleO 环境。 对于希望以自动化方式管理其 TripleO 环境的人员,我们已经看到许多人实现了相同的角色来管理 TripleO。 例如,tripleo-quickstarttripleo-quickstart-extrasinfraredtripleo-lab

  • TripleO 应该提供一组 Ansible 角色和模块,供最终用户用于部署和管理 Undercloud 和 Overcloud。

  • TripleO 应该提供一组 Ansible 角色和模块,用于执行缩放操作。

  • TripleO 应该提供一组 Ansible 角色和模块,用于执行更新和升级操作。

提议的变更

概述

TripleO 应该创建一个新的仓库,用于存储封装 TripleO 操作的 Ansible 角色、插件和模块。 该仓库应该是无分支的,以便角色可以与 TripleO 的任何当前受支持版本一起使用。 目标是仅提供 TripleO 操作的自动化,而不一定是其他云相关的操作。 此新仓库中的角色应仅针对提供现有 tripleoclient 命令的自动化接口。 该仓库可以提供基本的设置操作,例如围绕 tripleo-repos 实现包装器。 此仓库中包含的角色不应实现其他云相关的二级操作,例如在部署的 Overcloud 上创建服务器、网络或其他资源。

这个新的仓库应该能够通过 RPM 进行打包和分发,并且能够发布到 Ansible Galaxy。 此新仓库的结构应与 Ansible collections 兼容。

新仓库的目标受众是希望围绕 TripleO 编写自动化的最终用户(操作员、开发人员等)。 新仓库和角色将是我们官方支持的自动化制品。 一种描述方法就像为给定的软件提供 Puppet 模块,以便可以使用 Puppet 的用户来使用它。 现有的 CLI 将继续为不想使用 Ansible 自动化 TripleO 部署或希望继续手动使用 CLI 的用户而运行。 这些角色不是 CLI 的替代品,而只是为使用 Ansible 的人提供一组官方角色。

Ansible 用户的集成点将是通过 tripleo-operator-ansible 提供的角色。 我们期望用户通过包含我们提供的角色来执行操作。

用户的一个示例 playbook 可能是

- hosts: undercloud
  gather_facts: true
  tasks:
    - include_role:
        role: tripleo_undercloud
        tasks_from: install
        vars:
          tripleo_undercloud_configuration:
             DEFAULT:
                 undercloud_debug: True
                 local_ip: 192.168.50.1/24
    - name: Copy nodes.json
      copy:
        src: /home/myuser/my-environment-nodes.json
        dest: /home/stack/nodes.json
    - include_role:
        role: tripleo_baremetal
        tasks_from: introspection
        vars:
          tripleo_baremetal_nodes_file: /home/stack/nodes.json
          tripleo_baremetal_introspection_provide: True
          tripleo_baremetal_introspection_all_managable: True
    - include_role:
        role: tripleo_overcloud
        tasks_from: deploy
        vars:
          tripleo_overcloud_environment_files:
            - network_isolation.yaml
            - ceph_storage.yaml
          tripleo_overcloud_roles:
            - Controller
            - Networker
            - Compute
            - CephStorage

这些角色的内部实现可能以两种不同的方式进行

  • 使用 execs、shell 或 commands 实现对实际 TripleO 命令调用的简单包装器。 这种路径可能是实现初始实现的最快路径。

- name: Install undercloud
  command: "openstack undercloud install {{ tripleo_undercloud_install_options }}"
  chdir: "{{ tripleo_undercloud_install_directory }}"
  • 实现一个 python 包装器来调用提供的 tripleoclient 类。 这种路径可能是一个长期的目标,因为我们可能能够通过使用模块提供更好的测试。

#!/usr/bin/python

# import the python-tripleoclient
# undercloud cli

from tripleoclient.v1 import undercloud

import sys
import json
import os
import shlex

# See the following for details
# https://opendev.org/openstack/python-tripleoclient/src/branch/
# master/tripleoclient/v1/undercloud.py

# setup the osc command


class Arg:
    verbose_level = 4


# instantiate the
u = undercloud.InstallUndercloud('tripleo', Arg())

# prog_name = 'openstack undercloud install'
tripleo_args = u.get_parser('openstack undercloud install')

# read the argument string from the arguments file
args_file = sys.argv[1]
args_data = file(args_file).read()

# For this module, we're going to do key=value style arguments.
arguments = shlex.split(args_data)
for arg in arguments:

    # ignore any arguments without an equals in it
    if "=" in arg:

        (key, value) = arg.split("=")

        # if setting the time, the key 'time'
        # will contain the value we want to set the time to

        if key == "dry_run":
            if value == "True":
                tripleo_args.dry_run = True
            else:
                tripleo_args.dry_run = False

        tripleo_args.force_stack_validations = False
        tripleo_args.no_validations = True
        tripleo_args.force_stack_update = False
        tripleo_args.inflight = False

        # execute the install via python-tripleoclient
        rc = u.take_action(tripleo_args)

        if rc != 0:
            print(json.dumps({
                "failed": True,
                "msg": "failed tripleo undercloud install"
            }))
            sys.exit(1)

        print(json.dumps({
            "changed": True,
            "msg": "SUCCESS"
        }))
        sys.exit(0)
- name: Install undercloud
  tripleo_undercloud:
    install: true
    foo: bar

需要评估这些实现,以了解在尝试支持 TripleO 的多个版本时,哪种实现效果最好,其中选项可能可用也可能不可用。 这方面的例子是,我们支持版本 >= Stein 中的一个 cli 参数,但在该版本之前不支持。

目标是在单个周期内拥有一个完整的角色集来执行基本的部署。 我们可以迭代角色的内部实现,一旦我们建立了一个基本的集合来证明这个概念。 更多复杂的动作或其他版本支持可能在后续周期中进行。

替代方案

  • 什么都不做,继续让多个工具重新实现 Ansible 角色中的操作。

  • 选择现有集合中的一个单一实现,并将它们合并到这个现有工具中。 但是,这可能包括超出 TripleO 管理范围的其他操作。 这也可能限制其他人的集成,如果建立的接口过于武断。

安全影响

无。

升级影响

不应有升级影响,除非将升级相关的操作导入到此仓库中。

其他最终用户影响

无。

性能影响

无。

其他部署者影响

无。

开发人员影响

开发人员需要确保如果 cli 或其他操作使用新的选项或模式进行更新,则支持的角色需要更新。

实现

负责人

主要负责人

mwhahaha

其他贡献者

weshay emilienm cloudnull

工作项

应该评估现有的角色,以查看是否可以重用并将它们拉入新的仓库。

  • 创建新的 tripleo-operator-ansible

  • 为新仓库建立 CI 和测试框架

  • 评估并尽可能拉入现有角色

  • 初始实现可能只是对 cli 的基本包装

  • 更新 tripleo-quickstart 以利用新提供的角色并删除先前角色。

依赖项

如果需要发生 OpenStack 服务相关的操作,我们可能需要调查包含 OpenStackSDK、shade 或其他上游相关工具。

测试

新的仓库应该对任何新创建的角色进行 molecule 测试。 此外,一旦 tripleo-quickstart 开始使用这些角色,我们需要确保其他部署相关的 CI 作业包含在测试矩阵中。

文档影响

角色应该记录(最好是自动化的),以便操作员能够使用这些新角色。

参考资料

无。