Initial commit
This commit is contained in:
@@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
profile: production
|
||||||
|
kinds:
|
||||||
|
- yaml: "**/meta/collection-requirements.yml"
|
||||||
|
- playbook: "**/tests/get_coverage.yml"
|
||||||
|
- yaml: "**/tests/collection-requirements.yml"
|
||||||
|
- playbook: "**/tests/tests_*.yml"
|
||||||
|
- playbook: "**/tests/setup-snapshot.yml"
|
||||||
|
- tasks: "**/tests/*.yml"
|
||||||
|
- playbook: "**/tests/playbooks/*.yml"
|
||||||
|
- tasks: "**/tests/tasks/*.yml"
|
||||||
|
- tasks: "**/tests/tasks/*/*.yml"
|
||||||
|
- vars: "**/tests/vars/*.yml"
|
||||||
|
- playbook: "**/examples/*.yml"
|
||||||
|
skip_list:
|
||||||
|
- fqcn-builtins
|
||||||
|
- var-naming[no-role-prefix]
|
||||||
|
exclude_paths:
|
||||||
|
- tests/roles/
|
||||||
|
- .github/
|
||||||
|
- .markdownlint.yaml
|
||||||
|
- examples/roles/
|
||||||
|
mock_roles:
|
||||||
|
- linux-system-roles.template
|
||||||
|
supported_ansible_also:
|
||||||
|
- "2.14.0"
|
||||||
@@ -0,0 +1,141 @@
|
|||||||
|
module.exports = {
|
||||||
|
parserPreset: 'conventional-changelog-conventionalcommits',
|
||||||
|
rules: {
|
||||||
|
'body-leading-blank': [1, 'always'],
|
||||||
|
'body-max-line-length': [2, 'always', 100],
|
||||||
|
'footer-leading-blank': [1, 'always'],
|
||||||
|
'footer-max-line-length': [2, 'always', 100],
|
||||||
|
'header-max-length': [2, 'always', 100],
|
||||||
|
'subject-case': [
|
||||||
|
2,
|
||||||
|
'never',
|
||||||
|
['start-case', 'pascal-case', 'upper-case'],
|
||||||
|
],
|
||||||
|
'subject-empty': [2, 'never'],
|
||||||
|
'subject-full-stop': [2, 'never', '.'],
|
||||||
|
'type-case': [2, 'always', 'lower-case'],
|
||||||
|
'type-empty': [2, 'never'],
|
||||||
|
'type-enum': [
|
||||||
|
2,
|
||||||
|
'always',
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'chore',
|
||||||
|
'ci',
|
||||||
|
'docs',
|
||||||
|
'feat',
|
||||||
|
'fix',
|
||||||
|
'perf',
|
||||||
|
'refactor',
|
||||||
|
'revert',
|
||||||
|
'style',
|
||||||
|
'test',
|
||||||
|
'tests',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
prompt: {
|
||||||
|
questions: {
|
||||||
|
type: {
|
||||||
|
description: "Select the type of change that you're committing",
|
||||||
|
enum: {
|
||||||
|
feat: {
|
||||||
|
description: 'A new feature',
|
||||||
|
title: 'Features',
|
||||||
|
emoji: '✨',
|
||||||
|
},
|
||||||
|
fix: {
|
||||||
|
description: 'A bug fix',
|
||||||
|
title: 'Bug Fixes',
|
||||||
|
emoji: '🐛',
|
||||||
|
},
|
||||||
|
docs: {
|
||||||
|
description: 'Documentation only changes',
|
||||||
|
title: 'Documentation',
|
||||||
|
emoji: '📚',
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
description:
|
||||||
|
'Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)',
|
||||||
|
title: 'Styles',
|
||||||
|
emoji: '💎',
|
||||||
|
},
|
||||||
|
refactor: {
|
||||||
|
description:
|
||||||
|
'A code change that neither fixes a bug nor adds a feature',
|
||||||
|
title: 'Code Refactoring',
|
||||||
|
emoji: '📦',
|
||||||
|
},
|
||||||
|
perf: {
|
||||||
|
description: 'A code change that improves performance',
|
||||||
|
title: 'Performance Improvements',
|
||||||
|
emoji: '🚀',
|
||||||
|
},
|
||||||
|
test: {
|
||||||
|
description: 'Adding missing tests or correcting existing tests',
|
||||||
|
title: 'Tests',
|
||||||
|
emoji: '🚨',
|
||||||
|
},
|
||||||
|
tests: {
|
||||||
|
description: 'Adding missing tests or correcting existing tests',
|
||||||
|
title: 'Tests',
|
||||||
|
emoji: '🚨',
|
||||||
|
},
|
||||||
|
build: {
|
||||||
|
description:
|
||||||
|
'Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)',
|
||||||
|
title: 'Builds',
|
||||||
|
emoji: '🛠',
|
||||||
|
},
|
||||||
|
ci: {
|
||||||
|
description:
|
||||||
|
'Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)',
|
||||||
|
title: 'Continuous Integrations',
|
||||||
|
emoji: '⚙️',
|
||||||
|
},
|
||||||
|
chore: {
|
||||||
|
description: "Other changes that don't modify src or test files",
|
||||||
|
title: 'Chores',
|
||||||
|
emoji: '♻️',
|
||||||
|
},
|
||||||
|
revert: {
|
||||||
|
description: 'Reverts a previous commit',
|
||||||
|
title: 'Reverts',
|
||||||
|
emoji: '🗑',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
scope: {
|
||||||
|
description:
|
||||||
|
'What is the scope of this change (e.g. component or file name)',
|
||||||
|
},
|
||||||
|
subject: {
|
||||||
|
description:
|
||||||
|
'Write a short, imperative tense description of the change',
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
description: 'Provide a longer description of the change',
|
||||||
|
},
|
||||||
|
isBreaking: {
|
||||||
|
description: 'Are there any breaking changes?',
|
||||||
|
},
|
||||||
|
breakingBody: {
|
||||||
|
description:
|
||||||
|
'A BREAKING CHANGE commit requires a body. Please enter a longer description of the commit itself',
|
||||||
|
},
|
||||||
|
breaking: {
|
||||||
|
description: 'Describe the breaking changes',
|
||||||
|
},
|
||||||
|
isIssueAffected: {
|
||||||
|
description: 'Does this change affect any open issues?',
|
||||||
|
},
|
||||||
|
issuesBody: {
|
||||||
|
description:
|
||||||
|
'If issues are closed, the commit requires a body. Please enter a longer description of the commit itself',
|
||||||
|
},
|
||||||
|
issues: {
|
||||||
|
description: 'Add issue references (e.g. "fix #123", "re #123".)',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
1
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# https://help.github.com/en/articles/about-code-owners
|
||||||
|
# Default reviewers for everything
|
||||||
|
* @spetrosi @nhosoi @richm
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: github-actions
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: monthly
|
||||||
|
commit-message:
|
||||||
|
prefix: ci
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
Enhancement:
|
||||||
|
|
||||||
|
Reason:
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
Issue Tracker Tickets (Jira or BZ if any):
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
---
|
||||||
|
name: Ansible Lint
|
||||||
|
on: # yamllint disable-line rule:truthy
|
||||||
|
pull_request:
|
||||||
|
merge_group:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
types:
|
||||||
|
- checks_requested
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
workflow_dispatch:
|
||||||
|
env:
|
||||||
|
LSR_ROLE2COLL_NAMESPACE: fedora
|
||||||
|
LSR_ROLE2COLL_NAME: linux_system_roles
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
jobs:
|
||||||
|
ansible_lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Update pip, git
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y git
|
||||||
|
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install tox, tox-lsr
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
pip3 install "git+https://github.com/linux-system-roles/tox-lsr@3.4.0"
|
||||||
|
|
||||||
|
- name: Convert role to collection format
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
TOXENV=collection lsr_ci_runtox
|
||||||
|
coll_dir=".tox/ansible_collections/$LSR_ROLE2COLL_NAMESPACE/$LSR_ROLE2COLL_NAME"
|
||||||
|
# ansible-lint action requires a .git directory???
|
||||||
|
# https://github.com/ansible/ansible-lint/blob/main/action.yml#L45
|
||||||
|
mkdir -p "$coll_dir/.git"
|
||||||
|
|
||||||
|
- name: Run ansible-lint
|
||||||
|
uses: ansible/ansible-lint@v24
|
||||||
|
with:
|
||||||
|
working_directory: ${{ github.workspace }}/.tox/ansible_collections/${{ env.LSR_ROLE2COLL_NAMESPACE }}/${{ env.LSR_ROLE2COLL_NAME }}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
name: Check for ansible_managed variable use in comments
|
||||||
|
on: # yamllint disable-line rule:truthy
|
||||||
|
pull_request:
|
||||||
|
merge_group:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
types:
|
||||||
|
- checks_requested
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
workflow_dispatch:
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
jobs:
|
||||||
|
ansible_managed_var_comment:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Update pip, git
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
python3 -m pip install --upgrade pip
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y git
|
||||||
|
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install tox, tox-lsr
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
pip3 install "git+https://github.com/linux-system-roles/tox-lsr@3.4.0"
|
||||||
|
|
||||||
|
- name: Run ansible-plugin-scan
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
TOXENV=ansible-managed-var-comment lsr_ci_runtox
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
name: Ansible Plugin Scan
|
||||||
|
on: # yamllint disable-line rule:truthy
|
||||||
|
pull_request:
|
||||||
|
merge_group:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
types:
|
||||||
|
- checks_requested
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
workflow_dispatch:
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
jobs:
|
||||||
|
ansible_plugin_scan:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Update pip, git
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
python3 -m pip install --upgrade pip
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y git
|
||||||
|
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install tox, tox-lsr
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
pip3 install "git+https://github.com/linux-system-roles/tox-lsr@3.4.0"
|
||||||
|
|
||||||
|
- name: Run ansible-plugin-scan
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
TOXENV=ansible-plugin-scan lsr_ci_runtox
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
---
|
||||||
|
name: Ansible Test
|
||||||
|
on: # yamllint disable-line rule:truthy
|
||||||
|
pull_request:
|
||||||
|
merge_group:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
types:
|
||||||
|
- checks_requested
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
workflow_dispatch:
|
||||||
|
env:
|
||||||
|
LSR_ROLE2COLL_NAMESPACE: fedora
|
||||||
|
LSR_ROLE2COLL_NAME: linux_system_roles
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
jobs:
|
||||||
|
ansible_test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Update pip, git
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
python3 -m pip install --upgrade pip
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y git
|
||||||
|
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install tox, tox-lsr
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
pip3 install "git+https://github.com/linux-system-roles/tox-lsr@3.4.0"
|
||||||
|
|
||||||
|
- name: Convert role to collection format
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
TOXENV=collection lsr_ci_runtox
|
||||||
|
|
||||||
|
- name: Run ansible-test
|
||||||
|
uses: ansible-community/ansible-test-gh-action@release/v1
|
||||||
|
with:
|
||||||
|
testing-type: sanity # wokeignore:rule=sanity
|
||||||
|
ansible-core-version: stable-2.17
|
||||||
|
collection-src-directory: ${{ github.workspace }}/.tox/ansible_collections/${{ env.LSR_ROLE2COLL_NAMESPACE }}/${{ env.LSR_ROLE2COLL_NAME }}
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
---
|
||||||
|
# yamllint disable rule:line-length
|
||||||
|
name: Convert README.md to HTML and push to docs branch
|
||||||
|
on: # yamllint disable-line rule:truthy
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- README.md
|
||||||
|
release:
|
||||||
|
types:
|
||||||
|
- published
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
jobs:
|
||||||
|
build_docs:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
- name: Update pip, git
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y git
|
||||||
|
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Ensure the docs branch
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
branch=docs
|
||||||
|
existed_in_remote=$(git ls-remote --heads origin $branch)
|
||||||
|
|
||||||
|
if [ -z "${existed_in_remote}" ]; then
|
||||||
|
echo "Creating $branch branch"
|
||||||
|
git config --global user.name "${{ github.actor }}"
|
||||||
|
git config --global user.email "${{ github.actor }}@users.noreply.github.com"
|
||||||
|
git checkout --orphan $branch
|
||||||
|
git reset --hard
|
||||||
|
git commit --allow-empty -m "Initializing $branch branch"
|
||||||
|
git push origin $branch
|
||||||
|
echo "Created $branch branch"
|
||||||
|
else
|
||||||
|
echo "Branch $branch already exists"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Checkout the docs branch
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: docs
|
||||||
|
|
||||||
|
- name: Fetch README.md and .pandoc_template.html5 template from the workflow branch
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
sparse-checkout: |
|
||||||
|
README.md
|
||||||
|
.pandoc_template.html5
|
||||||
|
sparse-checkout-cone-mode: false
|
||||||
|
path: ref_branch
|
||||||
|
- name: Set RELEASE_VERSION based on whether run on release or on push
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
if [ ${{ github.event_name }} = release ]; then
|
||||||
|
echo "RELEASE_VERSION=${{ github.event.release.tag_name }}" >> $GITHUB_ENV
|
||||||
|
elif [ ${{ github.event_name }} = push ]; then
|
||||||
|
echo "RELEASE_VERSION=latest" >> $GITHUB_ENV
|
||||||
|
else
|
||||||
|
echo Unsupported event
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Ensure that version and docs directories exist
|
||||||
|
run: mkdir -p ${{ env.RELEASE_VERSION }} docs
|
||||||
|
|
||||||
|
- name: Remove badges from README.md prior to converting to HTML
|
||||||
|
run: sed -i '1,8 {/^\[\!.*actions\/workflows/d}' ref_branch/README.md
|
||||||
|
|
||||||
|
- name: Convert README.md to HTML and save to the version directory
|
||||||
|
uses: docker://pandoc/core:latest
|
||||||
|
with:
|
||||||
|
args: >-
|
||||||
|
--from gfm --to html5 --toc --shift-heading-level-by=-1
|
||||||
|
--template ref_branch/.pandoc_template.html5
|
||||||
|
--output ${{ env.RELEASE_VERSION }}/README.html ref_branch/README.md
|
||||||
|
|
||||||
|
- name: Copy latest README.html to docs/index.html for GitHub pages
|
||||||
|
if: env.RELEASE_VERSION == 'latest'
|
||||||
|
run: cp ${{ env.RELEASE_VERSION }}/README.html docs/index.html
|
||||||
|
|
||||||
|
- name: Commit changes
|
||||||
|
run: |
|
||||||
|
git config --global user.name "${{ github.actor }}"
|
||||||
|
git config --global user.email "${{ github.actor }}@users.noreply.github.com"
|
||||||
|
git add ${{ env.RELEASE_VERSION }}/README.html docs/index.html
|
||||||
|
git commit -m "Update README.html for ${{ env.RELEASE_VERSION }}"
|
||||||
|
|
||||||
|
- name: Push changes
|
||||||
|
uses: ad-m/github-push-action@master
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
branch: docs
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
---
|
||||||
|
# yamllint disable rule:line-length
|
||||||
|
name: Tag, release, and publish role based on CHANGELOG.md push
|
||||||
|
on: # yamllint disable-line rule:truthy
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- CHANGELOG.md
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
jobs:
|
||||||
|
tag_release_publish:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
- name: Update pip, git
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y git
|
||||||
|
|
||||||
|
- name: checkout PR
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get tag and message from the latest CHANGELOG.md commit
|
||||||
|
id: tag
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
print=false
|
||||||
|
while read -r line; do
|
||||||
|
if [[ "$line" =~ ^\[([0-9]+\.[0-9]+\.[0-9]+)\]\ -\ [0-9-]+ ]]; then
|
||||||
|
if [ "$print" = false ]; then
|
||||||
|
_tagname="${BASH_REMATCH[1]}"
|
||||||
|
echo "$line"
|
||||||
|
print=true
|
||||||
|
else
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
elif [ "$print" = true ]; then
|
||||||
|
echo "$line"
|
||||||
|
fi
|
||||||
|
done < CHANGELOG.md > ./.tagmsg.txt
|
||||||
|
git fetch --all --tags
|
||||||
|
for t in $( git tag -l ); do
|
||||||
|
if [ "$t" = "$_tagname" ]; then
|
||||||
|
echo INFO: tag "$t" already exists
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
# Get name of the branch that the change was pushed to
|
||||||
|
_branch="${GITHUB_REF_NAME:-}"
|
||||||
|
if [ "$_branch" = master ] || [ "$_branch" = main ]; then
|
||||||
|
echo Using branch name ["$_branch"] as push branch
|
||||||
|
else
|
||||||
|
echo WARNING: GITHUB_REF_NAME ["$_branch"] is not main or master
|
||||||
|
_branch=$( git branch -r | grep -o 'origin/HEAD -> origin/.*$' | \
|
||||||
|
awk -F'/' '{print $3}' || : )
|
||||||
|
fi
|
||||||
|
if [ -z "$_branch" ]; then
|
||||||
|
_branch=$( git branch --points-at HEAD --no-color --format='%(refname:short)' )
|
||||||
|
fi
|
||||||
|
if [ -z "$_branch" ]; then
|
||||||
|
echo ERROR: unable to determine push branch
|
||||||
|
git branch -a
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "tagname=$_tagname" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "branch=$_branch" >> "$GITHUB_OUTPUT"
|
||||||
|
- name: Create tag
|
||||||
|
uses: mathieudutour/github-tag-action@v6.2
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
custom_tag: ${{ steps.tag.outputs.tagname }}
|
||||||
|
tag_prefix: ''
|
||||||
|
|
||||||
|
- name: Create Release
|
||||||
|
id: create_release
|
||||||
|
uses: ncipollo/release-action@v1
|
||||||
|
with:
|
||||||
|
tag: ${{ steps.tag.outputs.tagname }}
|
||||||
|
name: Version ${{ steps.tag.outputs.tagname }}
|
||||||
|
bodyFile: ./.tagmsg.txt
|
||||||
|
makeLatest: true
|
||||||
|
|
||||||
|
- name: Publish role to Galaxy
|
||||||
|
uses: robertdebock/galaxy-action@1.2.1
|
||||||
|
with:
|
||||||
|
galaxy_api_key: ${{ secrets.galaxy_api_key }}
|
||||||
|
git_branch: ${{ steps.tag.outputs.branch }}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
# yamllint disable rule:line-length
|
||||||
|
name: Markdown Lint
|
||||||
|
on: # yamllint disable-line rule:truthy
|
||||||
|
pull_request:
|
||||||
|
merge_group:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
types:
|
||||||
|
- checks_requested
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
workflow_dispatch:
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
jobs:
|
||||||
|
markdownlint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Update pip, git
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y git
|
||||||
|
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# CHANGELOG.md is generated automatically from PR titles and descriptions
|
||||||
|
# It might have issues but they are not critical
|
||||||
|
- name: Lint all markdown files except for CHANGELOG.md
|
||||||
|
uses: docker://avtodev/markdown-lint:master
|
||||||
|
with:
|
||||||
|
args: >-
|
||||||
|
--ignore=CHANGELOG.md
|
||||||
|
**/*.md
|
||||||
|
config: .markdownlint.yaml
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
name: PR Title Lint
|
||||||
|
on: # yamllint disable-line rule:truthy
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- synchronize
|
||||||
|
- reopened
|
||||||
|
- edited
|
||||||
|
merge_group:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
types:
|
||||||
|
- checks_requested
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
jobs:
|
||||||
|
commit-checks:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install conventional-commit linter
|
||||||
|
run: npm install @commitlint/config-conventional @commitlint/cli
|
||||||
|
|
||||||
|
- name: Run commitlint on PR title
|
||||||
|
env:
|
||||||
|
PR_TITLE: ${{ github.event.pull_request.title }}
|
||||||
|
# Echo from env variable to avoid bash errors with extra characters
|
||||||
|
run: echo "$PR_TITLE" | npx commitlint --verbose
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
name: ShellCheck
|
||||||
|
on: # yamllint disable-line rule:truthy
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
workflow_dispatch:
|
||||||
|
env:
|
||||||
|
# some scripts source tox-lsr scripts - suppress that check
|
||||||
|
SHELLCHECK_OPTS: -e SC1091
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
jobs:
|
||||||
|
shellcheck:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Update git
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y git
|
||||||
|
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Run ShellCheck
|
||||||
|
id: shellcheck_id
|
||||||
|
uses: ludeeus/action-shellcheck@master
|
||||||
|
|
||||||
|
- name: Show file paths scanned
|
||||||
|
run: |
|
||||||
|
echo Files scanned:
|
||||||
|
echo "${{ steps.shellcheck_id.outputs.files }}"
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
# yamllint disable rule:line-length
|
||||||
|
name: Test converting README.md to README.html
|
||||||
|
on: # yamllint disable-line rule:truthy
|
||||||
|
pull_request:
|
||||||
|
merge_group:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
types:
|
||||||
|
- checks_requested
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
jobs:
|
||||||
|
test_converting_readme:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
- name: Update pip, git
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y git
|
||||||
|
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Remove badges from README.md prior to converting to HTML
|
||||||
|
run: sed -i '1,8 {/^\[\!.*actions\/workflows/d}' README.md
|
||||||
|
|
||||||
|
- name: Convert README.md to HTML
|
||||||
|
uses: docker://pandoc/core:latest
|
||||||
|
with:
|
||||||
|
args: >-
|
||||||
|
--from gfm --to html5 --toc --shift-heading-level-by=-1
|
||||||
|
--template .pandoc_template.html5
|
||||||
|
--output README.html README.md
|
||||||
|
|
||||||
|
- name: Upload README.html as an artifact
|
||||||
|
uses: actions/upload-artifact@master
|
||||||
|
with:
|
||||||
|
name: README.html
|
||||||
|
path: README.html
|
||||||
@@ -0,0 +1,194 @@
|
|||||||
|
---
|
||||||
|
name: Run integration tests in Testing Farm
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types:
|
||||||
|
- created
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
# This is required for the ability to create/update the Pull request status
|
||||||
|
statuses: write
|
||||||
|
jobs:
|
||||||
|
prepare_vars:
|
||||||
|
name: Get info from role and PR to determine if and how to test
|
||||||
|
# The concurrency key is used to prevent multiple workflows from running at the same time
|
||||||
|
concurrency:
|
||||||
|
# group name contains reponame-pr_num to allow simualteneous runs in different PRs
|
||||||
|
group: testing-farm-${{ github.event.repository.name }}-${{ github.event.issue.number }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
# Let's schedule tests only on user request. NOT automatically.
|
||||||
|
# Only repository owner or member can schedule tests
|
||||||
|
if: |
|
||||||
|
github.event.issue.pull_request
|
||||||
|
&& contains(github.event.comment.body, '[citest]')
|
||||||
|
&& (contains(fromJson('["OWNER", "MEMBER", "COLLABORATOR", "CONTRIBUTOR"]'), github.event.comment.author_association)
|
||||||
|
|| contains('systemroller', github.event.comment.user.login))
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
supported_platforms: ${{ steps.supported_platforms.outputs.supported_platforms }}
|
||||||
|
head_sha: ${{ steps.head_sha.outputs.head_sha }}
|
||||||
|
memory: ${{ steps.memory.outputs.memory }}
|
||||||
|
steps:
|
||||||
|
- name: Dump github context
|
||||||
|
run: echo "$GITHUB_CONTEXT"
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
|
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get head sha of the PR
|
||||||
|
id: head_sha
|
||||||
|
run: |
|
||||||
|
head_sha=$(gh api "repos/$REPO/pulls/$PR_NO" --jq '.head.sha')
|
||||||
|
echo "head_sha=$head_sha" >> $GITHUB_OUTPUT
|
||||||
|
env:
|
||||||
|
REPO: ${{ github.repository }}
|
||||||
|
PR_NO: ${{ github.event.issue.number }}
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Checkout PR
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ steps.head_sha.outputs.head_sha }}
|
||||||
|
|
||||||
|
- name: Get memory
|
||||||
|
id: memory
|
||||||
|
run: |
|
||||||
|
if [ -d tests/provision.fmf ]; then
|
||||||
|
memory=$(grep -rPo ' m: \K(.*)' tests/provision.fmf)
|
||||||
|
fi
|
||||||
|
if [ -n "$memory" ]; then
|
||||||
|
echo "memory=$memory" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "memory=2048" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Get supported platforms
|
||||||
|
id: supported_platforms
|
||||||
|
run: |
|
||||||
|
supported_platforms=""
|
||||||
|
meta_main=meta/main.yml
|
||||||
|
# All Fedora are supported, add latest Fedora versions to supported_platforms
|
||||||
|
if yq '.galaxy_info.galaxy_tags[]' "$meta_main" | grep -qi fedora$; then
|
||||||
|
supported_platforms+=" Fedora-39"
|
||||||
|
supported_platforms+=" Fedora-40"
|
||||||
|
fi
|
||||||
|
# Specific Fedora versions supported
|
||||||
|
if yq '.galaxy_info.galaxy_tags[]' "$meta_main" | grep -qiP 'fedora\d+$'; then
|
||||||
|
for fedora_ver in $(yq '.galaxy_info.galaxy_tags[]' "$meta_main" | grep -iPo 'fedora\K(\d+$)'); do
|
||||||
|
supported_platforms+=" Fedora-$fedora_ver"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
if yq '.galaxy_info.galaxy_tags[]' "$meta_main" | grep -qi el7; then
|
||||||
|
supported_platforms+=" CentOS-7-latest"
|
||||||
|
fi
|
||||||
|
for ver in 8 9 10; do
|
||||||
|
if yq '.galaxy_info.galaxy_tags[]' "$meta_main" | grep -qi el"$ver"; then
|
||||||
|
supported_platforms+=" CentOS-Stream-$ver"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "supported_platforms=$supported_platforms" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
testing-farm:
|
||||||
|
name: ${{ matrix.platform }}/ansible-${{ matrix.ansible_version }}
|
||||||
|
needs: prepare_vars
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- platform: Fedora-39
|
||||||
|
ansible_version: 2.17
|
||||||
|
- platform: Fedora-40
|
||||||
|
ansible_version: 2.17
|
||||||
|
- platform: CentOS-7-latest
|
||||||
|
ansible_version: 2.9
|
||||||
|
- platform: CentOS-Stream-8
|
||||||
|
ansible_version: 2.9
|
||||||
|
# On CentOS-Stream-8, latest supported Ansible is 2.16
|
||||||
|
- platform: CentOS-Stream-8
|
||||||
|
ansible_version: 2.16
|
||||||
|
- platform: CentOS-Stream-9
|
||||||
|
ansible_version: 2.17
|
||||||
|
- platform: CentOS-Stream-10
|
||||||
|
ansible_version: 2.17
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
ARTIFACTS_DIR_NAME: "tf_${{ github.event.repository.name }}-${{ github.event.issue.number }}_\
|
||||||
|
${{ matrix.platform }}-${{ matrix.ansible_version }}_\
|
||||||
|
${{ needs.prepare_vars.outputs.datetime }}/artifacts"
|
||||||
|
ARTIFACT_TARGET_DIR: /srv/pub/alt/${{ vars.LINUXSYSTEMROLES_USER }}/logs
|
||||||
|
steps:
|
||||||
|
- name: Set variables with DATETIME and artifact location
|
||||||
|
id: set_vars
|
||||||
|
run: |
|
||||||
|
printf -v DATETIME '%(%Y%m%d-%H%M%S)T' -1
|
||||||
|
ARTIFACTS_DIR_NAME="tf_${{ github.event.repository.name }}-${{ github.event.issue.number }}_\
|
||||||
|
${{ matrix.platform }}-${{ matrix.ansible_version }}_$DATETIME/artifacts"
|
||||||
|
ARTIFACTS_TARGET_DIR=/srv/pub/alt/${{ vars.LINUXSYSTEMROLES_USER }}/logs
|
||||||
|
ARTIFACTS_DIR=$ARTIFACTS_TARGET_DIR/$ARTIFACTS_DIR_NAME
|
||||||
|
ARTIFACTS_URL=https://dl.fedoraproject.org/pub/alt/${{ vars.LINUXSYSTEMROLES_USER }}/logs/$ARTIFACTS_DIR_NAME
|
||||||
|
echo "DATETIME=$DATETIME" >> $GITHUB_OUTPUT
|
||||||
|
echo "ARTIFACTS_DIR=$ARTIFACTS_DIR" >> $GITHUB_OUTPUT
|
||||||
|
echo "ARTIFACTS_URL=$ARTIFACTS_URL" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Set commit status as pending
|
||||||
|
if: contains(needs.prepare_vars.outputs.supported_platforms, matrix.platform)
|
||||||
|
uses: myrotvorets/set-commit-status-action@master
|
||||||
|
with:
|
||||||
|
sha: ${{ needs.prepare_vars.outputs.head_sha }}
|
||||||
|
status: pending
|
||||||
|
context: ${{ matrix.platform }}|ansible-${{ matrix.ansible_version }}
|
||||||
|
description: Test started
|
||||||
|
targetUrl: ""
|
||||||
|
|
||||||
|
- name: Set commit status as success with a description that platform is skipped
|
||||||
|
if: "!contains(needs.prepare_vars.outputs.supported_platforms, matrix.platform)"
|
||||||
|
uses: myrotvorets/set-commit-status-action@master
|
||||||
|
with:
|
||||||
|
sha: ${{ needs.prepare_vars.outputs.head_sha }}
|
||||||
|
status: success
|
||||||
|
context: ${{ matrix.platform }}|ansible-${{ matrix.ansible_version }}
|
||||||
|
description: The role does not support this platform. Skipping.
|
||||||
|
targetUrl: ""
|
||||||
|
|
||||||
|
- name: Run test in testing farm
|
||||||
|
uses: sclorg/testing-farm-as-github-action@v3
|
||||||
|
if: contains(needs.prepare_vars.outputs.supported_platforms, matrix.platform)
|
||||||
|
with:
|
||||||
|
git_url: https://github.com/linux-system-roles/tft-tests
|
||||||
|
git_ref: main
|
||||||
|
pipeline_settings: '{ "type": "tmt-multihost" }'
|
||||||
|
environment_settings: '{ "provisioning": { "tags": { "BusinessUnit": "system_roles" } } }'
|
||||||
|
# Keeping ARTIFACTS_URL at the bottom makes the link in logs clickable
|
||||||
|
variables: "ANSIBLE_VER=${{ matrix.ansible_version }};\
|
||||||
|
REPO_NAME=${{ github.event.repository.name }};\
|
||||||
|
GITHUB_ORG=${{ github.repository_owner }};\
|
||||||
|
PR_NUM=${{ github.event.issue.number }};\
|
||||||
|
ARTIFACTS_DIR=${{ steps.set_vars.outputs.ARTIFACTS_DIR }};\
|
||||||
|
TEST_LOCAL_CHANGES=false;\
|
||||||
|
LINUXSYSTEMROLES_USER=${{ vars.LINUXSYSTEMROLES_USER }};\
|
||||||
|
ARTIFACTS_URL=${{ steps.set_vars.outputs.ARTIFACTS_URL }}"
|
||||||
|
# Note that LINUXSYSTEMROLES_SSH_KEY must be single-line, TF doesn't read multi-line variables fine.
|
||||||
|
secrets: "LINUXSYSTEMROLES_DOMAIN=${{ secrets.LINUXSYSTEMROLES_DOMAIN }};\
|
||||||
|
LINUXSYSTEMROLES_SSH_KEY=${{ secrets.LINUXSYSTEMROLES_SSH_KEY }}"
|
||||||
|
compose: ${{ matrix.platform }}
|
||||||
|
# There are two blockers for using public ranch:
|
||||||
|
# 1. multihost is not supported in public https://github.com/teemtee/tmt/issues/2620
|
||||||
|
# 2. Security issue that leaks long secrets - Jira TFT-2698
|
||||||
|
tf_scope: private
|
||||||
|
api_key: ${{ secrets.TF_API_KEY_RH }}
|
||||||
|
update_pull_request_status: false
|
||||||
|
tmt_hardware: '{ "memory": ">= ${{ needs.prepare_vars.outputs.memory }} MB" }'
|
||||||
|
tmt_plan_filter: "tag:general,template"
|
||||||
|
|
||||||
|
- name: Set final commit status
|
||||||
|
uses: myrotvorets/set-commit-status-action@master
|
||||||
|
if: always() && contains(needs.prepare_vars.outputs.supported_platforms, matrix.platform)
|
||||||
|
with:
|
||||||
|
sha: ${{ needs.prepare_vars.outputs.head_sha }}
|
||||||
|
status: ${{ job.status }}
|
||||||
|
context: ${{ matrix.platform }}|ansible-${{ matrix.ansible_version }}
|
||||||
|
description: Test finished
|
||||||
|
targetUrl: ${{ steps.set_vars.outputs.ARTIFACTS_URL }}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
---
|
||||||
|
name: Re-run failed testing farm tests
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types:
|
||||||
|
- created
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
jobs:
|
||||||
|
citest_bad_rerun:
|
||||||
|
if: |
|
||||||
|
github.event.issue.pull_request
|
||||||
|
&& contains(fromJson('["[citest_bad]", "[citest-bad]", "[citest bad]"]'), github.event.comment.body)
|
||||||
|
&& contains(fromJson('["OWNER", "MEMBER", "COLLABORATOR", "CONTRIBUTOR"]'), github.event.comment.author_association)
|
||||||
|
permissions:
|
||||||
|
actions: write # for re-running failed jobs: https://docs.github.com/en/rest/actions/workflow-runs?apiVersion=2022-11-28#re-run-a-job-from-a-workflow-run
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Wait 10s until tft.yml workflow is created and skipped because new comment don't match [citest]
|
||||||
|
run: sleep 10s
|
||||||
|
|
||||||
|
- name: Re-run failed jobs for this PR
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
REPO: ${{ github.repository }}
|
||||||
|
PR_TITLE: ${{ github.event.issue.title }}
|
||||||
|
run: |
|
||||||
|
PENDING_RUN=$(gh api "repos/$REPO/actions/workflows/tft.yml/runs?event=issue_comment" \
|
||||||
|
| jq -r "[.workflow_runs[] | select( .display_title == \"$PR_TITLE\") | \
|
||||||
|
select(.status == \"pending\" or .status == \"queued\" or .status == \"in_progress\") | .id][0]")
|
||||||
|
# if pending run don't exist, take the last run with failure state
|
||||||
|
if [ "$PENDING_RUN" != "null" ]; then
|
||||||
|
echo "The workflow $PENDING_RUN is still running, wait for it to finish to re-run"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
RUN_ID=$(gh api "repos/$REPO/actions/workflows/tft.yml/runs?event=issue_comment" \
|
||||||
|
| jq -r "[.workflow_runs[] | select( .display_title == \"$PR_TITLE\" ) | select( .conclusion == \"failure\" ) | .id][0]")
|
||||||
|
if [ "$RUN_ID" = "null" ]; then
|
||||||
|
echo "Failed workflow not found, exitting"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "Re-running workflow $RUN_ID"
|
||||||
|
gh api --method POST repos/$REPO/actions/runs/$RUN_ID/rerun-failed-jobs
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
---
|
||||||
|
# yamllint disable rule:line-length
|
||||||
|
name: Weekly CI trigger
|
||||||
|
on: # yamllint disable-line rule:truthy
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: 0 0 * * 6
|
||||||
|
env:
|
||||||
|
BRANCH_NAME: weekly-ci
|
||||||
|
COMMIT_MESSAGE: "ci: This PR is to trigger periodic CI testing"
|
||||||
|
BODY_MESSAGE: >-
|
||||||
|
This PR is for the purpose of triggering periodic CI testing.
|
||||||
|
We don't currently have a way to trigger CI without a PR,
|
||||||
|
so this PR serves that purpose.
|
||||||
|
COMMENT: "[citest]"
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
jobs:
|
||||||
|
weekly_ci:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
- name: Update pip, git
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y git
|
||||||
|
|
||||||
|
- name: Checkout latest code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Create or rebase commit, add dump_packages callback
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
git config --global user.name "github-actions[bot]"
|
||||||
|
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
|
git checkout ${{ env.BRANCH_NAME }} || git checkout -b ${{ env.BRANCH_NAME }}
|
||||||
|
git rebase main
|
||||||
|
if [ ! -d tests/callback_plugins ]; then
|
||||||
|
mkdir -p tests/callback_plugins
|
||||||
|
fi
|
||||||
|
curl -L -s -o tests/callback_plugins/dump_packages.py https://raw.githubusercontent.com/linux-system-roles/auto-maintenance/main/callback_plugins/dump_packages.py
|
||||||
|
git add tests/callback_plugins
|
||||||
|
git commit --allow-empty -m "${{ env.COMMIT_MESSAGE }}"
|
||||||
|
git push -f --set-upstream origin ${{ env.BRANCH_NAME }}
|
||||||
|
|
||||||
|
- name: Create and comment pull request
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GH_PUSH_TOKEN }}
|
||||||
|
script: |
|
||||||
|
const head = [context.repo.owner, ":", "${{ env.BRANCH_NAME }}"].join("");
|
||||||
|
const response = await github.rest.pulls.list({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
head: head,
|
||||||
|
base: context.ref,
|
||||||
|
state: "open"
|
||||||
|
});
|
||||||
|
let pr_number = '';
|
||||||
|
if (response.data.length === 0) {
|
||||||
|
pr_number = (await github.rest.pulls.create({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
title: "${{ env.COMMIT_MESSAGE }}",
|
||||||
|
body: "${{ env.BODY_MESSAGE }}",
|
||||||
|
head: "${{ env.BRANCH_NAME }}",
|
||||||
|
base: context.ref,
|
||||||
|
draft: true
|
||||||
|
})).data.number;
|
||||||
|
} else {
|
||||||
|
pr_number = response.data[0].number;
|
||||||
|
}
|
||||||
|
github.rest.issues.createComment({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: pr_number,
|
||||||
|
body: "${{ env.COMMENT }}",
|
||||||
|
});
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
# yamllint disable rule:line-length
|
||||||
|
name: Woke
|
||||||
|
on: # yamllint disable-line rule:truthy
|
||||||
|
- pull_request
|
||||||
|
jobs:
|
||||||
|
woke:
|
||||||
|
name: Detect non-inclusive language
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Run lsr-woke-action
|
||||||
|
# Originally, uses: get-woke/woke-action@v0
|
||||||
|
uses: linux-system-roles/lsr-woke-action@main
|
||||||
|
with:
|
||||||
|
woke-args: "-c https://raw.githubusercontent.com/linux-system-roles/tox-lsr/main/src/tox_lsr/config_files/woke.yml --count-only-error-for-failure"
|
||||||
|
# Cause the check to fail on any broke rules
|
||||||
|
fail-on-error: true
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
passes.yml
|
||||||
|
vault.yml
|
||||||
|
*.pyc
|
||||||
|
*.retry
|
||||||
|
/tests/.coverage
|
||||||
|
/tests/htmlcov*
|
||||||
|
/.tox
|
||||||
|
/venv*/
|
||||||
|
/.venv/
|
||||||
|
.vscode/
|
||||||
|
artifacts/
|
||||||
|
__pycache__/
|
||||||
|
*~
|
||||||
|
.pytest_cache/
|
||||||
@@ -0,0 +1,261 @@
|
|||||||
|
---
|
||||||
|
# Default state for all rules
|
||||||
|
default: true
|
||||||
|
|
||||||
|
# Path to configuration file to extend
|
||||||
|
extends: null
|
||||||
|
|
||||||
|
# MD001/heading-increment/header-increment - Heading levels should only increment by one level at a time
|
||||||
|
MD001: true
|
||||||
|
|
||||||
|
# MD002/first-heading-h1/first-header-h1 - First heading should be a top-level heading
|
||||||
|
MD002:
|
||||||
|
# Heading level
|
||||||
|
level: 1
|
||||||
|
|
||||||
|
# MD003/heading-style/header-style - Heading style
|
||||||
|
MD003:
|
||||||
|
# Heading style
|
||||||
|
style: "consistent"
|
||||||
|
|
||||||
|
# MD004/ul-style - Unordered list style
|
||||||
|
MD004:
|
||||||
|
# List style
|
||||||
|
style: "consistent"
|
||||||
|
|
||||||
|
# MD005/list-indent - Inconsistent indentation for list items at the same level
|
||||||
|
MD005: true
|
||||||
|
|
||||||
|
# MD006/ul-start-left - Consider starting bulleted lists at the beginning of the line
|
||||||
|
MD006: true
|
||||||
|
|
||||||
|
# MD007/ul-indent - Unordered list indentation
|
||||||
|
MD007:
|
||||||
|
# Spaces for indent
|
||||||
|
indent: 2
|
||||||
|
# Whether to indent the first level of the list
|
||||||
|
start_indented: false
|
||||||
|
# Spaces for first level indent (when start_indented is set)
|
||||||
|
start_indent: 2
|
||||||
|
|
||||||
|
# MD009/no-trailing-spaces - Trailing spaces
|
||||||
|
MD009:
|
||||||
|
# Spaces for line break
|
||||||
|
br_spaces: 2
|
||||||
|
# Allow spaces for empty lines in list items
|
||||||
|
list_item_empty_lines: false
|
||||||
|
# Include unnecessary breaks
|
||||||
|
strict: false
|
||||||
|
|
||||||
|
# MD010/no-hard-tabs - Hard tabs
|
||||||
|
MD010:
|
||||||
|
# Include code blocks
|
||||||
|
code_blocks: true
|
||||||
|
# Fenced code languages to ignore
|
||||||
|
ignore_code_languages: []
|
||||||
|
# Number of spaces for each hard tab
|
||||||
|
spaces_per_tab: 1
|
||||||
|
|
||||||
|
# MD011/no-reversed-links - Reversed link syntax
|
||||||
|
MD011: true
|
||||||
|
|
||||||
|
# MD012/no-multiple-blanks - Multiple consecutive blank lines
|
||||||
|
MD012:
|
||||||
|
# Consecutive blank lines
|
||||||
|
maximum: 1
|
||||||
|
|
||||||
|
# Modified for LSR
|
||||||
|
# GFM does not limit line length
|
||||||
|
# MD013/line-length - Line length
|
||||||
|
MD013: false
|
||||||
|
# # Number of characters
|
||||||
|
# # line_length: 80
|
||||||
|
# line_length: 999
|
||||||
|
# # Number of characters for headings
|
||||||
|
# heading_line_length: 80
|
||||||
|
# # Number of characters for code blocks
|
||||||
|
# code_block_line_length: 80
|
||||||
|
# # Include code blocks
|
||||||
|
# code_blocks: true
|
||||||
|
# # Include tables
|
||||||
|
# tables: true
|
||||||
|
# # Include headings
|
||||||
|
# headings: true
|
||||||
|
# # Include headings
|
||||||
|
# headers: true
|
||||||
|
# # Strict length checking
|
||||||
|
# strict: false
|
||||||
|
# # Stern length checking
|
||||||
|
# stern: false
|
||||||
|
|
||||||
|
# MD014/commands-show-output - Dollar signs used before commands without showing output
|
||||||
|
MD014: true
|
||||||
|
|
||||||
|
# MD018/no-missing-space-atx - No space after hash on atx style heading
|
||||||
|
MD018: true
|
||||||
|
|
||||||
|
# MD019/no-multiple-space-atx - Multiple spaces after hash on atx style heading
|
||||||
|
MD019: true
|
||||||
|
|
||||||
|
# MD020/no-missing-space-closed-atx - No space inside hashes on closed atx style heading
|
||||||
|
MD020: true
|
||||||
|
|
||||||
|
# MD021/no-multiple-space-closed-atx - Multiple spaces inside hashes on closed atx style heading
|
||||||
|
MD021: true
|
||||||
|
|
||||||
|
# MD022/blanks-around-headings/blanks-around-headers - Headings should be surrounded by blank lines
|
||||||
|
MD022:
|
||||||
|
# Blank lines above heading
|
||||||
|
lines_above: 1
|
||||||
|
# Blank lines below heading
|
||||||
|
lines_below: 1
|
||||||
|
|
||||||
|
# MD023/heading-start-left/header-start-left - Headings must start at the beginning of the line
|
||||||
|
MD023: true
|
||||||
|
|
||||||
|
# MD024/no-duplicate-heading/no-duplicate-header - Multiple headings with the same content
|
||||||
|
MD024: true
|
||||||
|
|
||||||
|
# MD025/single-title/single-h1 - Multiple top-level headings in the same document
|
||||||
|
MD025:
|
||||||
|
# Heading level
|
||||||
|
level: 1
|
||||||
|
# RegExp for matching title in front matter
|
||||||
|
front_matter_title: "^\\s*title\\s*[:=]"
|
||||||
|
|
||||||
|
# MD026/no-trailing-punctuation - Trailing punctuation in heading
|
||||||
|
MD026:
|
||||||
|
# Punctuation characters not allowed at end of headings
|
||||||
|
punctuation: ".,;:!。,;:!"
|
||||||
|
|
||||||
|
# MD027/no-multiple-space-blockquote - Multiple spaces after blockquote symbol
|
||||||
|
MD027: true
|
||||||
|
|
||||||
|
# MD028/no-blanks-blockquote - Blank line inside blockquote
|
||||||
|
MD028: true
|
||||||
|
|
||||||
|
# MD029/ol-prefix - Ordered list item prefix
|
||||||
|
MD029:
|
||||||
|
# List style
|
||||||
|
style: "one_or_ordered"
|
||||||
|
|
||||||
|
# MD030/list-marker-space - Spaces after list markers
|
||||||
|
MD030:
|
||||||
|
# Spaces for single-line unordered list items
|
||||||
|
ul_single: 1
|
||||||
|
# Spaces for single-line ordered list items
|
||||||
|
ol_single: 1
|
||||||
|
# Spaces for multi-line unordered list items
|
||||||
|
ul_multi: 1
|
||||||
|
# Spaces for multi-line ordered list items
|
||||||
|
ol_multi: 1
|
||||||
|
|
||||||
|
# MD031/blanks-around-fences - Fenced code blocks should be surrounded by blank lines
|
||||||
|
MD031:
|
||||||
|
# Include list items
|
||||||
|
list_items: true
|
||||||
|
|
||||||
|
# MD032/blanks-around-lists - Lists should be surrounded by blank lines
|
||||||
|
MD032: true
|
||||||
|
|
||||||
|
# MD033/no-inline-html - Inline HTML
|
||||||
|
MD033:
|
||||||
|
# Allowed elements
|
||||||
|
allowed_elements: []
|
||||||
|
|
||||||
|
# MD034/no-bare-urls - Bare URL used
|
||||||
|
MD034: true
|
||||||
|
|
||||||
|
# MD035/hr-style - Horizontal rule style
|
||||||
|
MD035:
|
||||||
|
# Horizontal rule style
|
||||||
|
style: "consistent"
|
||||||
|
|
||||||
|
# MD036/no-emphasis-as-heading/no-emphasis-as-header - Emphasis used instead of a heading
|
||||||
|
MD036:
|
||||||
|
# Punctuation characters
|
||||||
|
punctuation: ".,;:!?。,;:!?"
|
||||||
|
|
||||||
|
# MD037/no-space-in-emphasis - Spaces inside emphasis markers
|
||||||
|
MD037: true
|
||||||
|
|
||||||
|
# MD038/no-space-in-code - Spaces inside code span elements
|
||||||
|
MD038: true
|
||||||
|
|
||||||
|
# MD039/no-space-in-links - Spaces inside link text
|
||||||
|
MD039: true
|
||||||
|
|
||||||
|
# MD040/fenced-code-language - Fenced code blocks should have a language specified
|
||||||
|
MD040:
|
||||||
|
# List of languages
|
||||||
|
allowed_languages: []
|
||||||
|
# Require language only
|
||||||
|
language_only: false
|
||||||
|
|
||||||
|
# MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading
|
||||||
|
MD041:
|
||||||
|
# Heading level
|
||||||
|
level: 1
|
||||||
|
# RegExp for matching title in front matter
|
||||||
|
front_matter_title: "^\\s*title\\s*[:=]"
|
||||||
|
|
||||||
|
# MD042/no-empty-links - No empty links
|
||||||
|
MD042: true
|
||||||
|
|
||||||
|
# Modified for LSR
|
||||||
|
# Disabling, we do not need this
|
||||||
|
# MD043/required-headings/required-headers - Required heading structure
|
||||||
|
MD043: false
|
||||||
|
# # List of headings
|
||||||
|
# headings: []
|
||||||
|
# # List of headings
|
||||||
|
# headers: []
|
||||||
|
# # Match case of headings
|
||||||
|
# match_case: false
|
||||||
|
|
||||||
|
# MD044/proper-names - Proper names should have the correct capitalization
|
||||||
|
MD044:
|
||||||
|
# List of proper names
|
||||||
|
names: []
|
||||||
|
# Include code blocks
|
||||||
|
code_blocks: true
|
||||||
|
# Include HTML elements
|
||||||
|
html_elements: true
|
||||||
|
|
||||||
|
# MD045/no-alt-text - Images should have alternate text (alt text)
|
||||||
|
MD045: true
|
||||||
|
|
||||||
|
# MD046/code-block-style - Code block style
|
||||||
|
MD046:
|
||||||
|
# Block style
|
||||||
|
style: "consistent"
|
||||||
|
|
||||||
|
# MD047/single-trailing-newline - Files should end with a single newline character
|
||||||
|
MD047: true
|
||||||
|
|
||||||
|
# MD048/code-fence-style - Code fence style
|
||||||
|
MD048:
|
||||||
|
# Code fence style
|
||||||
|
style: "consistent"
|
||||||
|
|
||||||
|
# MD049/emphasis-style - Emphasis style should be consistent
|
||||||
|
MD049:
|
||||||
|
# Emphasis style should be consistent
|
||||||
|
style: "consistent"
|
||||||
|
|
||||||
|
# MD050/strong-style - Strong style should be consistent
|
||||||
|
MD050:
|
||||||
|
# Strong style should be consistent
|
||||||
|
style: "consistent"
|
||||||
|
|
||||||
|
# MD051/link-fragments - Link fragments should be valid
|
||||||
|
MD051: true
|
||||||
|
|
||||||
|
# MD052/reference-links-images - Reference links and images should use a label that is defined
|
||||||
|
MD052: true
|
||||||
|
|
||||||
|
# MD053/link-image-reference-definitions - Link and image reference definitions should be needed
|
||||||
|
MD053:
|
||||||
|
# Ignored definitions
|
||||||
|
ignored_definitions:
|
||||||
|
- "//"
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
*NOTE*: The `*.txt` files are used by `get_ostree_data.sh` to create the lists
|
||||||
|
of packages, and to find other system roles used by this role. DO NOT use them
|
||||||
|
directly.
|
||||||
Executable
+132
@@ -0,0 +1,132 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
ostree_dir="${OSTREE_DIR:-"$(dirname "$(realpath "$0")")"}"
|
||||||
|
|
||||||
|
if [ -z "${4:-}" ] || [ "${1:-}" = help ] || [ "${1:-}" = -h ]; then
|
||||||
|
cat <<EOF
|
||||||
|
Usage: $0 packages [runtime|testing] DISTRO-MAJOR[.MINOR] [json|yaml|raw|toml]
|
||||||
|
The script will use the packages and roles files in $ostree_dir to
|
||||||
|
construct the list of packages needed to build the ostree image. The script
|
||||||
|
will output the list of packages in the given format
|
||||||
|
- json is a JSON list like ["pkg1","pkg2",....,"pkgN"]
|
||||||
|
- yaml is the YAML list format
|
||||||
|
- raw is the list of packages, one per line
|
||||||
|
- toml is a list of [[packages]] elements as in https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html-single/composing_installing_and_managing_rhel_for_edge_images/index#creating-an-image-builder-blueprint-for-a-rhel-for-edge-image-using-the-command-line-interface_composing-a-rhel-for-edge-image-using-image-builder-command-line
|
||||||
|
The DISTRO-MAJOR.MINOR is the same format used by Ansible for distribution e.g. CentOS-8, RedHat-8.9, etc.
|
||||||
|
EOF
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
category="$1"
|
||||||
|
pkgtype="$2"
|
||||||
|
distro_ver="$3"
|
||||||
|
format="$4"
|
||||||
|
pkgtypes=("$pkgtype")
|
||||||
|
if [ "$pkgtype" = testing ]; then
|
||||||
|
pkgtypes+=(runtime)
|
||||||
|
fi
|
||||||
|
|
||||||
|
get_rolepath() {
|
||||||
|
local ostree_dir role rolesdir roles_parent_dir coll_path path
|
||||||
|
ostree_dir="$1"
|
||||||
|
role="$2"
|
||||||
|
roles_parent_dir="$(dirname "$(dirname "$ostree_dir")")"
|
||||||
|
rolesdir="$roles_parent_dir/$role/.ostree"
|
||||||
|
# assumes collection format
|
||||||
|
if [ -d "$rolesdir" ]; then
|
||||||
|
echo "$rolesdir"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
# assumes legacy role format like linux-system-roles.$role/
|
||||||
|
for rolesdir in "$roles_parent_dir"/*-system-roles."$role"/.ostree; do
|
||||||
|
if [ -d "$rolesdir" ]; then
|
||||||
|
echo "$rolesdir"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
# look elsewhere
|
||||||
|
coll_path="${ANSIBLE_COLLECTIONS_PATH:-}"
|
||||||
|
if [ -z "$coll_path" ]; then
|
||||||
|
coll_path="${ANSIBLE_COLLECTIONS_PATHS:-}"
|
||||||
|
fi
|
||||||
|
if [ -n "${coll_path}" ]; then
|
||||||
|
for path in ${coll_path//:/ }; do
|
||||||
|
for rolesdir in "$path"/ansible_collections/*/*_system_roles/roles/"$role"/.ostree; do
|
||||||
|
if [ -d "$rolesdir" ]; then
|
||||||
|
echo "$rolesdir"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
1>&2 echo ERROR - could not find role "$role" - please use ANSIBLE_COLLECTIONS_PATH
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
get_packages() {
|
||||||
|
local ostree_dir pkgtype pkgfile rolefile
|
||||||
|
ostree_dir="$1"
|
||||||
|
for pkgtype in "${pkgtypes[@]}"; do
|
||||||
|
for suff in "" "-$distro" "-${distro}-${major_ver}" "-${distro}-${ver}"; do
|
||||||
|
pkgfile="$ostree_dir/packages-${pkgtype}${suff}.txt"
|
||||||
|
if [ -f "$pkgfile" ]; then
|
||||||
|
cat "$pkgfile"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
rolefile="$ostree_dir/roles-${pkgtype}.txt"
|
||||||
|
if [ -f "$rolefile" ]; then
|
||||||
|
local roles role rolepath
|
||||||
|
roles="$(cat "$rolefile")"
|
||||||
|
for role in $roles; do
|
||||||
|
rolepath="$(get_rolepath "$ostree_dir" "$role")"
|
||||||
|
if [ -z "$rolepath" ]; then
|
||||||
|
1>&2 echo ERROR - could not find role "$role" - please use ANSIBLE_COLLECTIONS_PATH
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
get_packages "$rolepath"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
done | sort -u
|
||||||
|
}
|
||||||
|
|
||||||
|
format_packages_json() {
|
||||||
|
local comma pkgs pkg
|
||||||
|
comma=""
|
||||||
|
pkgs="["
|
||||||
|
while read -r pkg; do
|
||||||
|
pkgs="${pkgs}${comma}\"${pkg}\""
|
||||||
|
comma=,
|
||||||
|
done
|
||||||
|
pkgs="${pkgs}]"
|
||||||
|
echo "$pkgs"
|
||||||
|
}
|
||||||
|
|
||||||
|
format_packages_raw() {
|
||||||
|
cat
|
||||||
|
}
|
||||||
|
|
||||||
|
format_packages_yaml() {
|
||||||
|
while read -r pkg; do
|
||||||
|
echo "- $pkg"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
format_packages_toml() {
|
||||||
|
while read -r pkg; do
|
||||||
|
echo "[[packages]]"
|
||||||
|
echo "name = \"$pkg\""
|
||||||
|
echo "version = \"*\""
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
distro="${distro_ver%%-*}"
|
||||||
|
ver="${distro_ver##*-}"
|
||||||
|
if [[ "$ver" =~ ^([0-9]*) ]]; then
|
||||||
|
major_ver="${BASH_REMATCH[1]}"
|
||||||
|
else
|
||||||
|
echo ERROR: cannot parse major version number from version "$ver"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
"get_$category" "$ostree_dir" | "format_${category}_$format"
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,4 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
ignore: |
|
||||||
|
/.tox/
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
Copyright <YEAR> <COPYRIGHT HOLDER>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# Introduction to Ansible for Linux System Roles
|
||||||
|
|
||||||
|
If you are not familiar with Ansible, please see
|
||||||
|
[Introduction to Ansible for Linux System Roles](https://linux-system-roles.github.io/documentation/intro-to-ansible-for-system-roles.html),
|
||||||
|
where many useful links are presented.
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
# rpm-ostree
|
||||||
|
|
||||||
|
The role supports running on [rpm-ostree](https://coreos.github.io/rpm-ostree/)
|
||||||
|
systems. The primary issue is that the `/usr` filesystem is read-only, and the
|
||||||
|
role cannot install packages. Instead, it will just verify that the necessary
|
||||||
|
packages and any other `/usr` files are pre-installed. The role will change the
|
||||||
|
package manager to one that is compatible with `rpm-ostree` systems.
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
To build an ostree image for a particular operating system distribution and
|
||||||
|
version, use the script `.ostree/get_ostree_data.sh` to get the list of
|
||||||
|
packages. If the role uses other system roles, then the script will include the
|
||||||
|
packages for the other roles in the list it outputs. The list of packages will
|
||||||
|
be sorted in alphanumeric order.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
.ostree/get_ostree_data.sh packages runtime DISTRO-VERSION FORMAT
|
||||||
|
```
|
||||||
|
|
||||||
|
`DISTRO-VERSION` is in the format that Ansible uses for `ansible_distribution`
|
||||||
|
and `ansible_distribution_version` - for example, `Fedora-38`, `CentOS-8`,
|
||||||
|
`RedHat-9.4`
|
||||||
|
|
||||||
|
`FORMAT` is one of `toml`, `json`, `yaml`, `raw`
|
||||||
|
|
||||||
|
* `toml` - each package in a TOML `[[packages]]` element
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[[packages]]
|
||||||
|
name = "package-a"
|
||||||
|
version = "*"
|
||||||
|
[[packages]]
|
||||||
|
name = "package-b"
|
||||||
|
version = "*"
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
* `yaml` - a YAML list of packages
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- package-a
|
||||||
|
- package-b
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
* `json` - a JSON list of packages
|
||||||
|
|
||||||
|
```json
|
||||||
|
["package-a","package-b",...]
|
||||||
|
```
|
||||||
|
|
||||||
|
* `raw` - a plain text list of packages, one per line
|
||||||
|
|
||||||
|
```bash
|
||||||
|
package-a
|
||||||
|
package-b
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
What format you choose depends on which image builder you are using. For
|
||||||
|
example, if you are using something based on
|
||||||
|
[osbuild-composer](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html-single/composing_installing_and_managing_rhel_for_edge_images/index#creating-an-image-builder-blueprint-for-a-rhel-for-edge-image-using-the-command-line-interface_composing-a-rhel-for-edge-image-using-image-builder-command-line),
|
||||||
|
you will probably want to use the `toml` output format.
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
# Role Name
|
||||||
|
|
||||||
|
[](https://github.com/linux-system-roles/template/actions/workflows/ansible-lint.yml) [](https://github.com/linux-system-roles/template/actions/workflows/ansible-test.yml) [](https://github.com/linux-system-roles/template/actions/workflows/markdownlint.yml) [](https://github.com/linux-system-roles/template/actions/workflows/shellcheck.yml) [](https://github.com/linux-system-roles/template/actions/workflows/tft.yml) [](https://github.com/linux-system-roles/template/actions/workflows/tft_citest_bad.yml) [](https://github.com/linux-system-roles/template/actions/workflows/woke.yml)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
A template for an ansible role that configures some GNU/Linux subsystem or
|
||||||
|
service. A brief description of the role goes here.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
Any prerequisites that may not be covered by Ansible itself or the role should
|
||||||
|
be mentioned here. This includes platform dependencies not managed by the
|
||||||
|
role, hardware requirements, external collections, etc. There should be a
|
||||||
|
distinction between *control node* requirements (like collections) and
|
||||||
|
*managed node* requirements (like special hardware, platform provisioning).
|
||||||
|
|
||||||
|
### Collection requirements
|
||||||
|
|
||||||
|
For instance, if the role depends on some collections and has a
|
||||||
|
`meta/collection-requirements.yml` file for installing those dependencies, and
|
||||||
|
in order to manage `rpm-ostree` systems, it should be mentioned here that the
|
||||||
|
user should run
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ansible-galaxy collection install -vv -r meta/collection-requirements.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
on the *control node* before using the role.
|
||||||
|
|
||||||
|
## Role Variables
|
||||||
|
|
||||||
|
A description of all input variables (i.e. variables that are defined in
|
||||||
|
`defaults/main.yml`) for the role should go here as these form an API of the
|
||||||
|
role. Each variable should have its own section e.g.
|
||||||
|
|
||||||
|
### template_foo
|
||||||
|
|
||||||
|
This variable is required. It is a string that lists the foo of the role.
|
||||||
|
There is no default value.
|
||||||
|
|
||||||
|
### template_bar
|
||||||
|
|
||||||
|
This variable is optional. It is a boolean that tells the role to disable bar.
|
||||||
|
The default value is `true`.
|
||||||
|
|
||||||
|
Variables that are not intended as input, like variables defined in
|
||||||
|
`vars/main.yml`, variables that are read from other roles and/or the global
|
||||||
|
scope (ie. hostvars, group vars, etc.) can be also mentioned here but keep in
|
||||||
|
mind that as these are probably not part of the role API they may change during
|
||||||
|
the lifetime.
|
||||||
|
|
||||||
|
Example of setting the variables:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
template_foo: "oof"
|
||||||
|
template_bar: false
|
||||||
|
```
|
||||||
|
|
||||||
|
## Variables Exported by the Role
|
||||||
|
|
||||||
|
This section is optional. Some roles may export variables for playbooks to
|
||||||
|
use later. These are analogous to "return values" in Ansible modules. For
|
||||||
|
example, if a role performs some action that will require a system reboot, but
|
||||||
|
the user wants to defer the reboot, the role might set a variable like
|
||||||
|
`template_reboot_needed: true` that the playbook can use to reboot at a more
|
||||||
|
convenient time.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
### template_reboot_needed
|
||||||
|
|
||||||
|
Default `false` - if `true`, this means a reboot is needed to apply the changes
|
||||||
|
made by the role
|
||||||
|
|
||||||
|
## Example Playbook
|
||||||
|
|
||||||
|
Including an example of how to use your role (for instance, with variables
|
||||||
|
passed in as parameters) is always nice for users too:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- name: Manage the template subsystem
|
||||||
|
hosts: all
|
||||||
|
vars:
|
||||||
|
template_foo: "foo foo!"
|
||||||
|
template_bar: false
|
||||||
|
roles:
|
||||||
|
- linux-system-roles.template
|
||||||
|
```
|
||||||
|
|
||||||
|
More examples can be provided in the [`examples/`](examples) directory. These
|
||||||
|
can be useful, especially for documentation.
|
||||||
|
|
||||||
|
## rpm-ostree
|
||||||
|
|
||||||
|
See README-ostree.md
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Whenever possible, please prefer MIT.
|
||||||
|
|
||||||
|
## Author Information
|
||||||
|
|
||||||
|
An optional section for the role authors to include contact information, or a
|
||||||
|
website (HTML is not allowed).
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# Contributing to the template Linux System Role
|
||||||
|
|
||||||
|
## Where to start
|
||||||
|
|
||||||
|
The first place to go is [Contribute](https://linux-system-roles.github.io/contribute.html).
|
||||||
|
This has all of the common information that all role developers need:
|
||||||
|
|
||||||
|
* Role structure and layout
|
||||||
|
* Development tools - How to run tests and checks
|
||||||
|
* Ansible recommended practices
|
||||||
|
* Basic git and github information
|
||||||
|
* How to create git commits and submit pull requests
|
||||||
|
|
||||||
|
**Bugs and needed implementations** are listed on
|
||||||
|
[Github Issues](https://github.com/linux-system-roles/template/issues).
|
||||||
|
Issues labeled with
|
||||||
|
[**help wanted**](https://github.com/linux-system-roles/template/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22)
|
||||||
|
are likely to be suitable for new contributors!
|
||||||
|
|
||||||
|
**Code** is managed on [Github](https://github.com/linux-system-roles/template), using
|
||||||
|
[Pull Requests](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests).
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
# Here is the right place to put the role's input variables.
|
||||||
|
# This file also serves as a documentation for such a variables.
|
||||||
|
|
||||||
|
# Examples of role input variables:
|
||||||
|
template_foo: foo
|
||||||
|
template_bar: true
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
- name: Example template role invocation
|
||||||
|
hosts: all
|
||||||
|
vars:
|
||||||
|
template_foo: example variable value
|
||||||
|
template_bar: false
|
||||||
|
roles:
|
||||||
|
- linux-system-roles.template
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
- name: Handler for template to restart services
|
||||||
|
service:
|
||||||
|
name: "{{ item }}"
|
||||||
|
state: restarted
|
||||||
|
loop: "{{ __template_services }}"
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
collections:
|
||||||
|
- ansible.posix
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
galaxy_info:
|
||||||
|
author: John Doe <jdoe@corp.com>
|
||||||
|
description: Basic template for Linux system roles
|
||||||
|
company: John Doe, Inc.
|
||||||
|
license: MIT
|
||||||
|
min_ansible_version: "2.9"
|
||||||
|
platforms:
|
||||||
|
- name: Fedora
|
||||||
|
versions:
|
||||||
|
- all
|
||||||
|
- name: EL
|
||||||
|
versions:
|
||||||
|
- "9"
|
||||||
|
galaxy_tags:
|
||||||
|
- el9
|
||||||
|
- el10
|
||||||
|
- fedora
|
||||||
|
dependencies: []
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
- name: Set platform/version specific variables
|
||||||
|
include_tasks: tasks/set_vars.yml
|
||||||
|
|
||||||
|
# Examples of some tasks:
|
||||||
|
- name: Ensure required packages are installed
|
||||||
|
package:
|
||||||
|
name: "{{ __template_packages }}"
|
||||||
|
state: present
|
||||||
|
use: "{{ (__template_is_ostree | d(false)) |
|
||||||
|
ternary('ansible.posix.rhel_rpm_ostree', omit) }}"
|
||||||
|
|
||||||
|
- name: Ensure required services are enabled and started
|
||||||
|
service:
|
||||||
|
name: "{{ item }}"
|
||||||
|
state: started
|
||||||
|
enabled: true
|
||||||
|
loop: "{{ __template_services }}"
|
||||||
|
|
||||||
|
- name: Generate /etc/{{ __template_foo_config }}
|
||||||
|
template:
|
||||||
|
src: "{{ __template_foo_config }}.j2"
|
||||||
|
dest: /etc/{{ __template_foo_config }}
|
||||||
|
backup: true
|
||||||
|
mode: "0400"
|
||||||
|
notify: Handler for template to restart services
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
---
|
||||||
|
- name: Ensure ansible_facts used by role
|
||||||
|
setup:
|
||||||
|
gather_subset: "{{ __template_required_facts_subsets }}"
|
||||||
|
when: __template_required_facts |
|
||||||
|
difference(ansible_facts.keys() | list) | length > 0
|
||||||
|
|
||||||
|
- name: Determine if system is ostree and set flag
|
||||||
|
when: not __template_is_ostree is defined
|
||||||
|
block:
|
||||||
|
- name: Check if system is ostree
|
||||||
|
stat:
|
||||||
|
path: /run/ostree-booted
|
||||||
|
register: __ostree_booted_stat
|
||||||
|
|
||||||
|
- name: Set flag to indicate system is ostree
|
||||||
|
set_fact:
|
||||||
|
__template_is_ostree: "{{ __ostree_booted_stat.stat.exists }}"
|
||||||
|
|
||||||
|
- name: Set platform/version specific variables
|
||||||
|
include_vars: "{{ __vars_file }}"
|
||||||
|
loop:
|
||||||
|
- "{{ ansible_facts['os_family'] }}.yml"
|
||||||
|
- "{{ ansible_facts['distribution'] }}.yml"
|
||||||
|
- >-
|
||||||
|
{{ ansible_facts['distribution'] ~ '_' ~
|
||||||
|
ansible_facts['distribution_major_version'] }}.yml
|
||||||
|
- >-
|
||||||
|
{{ ansible_facts['distribution'] ~ '_' ~
|
||||||
|
ansible_facts['distribution_version'] }}.yml
|
||||||
|
vars:
|
||||||
|
__vars_file: "{{ role_path }}/vars/{{ item }}"
|
||||||
|
when: __vars_file is file
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
#
|
||||||
|
# Example of a template of configuration file
|
||||||
|
#
|
||||||
|
{{ ansible_managed | comment }}
|
||||||
|
{{ "system_role:template" | comment(prefix="", postfix="") }}
|
||||||
|
[foo]
|
||||||
|
foo = {{ template_foo }}
|
||||||
|
bar = {{ template_bar }}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
# tasks file for caller
|
||||||
|
|
||||||
|
- name: Include role
|
||||||
|
include_role:
|
||||||
|
name: "{{ roletoinclude }}"
|
||||||
|
|
||||||
|
- name: Assert variable not overridden
|
||||||
|
assert:
|
||||||
|
that: not __caller_override
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
# vars file for caller
|
||||||
|
__caller_override: false
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../../../defaults
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../../../handlers
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../../../meta
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../../../tasks
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../../../templates
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../../../vars
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
- name: Setup snapshot
|
||||||
|
hosts: all
|
||||||
|
tasks:
|
||||||
|
- name: Set platform/version specific variables
|
||||||
|
include_role:
|
||||||
|
name: linux-system-roles.template
|
||||||
|
tasks_from: set_vars.yml
|
||||||
|
public: true
|
||||||
|
|
||||||
|
- name: Install test packages
|
||||||
|
package:
|
||||||
|
name: "{{ __template_packages }}"
|
||||||
|
state: present
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
- name: Get file
|
||||||
|
slurp:
|
||||||
|
path: "{{ __file }}"
|
||||||
|
register: __content
|
||||||
|
when: not __file_content is defined
|
||||||
|
|
||||||
|
- name: Check for presence of ansible managed header, fingerprint
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- ansible_managed in content
|
||||||
|
- __fingerprint in content
|
||||||
|
vars:
|
||||||
|
content: "{{ (__file_content | d(__content)).content | b64decode }}"
|
||||||
|
ansible_managed: "{{ lookup('template', 'get_ansible_managed.j2') }}"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{{ ansible_managed | comment(__comment_type | d("plain")) }}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
- name: Ensure that the role runs with default parameters
|
||||||
|
hosts: all
|
||||||
|
gather_facts: false # test that role works in this case
|
||||||
|
roles:
|
||||||
|
- linux-system-roles.template
|
||||||
|
tasks:
|
||||||
|
- name: Check header for ansible_managed, fingerprint
|
||||||
|
include_tasks: tasks/check_header.yml
|
||||||
|
vars:
|
||||||
|
__file: /etc/foo.conf
|
||||||
|
__fingerprint: system_role:template
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
---
|
||||||
|
- name: Test role include variable override
|
||||||
|
hosts: all
|
||||||
|
gather_facts: true
|
||||||
|
tasks:
|
||||||
|
- name: Create var file in caller that can override the one in called role
|
||||||
|
delegate_to: localhost
|
||||||
|
copy:
|
||||||
|
# usually the fake file will cause the called role to crash of
|
||||||
|
# overriding happens, but if not, set a variable that will
|
||||||
|
# allow to detect the bug
|
||||||
|
content: "__caller_override: true"
|
||||||
|
# XXX ugly, self-modifying code - changes the "caller" role on
|
||||||
|
# the controller
|
||||||
|
dest: "{{ playbook_dir }}/roles/caller/vars/{{ item }}.yml"
|
||||||
|
mode: preserve
|
||||||
|
loop: "{{ varfiles | unique }}"
|
||||||
|
# In case the playbook is executed against multiple hosts, use
|
||||||
|
# only the first one. Otherwise the hosts would stomp on each
|
||||||
|
# other since they are changing files on the controller.
|
||||||
|
when: inventory_hostname == ansible_play_hosts_all[0]
|
||||||
|
vars:
|
||||||
|
# change to hostvars['localhost']['ansible_facts'] to use the
|
||||||
|
# information for localhost
|
||||||
|
facts: "{{ ansible_facts }}"
|
||||||
|
versions:
|
||||||
|
- "{{ facts['distribution_version'] }}"
|
||||||
|
- "{{ facts['distribution_major_version'] }}"
|
||||||
|
separators: ["-", "_"]
|
||||||
|
# create all variants like CentOS, CentOS_8.1, CentOS-8.1,
|
||||||
|
# CentOS-8, CentOS-8.1
|
||||||
|
# more formally:
|
||||||
|
# {{ ansible_distribution }}-{{ ansible_distribution_version }}
|
||||||
|
# {{ ansible_distribution }}-{{ ansible_distribution_major_version }}
|
||||||
|
# {{ ansible_distribution }}
|
||||||
|
# {{ ansible_os_family }}
|
||||||
|
# and the same for _ as separator.
|
||||||
|
varfiles: "{{ [facts['distribution']] | product(separators) |
|
||||||
|
map('join') | product(versions) | map('join') | list +
|
||||||
|
[facts['distribution'], facts['os_family']] }}"
|
||||||
|
register: __varfiles_created
|
||||||
|
|
||||||
|
- name: Import role
|
||||||
|
import_role:
|
||||||
|
name: caller
|
||||||
|
vars:
|
||||||
|
roletoinclude: linux-system-roles.template
|
||||||
|
|
||||||
|
- name: Cleanup
|
||||||
|
file:
|
||||||
|
path: "{{ item.dest }}"
|
||||||
|
state: absent
|
||||||
|
loop: "{{ __varfiles_created.results }}"
|
||||||
|
delegate_to: localhost
|
||||||
|
when: inventory_hostname == ansible_play_hosts_all[0]
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
# Put internal variables here with CentOS 10 specific values.
|
||||||
|
|
||||||
|
# Example:
|
||||||
|
__template_packages: []
|
||||||
|
__template_services: []
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
# Put internal variables here with CentOS 7 specific values.
|
||||||
|
|
||||||
|
# Example:
|
||||||
|
__template_packages: []
|
||||||
|
__template_services: []
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
# Put internal variables here with CentOS 8 specific values.
|
||||||
|
|
||||||
|
# Example:
|
||||||
|
__template_packages: []
|
||||||
|
__template_services: []
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
# Put internal variables here with CentOS 9 specific values.
|
||||||
|
|
||||||
|
# Example:
|
||||||
|
__template_packages: []
|
||||||
|
__template_services: []
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
# Put internal variables here with Fedora specific values.
|
||||||
|
|
||||||
|
# Example:
|
||||||
|
__template_packages: []
|
||||||
|
__template_services: []
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
# Put internal variables here with Red Hat Enterprise Linux 10 specific values.
|
||||||
|
|
||||||
|
# Example:
|
||||||
|
__template_packages: []
|
||||||
|
__template_services: []
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
# Put internal variables here with Red Hat Enterprise Linux 7 specific values.
|
||||||
|
|
||||||
|
# Example:
|
||||||
|
__template_packages: []
|
||||||
|
__template_services: []
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
# Put internal variables here with Red Hat Enterprise Linux 8 specific values.
|
||||||
|
|
||||||
|
# Example:
|
||||||
|
__template_packages: []
|
||||||
|
__template_services: []
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
# Put internal variables here with Red Hat Enterprise Linux 9 specific values.
|
||||||
|
|
||||||
|
# Example:
|
||||||
|
__template_packages: []
|
||||||
|
__template_services: []
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
---
|
||||||
|
# Put the role's internal variables here that are not distribution specific.
|
||||||
|
# You can override these by defining the same variable with a different
|
||||||
|
# value in a platform/version specific file in vars/
|
||||||
|
|
||||||
|
# Examples of non-distribution specific (generic) internal variables:
|
||||||
|
__template_foo_config: foo.conf
|
||||||
|
__template_packages: []
|
||||||
|
__template_services: []
|
||||||
|
# ansible_facts required by the role
|
||||||
|
__template_required_facts:
|
||||||
|
- distribution
|
||||||
|
- distribution_major_version
|
||||||
|
- distribution_version
|
||||||
|
- os_family
|
||||||
|
# the subsets of ansible_facts that need to be gathered in case any of the
|
||||||
|
# facts in required_facts is missing; see the documentation of
|
||||||
|
# the 'gather_subset' parameter of the 'setup' module
|
||||||
|
__template_required_facts_subsets: "{{ ['!all', '!min'] +
|
||||||
|
__template_required_facts }}"
|
||||||
Reference in New Issue
Block a user