Automate Foreman Content Views with Ansible: Complete Playbook Guide for Red Hat Satellite
Complete Ansible playbook guide for automating Foreman and Red Hat Satellite Content Views management. Learn how to publish, promote, and clean up content view versions automatically with lifecycle environments and version control.
Overview
This playbook automates the management of Foreman or Redhat Satellite Content Views (CVs) and Composite Content Views (CCVs):
- Publishes new versions of CVs and CCVs
- Promotes CCVs to a specified lifecycle environment
- Cleans up old versions, keeping only a set number of the latest
You may find the complete playbook here
Prerequisites
- Ansible installed
- theforeman.foreman collection installed:
1
ansible-galaxy collection install theforeman.foreman
- Foreman server accessible from the control node
- API credentials with permissions to manage Content Views
Variables
You can override these variables via --extra-vars or in your inventory.
1
2
3
4
5
6
7
8
9
vars:
foreman_server_url: "{{ server_url | default('https://formanurl') }}"
foreman_username: "{{ frm_username | default('someuser') }}"
foreman_password: "{{ frm_password | default('somepass') }}"
target_environment: "{{ lifecycle_environment | default('Enviroment') }}"
organization: "{{ org | default('Default') }}"
keep_versions: "{{ max_versions | default('2') }}"
| Variable | Default Value | Description |
|---|---|---|
server_url | https://formanurl | Foreman server URL |
frm_username | someuser | Foreman API username |
frm_password | somepass | Foreman API password |
lifecycle_environment | Enviroment | Target lifecycle environment for promotion |
org | Default | Foreman organization name |
max_versions | 2 | Number of versions to keep per Content View |
Playbook Structure
1. Gather Content Views
Retrieves all Content Views in the specified organization.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
- name: Get all content views
theforeman.foreman.content_view_info:
server_url: "{{ foreman_server_url }}"
username: "{{ foreman_username }}"
password: "{{ foreman_password }}"
organization: "{{ organization }}"
validate_certs: false
register: content_views
tags:
- publish
- cleanup
- promote-only
2. Debug Target Environment
Prints the target environment for confirmation.
1
2
3
4
5
6
7
8
9
- name: Debug target target_environment
ansible.builtin.debug:
msg: "{{ target_environment }}"
tags:
- publish
- cleanup
- promote-only
3. Publish New Versions of CVs
Publishes a new version for each non-composite Content View (CV), skipping the “Default Organization View”.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- name: Publish a new version of each content view
theforeman.foreman.content_view_version:
server_url: "{{ foreman_server_url }}"
username: "{{ foreman_username }}"
password: "{{ foreman_password }}"
organization: "{{ organization }}"
validate_certs: false
content_view: "{{ item.name }}"
loop: "{{ content_views.content_views }}"
when: not item.composite and 'Default Organization View' not in item.name
ignore_errors: true
tags:
- publish
- cv
loop_control:
pause: 300
4. Wait for Background Tasks
Waits 5 minutes to allow background publishing to complete.
1
2
3
4
5
6
7
- name: Sleep for 300 seconds until all background stuff is done
ansible.builtin.wait_for:
timeout: 300
delegate_to: localhost
tags:
- publish
- promote
5. Publish New Versions of CCVs
Publishes a new version for each Composite Content View (CCV), skipping the “Default Organization View”.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- name: "Publish CCVs"
theforeman.foreman.content_view_version:
server_url: "{{ foreman_server_url }}"
username: "{{ foreman_username }}"
password: "{{ foreman_password }}"
organization: "{{ organization }}"
validate_certs: false
content_view: "{{ item.name }}"
loop: "{{ content_views.content_views }}"
loop_control:
pause: 300
when: item.composite and 'Default Organization View' not in item.name
ignore_errors: true
tags:
- publish
- ccv
6. Promote CCVs to Target Environment
Ensures the latest version of each CCV is promoted to the target environment, if not already present.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- name: "Ensure CCVs are on enviroment {{ target_environment }}"
theforeman.foreman.content_view_version:
server_url: "{{ foreman_server_url }}"
username: "{{ foreman_username }}"
password: "{{ foreman_password }}"
organization: "{{ organization }}"
validate_certs: false
content_view: "{{ item.name }}"
version: "{{ item.latest_version }}"
lifecycle_environments: "{{ target_environment }}"
loop: "{{ content_views.content_views }}"
loop_control:
pause: 300
when: item.composite and 'Default Organization View' not in item.name and not
(item.latest_version_environments | selectattr('name', 'equalto', target_environment) | list | length > 0)
ignore_errors: true
tags:
- publish
- promote-only
7. Clean Up Old Versions
Removes old versions of each CV and CCV, keeping only the latest keep_versions.
For CCVs:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- name: "Clean up versions of each CCV. Versions to keep: {{ keep_versions }}"
theforeman.foreman.content_view_version:
server_url: "{{ foreman_server_url }}"
username: "{{ foreman_username }}"
password: "{{ foreman_password }}"
organization: "{{ organization }}"
validate_certs: false
content_view: "{{ item.name }}"
version: "{{ (item.latest_version | float - keep_versions | float) | string }}"
state: absent
when: (item.latest_version | float - keep_versions | float > keep_versions | float) and
'Default Organization View' not in item.name and
item.composite
loop: "{{ content_views.content_views }}"
loop_control:
pause: 600
ignore_errors: true
tags:
- cleanup
- ccv
For CVs:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- name: "Clean up versions of each CV. Versions to keep: {{ keep_versions }}"
theforeman.foreman.content_view_version:
server_url: "{{ foreman_server_url }}"
username: "{{ foreman_username }}"
password: "{{ foreman_password }}"
organization: "{{ organization }}"
validate_certs: false
content_view: "{{ item.name }}"
version: "{{ (item.latest_version | float - keep_versions | float) | string }}"
state: absent
when: (item.latest_version | float - keep_versions | float > keep_versions | float) and
'Default Organization View' not in item.name and
not item.composite
loop: "{{ content_views.content_views }}"
loop_control:
pause: 600
ignore_errors: true
tags:
- cleanup
- cv
Tags and Selective Execution
You can run specific parts of the playbook using tags:
publish: Publish new versions of CVs and CCVspromote-only: Only promote CCVs to the environmentcleanup: Remove old versions of CVs and CCVscv: Tasks specific to Content Viewsccv: Tasks specific to Composite Content Views
Example:
1
ansible-playbook playbook.yml --tags "publish"
Usage Examples
Run the full playbook:
1
ansible-playbook playbook.yml
Run only cleanup tasks:
1
ansible-playbook playbook.yml --tags "cleanup"
Override variables:
1
2
3
4
5
6
7
ansible-playbook playbook.yml \
-e "server_url=https://foreman.example.com" \
-e "frm_username=admin" \
-e "frm_password=secret" \
-e "lifecycle_environment=Production" \
-e "org=MyOrg" \
-e "max_versions=3"
Tips and Troubleshooting
Long Waits: The playbook uses
wait_forto allow background tasks to finish. Adjust thetimeoutif your environment is faster or slower.
Error Handling: Tasks use
ignore_errors: trueto continue even if some content views fail. Review the output for any issues.
API Credentials: Ensure your Foreman user has permissions to manage content views and versions.
Default Organization View: The playbook skips the “Default Organization View” as it is typically managed by Foreman internally.
