Skip to content

Commit 275da83

Browse files
wtripp180901sjpb
andauthored
Refactor Pulp repo definitions and add more Pulp documentation (#760)
* WIP: refactor repos definitions * add more repos and cope with CRB/PowerTools oddness * add epel * use pulp_server as a group * add epel default * wip: get pulp sync working * fixed sync * autodetect latest in adhoc script, refactored timestamps to allow gated ohpc repos, fixed pulp site * fixed distributions + ohpc repos * updated timestamps script + bumped rocky 9 timestamps * removed pulp_repo_name fields * updated docs, added gpg checks, simplified filters * Added pulp systemd file + removed unused vars * added READMEs + updated variable names * disabled gpg checks for dnf_repos * typo * fixed disable repos task * bump images * remove dnf_repos extra index/key and make epel/openhpc special-cases simpler * clarify pulp distro selection * fixup sync vars * fixup grafana vars * revert latest timestamp changes for extra key level * review suggestions Co-authored-by: Steve Brasier <[email protected]> * updated README * docs tweaks * regularised group names * updated operations guide for functionality requiring additional installs * review changes from docs Co-authored-by: Steve Brasier <[email protected]> * renamed timestamps.yml to dnf_repos_timestamps.yml --------- Co-authored-by: Steve Brasier <[email protected]> Co-authored-by: Steve Brasier <[email protected]>
1 parent cbf990a commit 275da83

File tree

27 files changed

+445
-268
lines changed

27 files changed

+445
-268
lines changed

ansible/adhoc/deploy-pulp.yml

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,6 @@
1-
# Usage: ansible-playbook ansible/adhoc/deploy-pulp.yml -e "pulp_server=<pulp server hostname>"
2-
3-
- name: Add temporary pulp server host
4-
hosts: localhost
5-
tasks:
6-
- ansible.builtin.add_host:
7-
name: "{{ pulp_server }}"
8-
group: "_pulp_host"
9-
10-
- name: Install pulp on server and add to config
1+
- name: Install pulp on server
112
become: yes
12-
hosts: _pulp_host
3+
hosts: pulp_server
134
tasks:
145
- name: Install pulp
156
ansible.builtin.include_role:
@@ -22,5 +13,5 @@
2213
debug:
2314
msg: |
2415
Server configured, override 'appliances_pulp_url' with
25-
appliances_pulp_url: "http://{{ pulp_server }}:{{ pulp_site_port }}"
26-
in your environments
16+
appliances_pulp_url: "http://{{ hostvars[groups['pulp_server'] | first].ansible_host }}:{{ pulp_site_port }}"
17+
(or the correct IP if multi-homed) in your environments

ansible/adhoc/sync-pulp.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
vars:
77
pulp_site_target_arch: "x86_64"
88
pulp_site_target_distribution: "rocky"
9-
pulp_site_target_distribution_version: "9.5"
10-
pulp_site_target_distribution_version_major: "9"
9+
# default distribution to *latest* specified for baseos repo:
10+
pulp_site_target_distribution_version: "{{ dnf_repos_repos['baseos'].keys() | map('float') | sort | last }}"

ansible/ci/update_timestamps.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
tasks:
33
- name: Get latest timestamps from sources
44
latest_timestamps:
5-
repos_dict: "{{ appliances_pulp_repos }}"
5+
repos_dict: "{{ dnf_repos_default }}"
66
content_url: "https://ark.stackhpc.com/pulp/content"
77
register: _result
88

99
- name: Overwrite repo timestamps with latest
1010
ansible.builtin.copy:
11-
dest: "{{ appliances_repository_root }}/environments/common/inventory/group_vars/all/timestamps.yml"
11+
dest: "{{ appliances_repository_root }}/environments/common/inventory/group_vars/all/dnf_repo_timestamps.yml"
1212
content: "{{ repo_template | to_nice_yaml(indent=2) }}"
1313
backup: true
1414
vars:
1515
repo_template:
16-
appliances_pulp_repos: "{{ _result.timestamps }}"
16+
dnf_repos_default: "{{ _result.timestamps }}"

ansible/fatimage.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
when: hook_path | exists
1919

2020
- name: Sync pulp repos with upstream
21-
hosts: pulp
21+
hosts: pulp_site
2222
tasks:
2323
- ansible.builtin.include_role:
2424
name: pulp_site

ansible/filter_plugins/utils.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,6 @@ def to_ood_regex(items):
6161
r = ['(%s)' % v for v in r]
6262
return '|'.join(r)
6363

64-
def appliances_repo_to_subpath(repo_entry):
65-
""" Take an element from appliances_pulp_repos and convert it to a pulp path. This assumes that the remote and local pulp structures are the same
66-
"""
67-
return repo_entry['path'] + '/' + repo_entry['timestamp']
68-
6964
class FilterModule(object):
7065
''' Ansible core jinja2 filters '''
7166

@@ -81,5 +76,4 @@ def filters(self):
8176
'exists': exists,
8277
'warn': self.warn,
8378
'to_ood_regex': to_ood_regex,
84-
'appliances_repo_to_subpath': appliances_repo_to_subpath
8579
}

