[ English | Indonesia | русский ]

使用有限连接进行安装

OpenStack-Ansible 中的许多 playbook 和 role 默认情况下会从公共互联网检索依赖项。示例配置假定部署者通过 OpenStack 管理网络上的路由器提供高质量的互联网连接。

由于以下原因,部署可能会遇到有限的外部连接:

  • 不可靠或低带宽的外部连接

  • 阻止外部连接的防火墙规则

  • 需要通过 HTTP 或 SOCKS 代理进行外部连接

  • 部署者出于隔离 OpenStack 网络的目的而做出的架构决策

  • 不允许任何外部连接的高安全环境

在 OpenStack-Ansible 在阻止互联网连接的网络环境中运行时,我们建议部署者使用以下一组实践和配置覆盖。

以下选项不是互斥的,如果需要可以结合使用。

示例互联网依赖项

  • Python 包

  • 特定于发行版的包

  • LXC 容器镜像

  • 源代码仓库

  • 用于包验证的 GPG 密钥

实践 A:本地镜像互联网资源

您可以选择操作和维护 OpenStack-Ansible 和 OpenStack 依赖项的镜像。镜像通常通过减少对您直接控制之外的资源和系统的依赖来提供大量的风险缓解。镜像还可以提供更高的稳定性、性能和安全性。

Python 包仓库

用于运行 OpenStack 的许多包都是使用 pip 安装的。我们建议镜像 pip 使用的 PyPi 包索引。部署者可以选择主动镜像整个上游 PyPi 仓库,但这可能需要大量的存储空间。或者,可以使用缓存 pip 代理来仅保留所需的包的本地副本。

为了配置部署以使用替代索引,请创建文件 /etc/pip.conf,内容如下,并确保它位于环境中的所有主机上。

[global]
index-url = http://pip.example.org/simple

此外,有必要配置 easy_install 以使用替代索引。easy_install 用于在 wheel 构建期间安装 setup.py 中 setup_requires 下列出的任何内容。请参阅 https://pip.pypa.org.cn/en/2025.2/cli/pip_install/

要配置 easy_install 以使用替代索引,请创建文件 /root/.pydistutils.cfg,内容如下。

[easy_install]
index_url = https://pip.example.org/simple

然后,在 /etc/openstack_deploy/user_variables.yml 中,配置部署将这些文件从主机复制到容器缓存镜像中。

# Copy these files from the host into the containers
lxc_container_cache_files_from_host:
  - /etc/pip.conf
  - /root/.pydistutils.cfg

特定于发行版的包

许多软件包都在 Ubuntu 主机上使用 .deb 包安装。其他 Linux 发行版也存在类似的打包机制。我们建议镜像托管这些包的仓库。

Ubuntu 24.04 LTS 要镜像的上游 Ubuntu 仓库

  • noble

  • noble-updates

OpenStack-Ansible 需要其他几个仓库来安装特定的组件,例如 Galera 和 Ceph。

示例要镜像的仓库(Ubuntu 目标主机)

这些列表并非详尽无遗,并且对于其他 Linux 发行版需要等效项。请参阅 OpenStack-Ansible playbook 和 role 文档,以获取更多仓库以及可用于覆盖仓库位置的变量。

LXC 容器镜像

OpenStack-Ansible 使用 debootstrap 或 dnf 构建 LXC 镜像,具体取决于发行版。为了覆盖包仓库,您可能需要调整一些变量,例如 lxc_apt_mirror 或完全覆盖构建命令,使用 lxc_hosts_container_build_command 请参阅 openstack-ansible-lxc_hosts role,了解有关此场景的配置覆盖的详细信息。

源代码仓库

OpenStack-Ansible 依赖于 Ansible Galaxy 来下载 Ansible role 在引导部署主机时。部署者可能希望镜像 bootstrap-ansible.sh 脚本下载的依赖项。

部署者可以通过设置环境变量 ANSIBLE_GIT_REPO 来配置脚本从替代 Git 仓库获取 Ansible。此外,在初始引导期间,您可能需要定义 openstack/requirements 仓库中 upper-constraints 文件的自定义 URL,使用 TOX_CONSTRAINTS_FILE 环境变量。

