使用 Pulp 开发人员环境运行 Galaxy NG¶
Pulp Installer 是基于 forklift 的 Vagrant 配置。
设置环境¶
要求¶
- Python 3+
- Ansible 2.9+
- Vagrant 1.8+
- Vagrant [提供程序插件] (https://www.vagrantup.com/docs/providers/installation.html)
- Libvirt 或 Virtualbox
- Vagrant SSHfs
- 在 BIOS 中启用了虚拟化
1. 安装 Vagrant 及其插件¶
在 Fedora 系统上¶
sudo dnf install ansible vagrant-libvirt vagrant-sshfs @virtualization
在 Debian 系统上¶
# virtualbox (requires sid in sources)
sudo apt install ansible vagrant vagrant-sshfs virtualbox/sid
# libvirt
sudo apt install ansible vagrant vagrant-sshfs vagrant-libvirt dnsmasq libvirt-clients libvirt-daemon libvirt-dbus qemu-system-x86 qemu-utils
sudo usermod -aG libvirt,libvirt-qemu,libvirtdbus $USER
在 Mac 上¶
brew install ansible
brew cask install virtualbox
brew cask install vagrant
在其他主机系统上¶
参考包管理器并搜索等效的包。例如,pacman -S vagrant
安装 Vagrant 插件¶
必需的 Vagrant 插件
vagrant plugin install vagrant-sshfs
可选 插件
vagrant plugin install vagrant-libvirt # to connect to libvirt
vagrant plugin install vagrant-hostmanager # to manage local dns
2. 从源代码克隆存储库¶
提示
如果您计划使用自己的分支进行工作,请将 :pulp/
和 :ansible/
替换为您的 GitHub 用户名。
# required
git clone git@github.com:pulp/pulp_installer
git clone git@github.com:pulp/pulp_ansible.git
git clone git@github.com:pulp/pulp_container.git
git clone git@github.com:ansible/galaxy_ng.git
git clone git@github.com:pulp/pulpcore.git
# optional
git clone git@github.com:ansible/galaxy-importer.git
git clone git@github.com:ansible/ansible-hub-ui.git
确保存储库位于同一文件夹级别
$ tree -a -L 1
.
├── ansible-hub-ui/
├── galaxy-importer/
├── galaxy_ng/
├── pulp_ansible/
├── pulp_container/
├── pulpcore/
└── pulp_installer/
为了避免版本冲突,每个组件都必须使用与 galaxy_ng 兼容的插件版本签出。这些版本可以在 setup.py 中的 requirements
列表中找到。在 setup.py 中找到以下版本
- pulpcore
- pulp_ansible
- pulp_container
cd pulpcore
git checkout <PULPCORE_VERSION>
cd ../pulp_ansible
git checkout <PULP_ANSIBLE_VERSION>
cd ../pulp_container
git checkout <PULP_CONTAINER_VERSION>
cd ..
3. 将工作目录设置为 pulp_installer
目录¶
cd pulp_installer
4. 确保您正在运行最新兼容版本的 pulp_installer。¶
git checkout <PULPCORE_VERSION>
5. 初始化子模块¶
git submodule update --init
6. 创建安装程序配置文件¶
在 pulp_installer
目录的根目录中,创建一个名为 local.dev-config.yml
的新文件,内容如下。
提示
如果您不想从源代码运行 pulpcore 或其中一个插件,您可以在 pulp_install_plugins
下注释掉 source_dir
,并添加 version
或注释掉 pulp_source_dir
并添加 pulpcore_version
。
提示
此配置文件中变量的文档可以在 此处 找到。
---
# Pulp plugins and Python libs
pulp_install_plugins:
pulp-ansible:
source_dir: "/home/vagrant/devel/pulp_ansible"
# version: "<PULP_ANSIBLE_VERSION>"
pulp-container:
source_dir: "/home/vagrant/devel/pulp_container"
# version: "<PULP_CONTAINER_VERSION>"
galaxy-ng:
source_dir: "/home/vagrant/devel/galaxy_ng"
# Uncomment this to run galaxy-importer from source. Other python libs can be installed like this
# as well.
# galaxy-importer:
# source_dir: "/home/vagrant/devel/galaxy-importer"
# Pulp configuration
pulp_source_dir: "/home/vagrant/devel/pulpcore"
pulp_pip_editable: true
# pulpcore_version: "<PULPCORE_VERSION>"
pulp_devel_supplement_bashrc: true
pulp_default_admin_password: password
pulp_webserver_disable_https: true
pulp_user: "vagrant"
developer_user: "vagrant"
developer_user_home: "/home/vagrant"
pulp_workers: 4
pulp_api_workers: 4
pulp_settings:
secret_key: "unsafe_default"
content_origin: "http://{{ ansible_fqdn }}"
x_pulp_api_host: 127.0.0.1
x_pulp_api_port: 24817
x_pulp_api_user: "admin"
x_pulp_api_password: "{{ pulp_default_admin_password }}"
x_pulp_api_prefix: "pulp_ansible/galaxy/automation-hub/api"
galaxy_require_content_approval: False
pulp_token_auth_disabled: True
galaxy_api_default_distribution_base_path: "published"
allowed_export_paths: ["/tmp"]
allowed_import_paths: ["/tmp"]
ansible_api_hostname: "http://{{ ansible_fqdn }}"
# Galaxy Configuration
# Set this __galaxy variables according to your needs.
# __galaxy_profile: 'insights'or 'standalone'
__galaxy_profile: 'standalone'
# __galaxy_dev_source_path: `:` separated relative paths to the repos you cloned.
__galaxy_dev_source_path: 'pulpcore:pulp_ansible:pulp_container:galaxy_ng:galaxy-importer'
# __galaxy_lock_requirements: Set to 0 to avoid pinning of galaxy_ng/setup.py versions
__galaxy_lock_requirements: '1'
# options: precompiled, source, none
# __galaxy_ui_source: precompiled
警告
在配置 VM 时,您可能会看到 Version Conflict Error
等错误,这些错误都与在每个 repo 上设置正确的版本/分支/标签有关。
7. 启动 Vagrant VM¶
使用 可用盒子 或运行 vagrant status
查看可用盒子的列表。
示例
注意
以下命令必须在 pulp_installer
目录中运行。
vagrant up --provider=libvirt VAGRANT_BOX_NAME # recommended
vagrant up --provider=libvirt pulp3-source-centos8 # if you need RHEL specific features
上面的命令将使用
--provider
来配置 VM,如果您使用libvirt
或virtualbox
,请确保相应的服务正在运行且可访问。然后,它将使用local.dev-config.yml
来配置 VM。
您可以使用 Virtualbox 应用程序或 virt-manager 检查 VM 的状态,或运行 vagrant status VAGRANT_BOX_NAME
注意
libvirt
插件并非在所有平台上都可用,如果出现问题,请跳过 --provider=libvirt
。
警告
此命令可能需要几分钟才能运行,它可能会询问您的 root 密码,如果出现 Version Conflict Error
,请参考 https://github.com/ansible/galaxy_ng/wiki/Installing-from-source---development-environment/_edit#2-clone-the-repositories-from-source 步骤。
警告
Vagrant 在 up
之前会静默忽略 --provider=...
。正确的语法是 vagrant up --provider=...
,而不是 .vagrant --provider=... up
8. 访问 Galaxy NG 和 PULP¶
Pulp-Installer 将在 DNS <box-name>.localhost.example.com
上公开服务,例如,如果您在 Fedora 系统上安装了,它将是 http://VAGRANT_BOX_NAME.localhost.example.com/ui/
如果您安装了 vagrant-hostmanager
,那么您可以运行 vagrant hostmanager
来更新您的 hosts 文件。
否则,您需要手动将其添加到 /etc/hosts
文件中。运行 vagrant ssh VAGRANT_BOX_NAME
连接到 VM,然后运行 ifconfig
查看其 IP 地址,然后。
# /etc/hosts
...
192.168.121.51 VAGRANT_BOX_NAME.localhost.example.com
要进入 SSH,只需运行 vagrant ssh VAGRANT_BOX_NAME
http 服务器将在 http://VAGRANT_BOX_NAME.localhost.example.com
(端口 80)或 http://localhost:8080
上监听。
9. 可选 - 通过执行以下操作切换到 galaxy-importer
的源代码版本:¶
```
## SSH into the vagrant box:
$ vagrant ssh VAGRANT_BOX_NAME
## Within the vagrant box, install the local copy of `galaxy-importer` and restart Pulp:
$ source /usr/local/lib/pulp/bin/activate
$ cd /home/vagrant/devel/galaxy-importer
$ pip install --upgrade -e .
$ prestart
```
10. 可选 - 在导入集合期间启用运行 ansible-test
:¶
```
# SSH into the vagrant guest:
$ vagrant ssh pulp-source-fedora32
# Install podman-docker
$ sudo yum install podman-docker
# Configure galaxy-importer
$ sudo mkdir /etc/galaxy-importer
```
Copy the following to `/etc/galaxy-importer/galaxy-importer.cfg`
```
[galaxy-importer]
LOG_LEVEL_MAIN = INFO
RUN_FLAKE8 = True
RUN_ANSIBLE_TEST = True
INFRA_LOCAL_IMAGE = True
INFRA_LOCAL_DOCKER = False
INFRA_OSD = False
```
11. SSH 到盒子¶
现在一切都在运行,您可以使用 vagrant ssh VAGRANT_BOX_NAME
SSH 到盒子并开始开发工作。进入后,您可以运行
pjournal
:显示服务器日志prestart
:重新启动 Pulp
请记住,每次对代码进行更改后,都必须重新启动服务器。
技巧和窍门¶
安装提供了一些有用的 开发别名,在 vagrant ssh
会话中,您可以
激活 Pulp 虚拟环境
workon pulp
phelp
:列出所有可用的别名。pstart
:启动所有与 Pulp 相关的服务pstop
:停止所有与 Pulp 相关的服务prestart
:重新启动所有与 Pulp 相关的服务pstatus
:报告所有与 Pulp 相关的服务的状态pdbreset
:重置 Pulp 数据库 - 这将销毁您的 PULP 数据pclean
:将 Pulp 还原到干净的安装状态 - 这将销毁您的 PULP 数据pjournal
:与 Pulp 相关单元的日志交互reset_pulp2
:重置 Pulp 2 - 删除数据库,从文件系统中删除内容和发布内容,重新启动服务。populate_pulp2_iso
:同步 4 个 ISO 存储库。populate_pulp2_rpm
:同步 1 个 RPM 存储库。populate_pulp2_docker
:同步 1 个 Docker 存储库。populate_pulp2
:重置 Pulp 2 并同步 ISO、RPM、Docker 存储库。pyclean
:清理额外的 Python 文件pfixtures
:在前景中运行 Pulp-fixtures 容器pbindings
:创建并安装绑定。示例用法:pbindings pulpcore python
pminio
:切换到 Minio 以进行 S3 测试。要停止它:pminio stop
运行测试¶
功能测试和单元测试可以在 Vagrant 中运行。集成测试只能在 Docker 环境 中运行。
集成测试¶
- SSH 到 Vagrant 盒子
vagrant ssh YOUR_BOX_NAME
- 激活 Python 虚拟环境
workon pulp
- cd 到要测试的插件
cd ~/devel/pulp_ansible/
- 安装测试要求
pip install -r functest_requirements.txt
- 构建 Pulp 绑定
pbindings pulp_ansible python
- 运行测试
pytest -v -r sx --color=yes --pyargs pulp_ansible.tests.functional
注意
每次 API 更改时,都需要使用 prestart
重新启动服务器,并使用 pbindings PLUGIN_NAME python
重新构建绑定
警告
一些 pulp_ansible 测试需要额外的设置,如果安装了 galaxy_ng,其他测试将始终失败。
提示
您可以通过向 pytest 命令传递 -k my_test_name
来运行单个测试。
单元测试¶
- SSH 到 Vagrant 盒子
vagrant ssh YOUR_BOX_NAME
- 激活 Python 虚拟环境
workon pulp
- cd 到要测试的插件
cd ~/devel/pulp_ansible/
- 安装测试要求
pip install -r unittest_requirements.txt
- 运行测试
pytest -v -r sx --color=yes --pyargs pulp_ansible.tests.unit
故障排除¶
Centos 8¶
使用 Centos 8 时,当前存在一个错误 在 vagrant-sshfs
中,导致 fuse-sshfs
软件包未在访客中安装。在修复之前,最好使用 Fedora 31+ 来测试 Enterprise Linux 发行版。
要将 Centos 8 与 Virtualbox 一起使用(假设 vagrant-sshfs
问题已修复),请检查 vagrant/boxes.d/30-source.yaml
以查看所引用的盒子是否指向 URL。如果是,请查看 https://cloud.centos.org/centos/8-stream/x86_64/images/
,并将 URL 更新为引用与 Virtualbox 兼容的镜像。提供的 URL 指向的是与 Libvirt 兼容的盒子。
Centos 7¶
如果使用 Centos 7 以及 ansible-hub-ui
项目的克隆,则 UI 在升级 Node 版本之前无法构建。这可以通过在 Vagrantfile
的配置部分添加内联脚本来实现。否则,构建可能会失败 :-(
Call to virConnectOpen failed: Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory
- 需要安装并运行 libvirtd
或 libvirt-daemon-system
Call to virConnectOpen failed: authentication unavailable: no polkit agent available to authenticate action 'org.libvirt.unix.manage'
- 当前用户需要是 libvirt
系统组的成员
在 MacOS 上运行 vagrant¶
在某些情况下,默认的 pulp3-source-fedoraXX
盒子在 MacOS 上无法正常工作。还可以通过添加 pulp_installer/vagrant/boxes.d/99-local.yaml
文件来创建自定义 pulp 盒子。generic/fedoraXX
盒子似乎在 MacOS 上运行良好,可以像这样创建
# 99-local.yaml
mycustombox:
box_name: 'generic/fedora34'
image_name: !ruby/regexp '/Fedora 34.*/'
pty: true
ansible:
variables:
ansible_python_interpreter: /usr/bin/python3
hub:
box: 'mycustombox'
sshfs:
host_path: '..'
guest_path: '/home/vagrant/devel'
reverse: False
memory: 6144
cpus: 4
ansible:
playbook: "vagrant/playbooks/source-install.yml"
galaxy_role_file: "requirements.yml"
# The default network configuration may not work for vagrant host manager. If that's the case, assigning an IP address
# to the box may fix the issue.
networks:
- type: 'private_network'
options:
ip: 192.168.150.5
在 master 分支上工作¶
我需要在 pulp_ansible 或 pulp_container master 上工作,我该怎么做?
如果您需要在 pulp_ansible、pulpcore 或 pulp_container master 分支上工作,请执行以下操作
- 首先使用兼容的版本/标签/分支进行正常供应(如上所述)
- ssh 登录 VM
vagrant ssh VAGRANT_BOX_NAME
- 停止 pulp 服务
pstop
- 转到存储库并检出到所需的 branches 或 tags,您可以在 VM 中的
/home/vagrant/devel
或您的本地主机目录中执行此操作,因为它们已在 VM 中挂载。 - 在 VM ssh 会话中运行
workon pulp
,然后运行django-admin migrate
并解决任何冲突 - 重新启动 pulp 服务
pstart
一些方便的 Bash 别名¶
如果您像我一样,不愿意记住启动和停止 vagrant 盒子的命令,这里有一些方便的别名,您可以将它们添加到您的 bash 配置文件中。
# Set the path to the directory that contains pulp_installer, galaxy_ng, pulpcore etc.
HUB_BASE_PATH="/path/to/your/pulp/source"
# Set the pulp box you wish to use
PULP_BOX="VAGRANT_BOX_NAME"
# Start the vagrant box if it is already provisioned
alias pulp_up="cd ${HUB_BASE_PATH}/pulp_installer && SSH_AUTH_SOCK= vagrant up ${PULP_BOX}"
# Re provision the vangant box
alias pulp_provision="cd ${HUB_BASE_PATH}/pulp_installer && SSH_AUTH_SOCK= vagrant up --provision ${PULP_BOX}"
# Destroy the current vagrant box
alias pulp_destroy="cd ${HUB_BASE_PATH}/pulp_installer && SSH_AUTH_SOCK= vagrant destroy -f ${PULP_BOX}"
# SSH into the vagrant box
alias pulp_ssh="cd ${HUB_BASE_PATH}/pulp_installer && SSH_AUTH_SOCK= vagrant ssh ${PULP_BOX}"
# Stop the vagrant box from running
alias pulp_stop="cd ${HUB_BASE_PATH}/pulp_installer && SSH_AUTH_SOCK= vagrant halt ${PULP_BOX}"