ansible/library/latest_timestamps.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,12 @@ def run_module():
5656
for version in timestamps[repo]:
5757

5858
html_txt = requests.get(
59-
url= module.params['content_url'] + '/' + timestamps[repo][version]['path']
59+
url= module.params['content_url'] + '/' + timestamps[repo][version]['pulp_path']
6060
).text
6161
timestamp_link_list = BeautifulSoup(html_txt,features="html.parser").body.find('pre').find_all() # getting raw list of timestamps from html
6262
timestamp_link_list = map(lambda x: x.string,timestamp_link_list) # stripping xml tags
6363
latest_timestamp = list(timestamp_link_list)[-1][:-1] # last timestamp in list with trailing / removed
64-
timestamps[repo][version]['timestamp'] = latest_timestamp
65-
64+
timestamps[repo][version]['pulp_timestamp'] = latest_timestamp
6665
result['timestamps'] = dict(sorted(timestamps.items()))
6766

6867
module.exit_json(**result)

ansible/roles/dnf_repos/README.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
dnf_repos
2+
=========
3+
4+
Modifies repo definitions for repofiles in `/etc/yum.repos.d` to point to snapshots in StackHPC's Ark Pulp server or mirrors of them
5+
on a local Pulp server.
6+
7+
Requirements
8+
------------
9+
10+
Requires Ark credentials if using StackHPC's upstream Ark server.
11+
12+
Role Variables
13+
--------------
14+
15+
Variables in this role are also required by `pulp_site` so set in
16+
`environments/common/inventory/groups_vars/all/dnf_repos.yml`. See that file for detailed default values.
17+
18+
- `dnf_repos_repos`: Dict of dicts containing information to construct URLs for Ark snapshots from the target Pulp server for each Rocky version. For example:
19+
```
20+
dnf_repos_repos:
21+
appstream: # ansible.builtin.yum_repository:name
22+
'8.10': # ansible_distribution_version or ansible_distribution_major_version
23+
repo_file: Rocky-AppStream # yum_repository: file
24+
# repo_name: # optional, override yum_repository:name
25+
pulp_path: rocky/8.10/AppStream/x86_64/os # The subpath of the the upstream Ark server's content endpoint URL for the repo's snapshots, see https://ark.stackhpc.com/pulp/content/
26+
pulp_timestamp: 20250614T013846
27+
# pulp_content_url: # optional, dnf_repos_pulp_content_url
28+
'9.6':
29+
...
30+
```
31+
- `dnf_repos_default`: Appliance default repos to use Ark snapshots for. Following same format as `dnf_repos_repos`.
32+
See for appliance default repo list `environments/common/inventory/group_vars/all/dnf_repo_timestamps.yml`.
33+
- `dnf_repos_extra`: Additional repos to use Ark snapshots for. Follows same format as
34+
`dnf_repos_repos`. Defaults to `{}`
35+
- `dnf_repos_pulp_content_url`: Optional str. Content URL of Pulp server to use Ark snapshots from.
36+
Defaults to `{{ appliances_pulp_url }}/pulp/content`
37+
- `dnf_repos_username`: Optional str. Username for Ark. Should be set if using upstream StackHPC Ark
38+
Pulp server, but omitted if using local Pulp server (see `ansible/roles/pulp_site`)
39+
- `dnf_repos_password`: Optional str. Password for Ark. Should be set if using upstream StackHPC Ark
40+
Pulp server, but omitted if using local Pulp server (see `ansible/roles/pulp_site`)
Lines changed: 1 addition & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,4 @@
1+
dnf_repos_repos: {} # see environments/common/inventory/group_vars/all/{dnf_repos,timestamps}.yml
12
dnf_repos_pulp_content_url: "{{ appliances_pulp_url }}/pulp/content"
23
dnf_repos_username: "{{ omit }}"
34
dnf_repos_password: "{{ omit }}"
4-
5-
dnf_repos_filenames:
6-
'8':
7-
baseos: 'Rocky-BaseOS'
8-
appstream: 'Rocky-AppStream'
9-
crb: 'Rocky-PowerTools'
10-
extras: 'Rocky-Extras'
11-
grafana: 'grafana'
12-
'9':
13-
baseos: 'rocky'
14-
appstream: 'rocky'
15-
crb: 'rocky'
16-
extras: 'rocky-extras'
17-
grafana: 'grafana'
18-
19-
dnf_repos_version_filenames: "{{ dnf_repos_filenames[ansible_distribution_major_version] }}"
20-
21-
# epel installed separately
22-
dnf_repos_default_repolist:
23-
- file: "{{ dnf_repos_version_filenames.baseos }}"
24-
name: baseos
25-
base_url: "{{ dnf_repos_pulp_content_url }}/{{ appliances_pulp_repos.baseos[ansible_distribution_version] | appliances_repo_to_subpath }}"
26-
- file: "{{ dnf_repos_version_filenames.appstream }}"
27-
name: appstream
28-
base_url: "{{ dnf_repos_pulp_content_url }}/{{ appliances_pulp_repos.appstream[ansible_distribution_version] | appliances_repo_to_subpath }}"
29-
- file: "{{ dnf_repos_version_filenames.crb }}"
30-
name: "{{ 'powertools' if ansible_distribution_major_version == '8' else 'crb' }}"
31-
base_url: "{{ dnf_repos_pulp_content_url }}/{{ appliances_pulp_repos.crb[ansible_distribution_version] | appliances_repo_to_subpath }}"
32-
- file: "{{ dnf_repos_version_filenames.extras }}"
33-
name: extras
34-
base_url: "{{ dnf_repos_pulp_content_url }}/{{ appliances_pulp_repos.extras[ansible_distribution_version] | appliances_repo_to_subpath }}"
35-
- file: ceph
36-
name: Ceph
37-
base_url: "{{ dnf_repos_pulp_content_url }}/{{ appliances_pulp_repos.ceph[ansible_distribution_major_version] | appliances_repo_to_subpath }}"
38-
- file: "{{ dnf_repos_version_filenames.grafana }}"
39-
name: grafana
40-
base_url: "{{ dnf_repos_pulp_content_url }}/{{ appliances_pulp_repos.grafana[ansible_distribution_major_version] | appliances_repo_to_subpath }}"
41-
42-
dnf_repos_openhpc_repolist:
43-
- name: OpenHPC
44-
file: OpenHPC
45-
base_url: "{{ dnf_repos_pulp_content_url }}/{{ appliances_pulp_repos.openhpc_base[ansible_distribution_major_version] | appliances_repo_to_subpath }}"
46-
- name: OpenHPC-updates
47-
file: OpenHPC
48-
base_url: "{{ dnf_repos_pulp_content_url }}/{{ appliances_pulp_repos.openhpc_updates[ansible_distribution_major_version] | appliances_repo_to_subpath }}"
49-
50-
dnf_repos_extra_repolist: []
51-
dnf_repos_repolist: "{{ dnf_repos_default_repolist + (dnf_repos_openhpc_repolist if (openhpc_install_type | default('ohpc')) == 'ohpc' else []) + dnf_repos_extra_repolist }}"
52-
53-
dnf_repos_epel_baseurl: "{{ dnf_repos_pulp_content_url }}/{{ appliances_pulp_repos.epel[ansible_distribution_major_version] | appliances_repo_to_subpath }}"
54-
dnf_repos_epel_description: "epel"