部署者可以通过提供自定义 role requirements 文件并使用环境变量 ANSIBLE_ROLE_FILE 指定该文件的路径,来配置脚本从替代位置获取 Ansible role 依赖项。

实践 B:代理访问互联网资源

某些网络没有路由到互联网的访问权限,或者需要某些流量使用特定的应用程序网关,例如 HTTP 或 SOCKS 代理服务器。

目标和部署主机可以配置为通过 HTTP 或 SOCKS 代理服务器访问公共互联网资源。OpenStack-Ansible 可用于配置目标主机以使用代理服务器。OpenStack-Ansible 不提供创建代理服务器的自动化功能。

初始主机部署不在 OpenStack-Ansible 的范围内,部署者必须确保就绪最低限度的代理配置,特别是对于系统包管理器。

apt-get 代理配置

请参阅 Setting up apt-get to use a http-proxy

其他代理配置

除了此基本配置之外,目标主机上还有其他网络客户端可以配置为通过代理连接。例如

  • 大多数 Python 网络模块

  • curl

  • wget

  • openstack

这些工具及其底层库由 Ansible 本身和 OpenStack-Ansible playbook 使用,因此必须有代理配置才能使 playbook 成功访问外部资源。

通常,这些工具会读取包含代理服务器设置的环境变量。如果需要,可以在 /etc/environment 中配置这些环境变量。

重要的是要注意,代理服务器仅应用于访问外部资源,并且 OpenStack 部署的内部组件之间的通信应该是直接的,而不是通过代理。环境变量 no_proxy 用于指定应直接访问而不通过代理的主机。这些通常是管理网络中的主机。

OpenStack-Ansible 提供了两种不同的机制来配置代理服务器设置

1. 默认配置文件建议在所有目标主机上设置持久代理配置,并定义一个持久的 no_proxy 环境变量,其中列出了所有主机/容器的管理地址以及负载均衡器的内部/外部地址。

2. 另一种方法是在 Ansible playbook 执行期间以临时方式应用代理配置,并定义一个管理网络 IP 地址的最小集,用于 no_proxy,这些地址是 playbook 成功的必需地址。这些代理设置在 Ansible playbook 运行后不会持久存在,并且完成的部署不需要它们才能正常运行。

部署者必须决定哪种方法更适合目标主机,并考虑到以下指导原则

1. 持久代理配置是一种标准做法,目标主机上的网络客户端将在部署后能够访问外部资源。

2. 部署者必须确保持久代理配置在 no_proxy 环境变量中对所有 OpenStack 管理网络主机/容器的 IP 地址进行完整覆盖。必须使用 IP 地址列表,CIDR 表示法对 no_proxy 无效。

3. 临时代理配置保证代理环境变量不会持久存在,从而确保 OpenStack 管理网络上的服务之间在部署后的直接通信。部署后,目标主机网络客户端(例如 wget)将无法访问外部资源。

4. no_proxy 的最大长度不应超过 1024 个字符,因为 pam_env PAM 模块中存在固定大小的缓冲区。较长的环境变量将在部署操作期间被截断,这将导致部署期间或部署后出现不可预测的错误。

一旦部署中的主机/容器数量达到一定规模,no_proxy 的长度将超过 1024 个字符,此时必须使用临时代理设置,该设置仅需要在部署时将管理网络 IP 地址的子集存在于 no_proxy 中。

有关配置持久和临时代理环境变量的详细信息,请参阅示例 user_variables.yml 中的 global_environment_variables:deployment_environment_variables:

用于引导 Ansible 的部署主机代理配置

通过设置环境变量 HTTPS_PROXYHTTP_PROXY,配置用于在部署主机上安装 Ansible 和 Ansible role 依赖项的 bootstrap-ansible.sh 脚本以使用代理。

注意

我们建议您在启动任何脚本或 playbook 之前使用代理设置设置您的 /etc/environment 变量,以避免失败。

对于更大或更复杂的环境,专用部署主机允许将最合适的代理配置应用于部署和目标主机。

考虑代理 TLS 流量时

代理 TLS 流量通常会干扰客户端成功验证证书链的能力。OpenStack-Ansible playbook 和 role 中存在各种配置变量,允许部署者忽略这些验证失败。在确定仅由代理服务器引起的故障后,逐个案例禁用证书链验证。