ansible/roles/dnf_repos/tasks/disable_repos.yml

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
---
22
- name: Remove password and disable Pulp repos
33
ansible.builtin.yum_repository:
4-
file: "{{ item.file }}"
5-
name: "{{ item.name }}"
6-
baseurl: "{{ item.base_url }}"
7-
description: "{{ item.name }}"
4+
file: "{{ repo_values.repo_file }}"
5+
name: "{{ repo_name }}"
6+
baseurl: "{{ repo_content_url }}/{{ repo_values.pulp_path }}/{{ repo_values.pulp_timestamp }}"
7+
description: "{{ repo_name }}"
88
enabled: false
9-
loop: "{{ dnf_repos_repolist }}"
10-
11-
- name: Remove password and disable EPEL repo
12-
ansible.builtin.yum_repository:
13-
name: epel
14-
file: epel
15-
description: "{{ dnf_repos_epel_description }}"
16-
baseurl: "{{ dnf_repos_epel_baseurl }}"
179
gpgcheck: false
18-
enabled: false
10+
loop: "{{ dnf_repos_repos | dict2items }}"
11+
loop_control:
12+
label: "{{ repo_name }}[{{ repo_os }}]: {{ repo_values }}"
13+
vars:
14+
repo_os: "{{ ansible_distribution_version if ansible_distribution_version in item.value else ansible_distribution_major_version }}"
15+
repo_values: "{{ item.value[repo_os] }}"
16+
repo_name: "{{ repo_values.repo_name | default(item.key) }}"
17+
repo_content_url: "{{ repo_values.pulp_content_url | default(dnf_repos_pulp_content_url) }}"
1918

2019
- name: Get all repo files
2120
ansible.builtin.find:
Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,44 @@
11
---
22

3-
- name: Replace system repos with Pulp repos
3+
- name: Replace non-epel repos with Pulp repos
44
ansible.builtin.yum_repository:
5-
file: "{{ item.file }}"
6-
name: "{{ item.name }}"
7-
baseurl: "{{ item.base_url }}"
8-
description: "{{ item.name }}"
5+
file: "{{ repo_values.repo_file }}"
6+
name: "{{ repo_name }}"
7+
baseurl: "{{ repo_content_url }}/{{ repo_values.pulp_path }}/{{ repo_values.pulp_timestamp }}"
8+
description: "{{ repo_name }}"
99
username: "{{ dnf_repos_username }}"
1010
password: "{{ dnf_repos_password }}"
1111
gpgcheck: false
12-
loop: "{{ dnf_repos_repolist }}"
12+
loop: "{{ dnf_repos_repos | dict2items }}"
13+
loop_control:
14+
label: "{{ repo_name }}[{{ repo_os }}]: {{ repo_values }}"
15+
when: repo_name != 'epel'
16+
vars:
17+
repo_os: "{{ ansible_distribution_version if ansible_distribution_version in item.value else ansible_distribution_major_version }}"
18+
repo_values: "{{ item.value[repo_os] }}"
19+
repo_name: "{{ repo_values.repo_name | default(item.key) }}"
20+
repo_content_url: "{{ repo_values.pulp_content_url | default(dnf_repos_pulp_content_url) }}"
1321

1422
- name: Install epel-release
15-
# done so that roles installing epel via epel-release don't over-write our changes to the epel repo
23+
# So roles installing epel via epel-release don't overwrite changes to the epel repo below
1624
ansible.builtin.dnf:
1725
name: epel-release
1826

19-
- name: Use Pulp EPEL repo
27+
- name: Replace epel repo with Pulp repo
2028
ansible.builtin.yum_repository:
21-
name: epel
22-
file: epel
23-
description: "{{ dnf_repos_epel_description }}"
24-
gpgcheck: false
25-
baseurl: "{{ dnf_repos_epel_baseurl }}"
29+
file: "{{ repo_values.repo_file }}"
30+
name: "{{ repo_name }}"
31+
baseurl: "{{ repo_content_url }}/{{ repo_values.pulp_path }}/{{ repo_values.pulp_timestamp }}"
32+
description: "{{ repo_name }}"
2633
username: "{{ dnf_repos_username }}"
2734
password: "{{ dnf_repos_password }}"
35+
gpgcheck: false
36+
loop: "{{ dnf_repos_repos | dict2items }}"
37+
loop_control:
38+
label: "{{ repo_name }}[{{ repo_os }}]: {{ repo_values }}"
39+
when: repo_name == 'epel'
40+
vars:
41+
repo_os: "{{ ansible_distribution_version if ansible_distribution_version in item.value else ansible_distribution_major_version }}"
42+
repo_values: "{{ item.value[repo_os] }}"
43+
repo_name: "{{ repo_values.repo_name | default(item.key) }}"
44+
repo_content_url: "{{ repo_values.pulp_content_url | default(dnf_repos_pulp_content_url) }}"

0 commit comments

Comments
 (0)