Compare commits
142 Commits
1.0.0rc3
...
developmen
Author | SHA1 | Date | |
---|---|---|---|
694b3209f2 | |||
4f9fc48eaa | |||
2eb7870e57 | |||
433770ffa3 | |||
e649d7e711 | |||
5f59921c70 | |||
4efb97b728 | |||
20726d1712 | |||
bf732b3238 | |||
e415c4f112 | |||
e0ca7c7a25 | |||
03f88d7300 | |||
acf5d9fe58 | |||
b22bde4f61 | |||
1eb98c187b | |||
3458e89ee0 | |||
3b8a8b8e9e | |||
b2afb094bb | |||
deb01d8774 | |||
2bcf3c99a7 | |||
9533f47a3b | |||
c15f2e0ea9 | |||
a6bff682c2 | |||
c59a0f6b7f | |||
fa93149ac6 | |||
bbccb0260a | |||
80cfabbbb7 | |||
99d5cd36e3 | |||
f5def60091 | |||
f87051432c | |||
3481b1229b | |||
33c4f17324 | |||
4b666a5c04 | |||
e12b0a1ef3 | |||
7a4161e2a2 | |||
6692e90318 | |||
57b00bc8f7 | |||
185d3eec8c | |||
d42f0901ed | |||
c0d589f70a | |||
649055c2e9 | |||
e3e8417130 | |||
1788673523 | |||
809b4457d9 | |||
955e30ba31 | |||
85de8dcd64 | |||
7d7fd5b4c1 | |||
58130b365d | |||
2eeb1a4cee | |||
4b129fe0f5 | |||
844cb0cb73 | |||
14a115d984 | |||
4bdf9d6f00 | |||
fc3869798e | |||
aba4b88509 | |||
020de5681f | |||
6c430c9384 | |||
a72ceafd34 | |||
f65a738621 | |||
3d484f8dd1 | |||
b20906f38a | |||
cd8088345e | |||
8b61229d33 | |||
f83c40ca87 | |||
1eaa5c1c68 | |||
ba00bf5ba4 | |||
0e25bc5909 | |||
eac92e72fb | |||
4f320158ad | |||
5dab342cdb | |||
fd515ffea7 | |||
02b6253fb0 | |||
b12c53de14 | |||
0303446664 | |||
562d89540b | |||
500d06d4ea | |||
3e5ec4159d | |||
f517e534e3 | |||
2abb7737fe | |||
9243d1a43e | |||
a94aead136 | |||
b52f02548b | |||
73b7858a95 | |||
46d51faf7d | |||
d720eb238c | |||
8d206ab64f | |||
f88bdc43fe | |||
e0936bd216 | |||
49f28a497d | |||
22801f53d2 | |||
6eef5a07e7 | |||
edbac20968 | |||
550cc08761 | |||
82626a44b8 | |||
ee11fd5795 | |||
3255375325 | |||
99e3b211b1 | |||
99ef0e92ae | |||
23f22158a7 | |||
0f6bcd4701 | |||
e7c86268ba | |||
6a3683b88c | |||
bffaec612c | |||
78175ff62e | |||
b6fcde0c9d | |||
45649e1ab0 | |||
c154e234ba | |||
cfccedde0b | |||
a1a6131f95 | |||
142c22361b | |||
27d80c2b74 | |||
cdc775820f | |||
b19d22b0fc | |||
8a146184ee | |||
7a29d02d74 | |||
ad71502d36 | |||
a73f9828cc | |||
bb5c50abc7 | |||
2763eb9c2e | |||
af511923c6 | |||
da0c0f0583 | |||
4bff3e78cf | |||
470004b152 | |||
472298bb2b | |||
47a564f1dd | |||
452e5bf697 | |||
5730f99080 | |||
e466b300b5 | |||
46f9698c87 | |||
d5b5db5e0b | |||
cbf137dd73 | |||
07ba60e643 | |||
8c75ba1df6 | |||
f5956740c0 | |||
33c204ab54 | |||
d25e5ffd36 | |||
b9adcabe7d | |||
c959146238 | |||
59095d22c3 | |||
2a675eaf25 | |||
2ca3477258 | |||
4a57845c36 |
510
.gitlab-ci.yml
510
.gitlab-ci.yml
@ -1,11 +1,13 @@
|
||||
---
|
||||
|
||||
variables:
|
||||
GIT_SUBMODULE_STRATEGY: recursive
|
||||
MY_PROJECT_ID: "13001358"
|
||||
|
||||
|
||||
include:
|
||||
|
||||
- local: .gitlab/project_docs.gitlab-ci.yml
|
||||
|
||||
- project: nofusscomputing/projects/gitlab-ci
|
||||
ref: development
|
||||
file:
|
||||
@ -13,136 +15,309 @@ include:
|
||||
- template/automagic.gitlab-ci.yaml
|
||||
|
||||
|
||||
|
||||
Get Project Documentation:
|
||||
extends: .fetch_project_docs
|
||||
parallel:
|
||||
matrix:
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: centurion
|
||||
ASSEMBLE_PROJECT_ID: 59504579
|
||||
ASSEMBLE_PROJECT_PATH: projects/ansible/collection/centurion
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: firewall
|
||||
ASSEMBLE_PROJECT_ID: 51640016
|
||||
ASSEMBLE_PROJECT_PATH: projects/ansible/collection/firewall
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: django_template
|
||||
ASSEMBLE_PROJECT_ID: 57560288
|
||||
ASSEMBLE_PROJECT_PATH: projects/centurion_erp
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: kubernetes
|
||||
ASSEMBLE_PROJECT_ID: 51640029
|
||||
ASSEMBLE_PROJECT_PATH: projects/ansible/collection/kubernetes
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: netbox
|
||||
ASSEMBLE_PROJECT_ID: 56568566
|
||||
ASSEMBLE_PROJECT_PATH: projects/ansible/collection/netbox
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: phpipam_scan_agent
|
||||
ASSEMBLE_PROJECT_ID: 55052132
|
||||
ASSEMBLE_PROJECT_PATH: projects/ansible/collection/phpipam_scan_agent
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: gitlab-ci
|
||||
ASSEMBLE_PROJECT_ID: 28543717
|
||||
ASSEMBLE_PROJECT_PATH: projects/gitlab-ci
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: operations
|
||||
ASSEMBLE_PROJECT_ID: 32419575
|
||||
ASSEMBLE_PROJECT_PATH: operations
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: git_configuration
|
||||
ASSEMBLE_PROJECT_ID: 45705596
|
||||
ASSEMBLE_PROJECT_PATH: projects/ansible/roles/git_configuration
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: docker-bind
|
||||
ASSEMBLE_PROJECT_ID: 52098058
|
||||
ASSEMBLE_PROJECT_PATH: projects/docker/bind
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: docker-mail
|
||||
ASSEMBLE_PROJECT_ID: 33611657
|
||||
ASSEMBLE_PROJECT_PATH: projects/docker-mail
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: execution_environment
|
||||
ASSEMBLE_PROJECT_ID: 45741845
|
||||
ASSEMBLE_PROJECT_PATH: projects/ansible/execution_environment
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: ldap_self_service
|
||||
ASSEMBLE_PROJECT_ID: 48321671
|
||||
ASSEMBLE_PROJECT_PATH: projects/ldap_self_service
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: docker-glpi
|
||||
ASSEMBLE_PROJECT_ID: 12928828
|
||||
ASSEMBLE_PROJECT_PATH: projects/glpi
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: kubernetes_monitoring
|
||||
ASSEMBLE_PROJECT_ID: 50510268
|
||||
ASSEMBLE_PROJECT_PATH: projects/kubernetes_monitoring
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: ansible_playbooks
|
||||
ASSEMBLE_PROJECT_ID: 46364551
|
||||
ASSEMBLE_PROJECT_PATH: projects/ansible/playbooks
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: common
|
||||
ASSEMBLE_PROJECT_ID: 52226103
|
||||
ASSEMBLE_PROJECT_PATH: projects/ansible/roles/common
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: homeassistant
|
||||
ASSEMBLE_PROJECT_ID: 51020674
|
||||
ASSEMBLE_PROJECT_PATH: projects/ansible/roles/homeassistant
|
||||
|
||||
- ASSEMBLE_PROJECT_NAME: itil_runbooks
|
||||
ASSEMBLE_PROJECT_ID: 54680811
|
||||
ASSEMBLE_PROJECT_PATH: projects/itil/runbooks
|
||||
|
||||
# - ASSEMBLE_PROJECT_NAME:
|
||||
# ASSEMBLE_PROJECT_ID:
|
||||
# ASSEMBLE_PROJECT_PATH:
|
||||
|
||||
|
||||
Documentation.Lint:
|
||||
rules:
|
||||
- when: never
|
||||
|
||||
|
||||
Documentation.Build:
|
||||
rules:
|
||||
- when: never
|
||||
|
||||
|
||||
Website.Lint:
|
||||
extends: .Lint_Markdown_Docs
|
||||
variables:
|
||||
MDLINT_PATHS: "pages/*.md pages/**/*.md pages/**/**/*.md pages/**/**/**/*.md pages/**/**/**/**/**/*.md #CHANGELOG.md !gitlab-ci !website-template"
|
||||
|
||||
rules:
|
||||
- if: '$JOB_STOP_LINT_MARKDOWN_DOCS'
|
||||
when: never
|
||||
|
||||
- if: # condition_git_tag
|
||||
$CI_COMMIT_TAG != null &&
|
||||
$CI_COMMIT_BRANCH == null
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
when: always
|
||||
|
||||
- if: # condition_master_branch_push
|
||||
$CI_COMMIT_BRANCH == "master" &&
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
when: always
|
||||
|
||||
- if: # condition_dev_branch_push
|
||||
$CI_COMMIT_BRANCH &&
|
||||
(
|
||||
$CI_PIPELINE_SOURCE == "api"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "pipeline"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "schedule"
|
||||
)
|
||||
# See nofusscomputing/projects/gitlab-ci#34 for extra $CI_PIPELINE_SOURCE
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
# No changes check # See nofusscomputing/projects/gitlab-ci#34
|
||||
# changes:
|
||||
# paths:
|
||||
# - '{docs/**,pages/**}/*.md'
|
||||
# compare_to: 'master'
|
||||
when: always
|
||||
|
||||
- if: # condition_not_master_or_dev_push
|
||||
$CI_COMMIT_BRANCH != "master" &&
|
||||
$CI_COMMIT_BRANCH != "development" &&
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md' # works
|
||||
changes:
|
||||
paths:
|
||||
#- '{docs/*,pages/*}*.md'
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
compare_to: 'development'
|
||||
when: always
|
||||
|
||||
- when: never
|
||||
|
||||
|
||||
Website.Build:
|
||||
extends: .MKDocs_Build
|
||||
needs: [ 'Website.Lint' ]
|
||||
resource_group: preperation
|
||||
|
||||
|
||||
Assemble.Website.Prepare:
|
||||
# extends: .MKDocs_Build
|
||||
stage: prepare
|
||||
# image: python:3.7.5-buster
|
||||
# turn mkdocs build template script section to a command template so that customizations can be added.
|
||||
script:
|
||||
- mkdir -p "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/source"
|
||||
# - mkdir -p "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/build"
|
||||
- echo "fetch artifacts from child repo's"
|
||||
- echo "copy static pages source to" "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/source"
|
||||
- echo "copy sub-repo source to (merge)" "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/source"
|
||||
- echo "mkdocs build source dir"
|
||||
# - mkdir -p "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/full-site"
|
||||
- mv "$CI_PROJECT_DIR/artifacts/build/Website.Build/build" "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/"
|
||||
#- ls -laR $CI_PROJECT_DIR
|
||||
# remove ops placeholder index.html
|
||||
|
||||
|
||||
- echo "[DEBUG] fetch operations docs"
|
||||
- 'HTTP_STATUS_FILE=$(curl --location -o /dev/null --silent --head --write-out "%{http_code}" --header "PRIVATE-TOKEN: ${GIT_COMMIT_TOKEN}" "https://gitlab.com/api/v4/projects/32419575/jobs/artifacts/development/download?job=Documentation%2EBuild")'
|
||||
- echo "[DEBUG] HTTP_STATUS_FILE=$HTTP_STATUS_FILE"
|
||||
- |
|
||||
if [ "0$HTTP_STATUS_FILE" != "0200" ]; then
|
||||
echo "[ERROR] Unable to fetch Job Artifacts due to HTTP status of $HTTP_STATUS_FILE";
|
||||
# exit 1;
|
||||
else
|
||||
curl --location --output operations-artifacts.zip --header "PRIVATE-TOKEN: ${GIT_COMMIT_TOKEN}" "https://gitlab.com/api/v4/projects/32419575/jobs/artifacts/development/download?job=Documentation%2EBuild";
|
||||
unzip operations-artifacts.zip;
|
||||
rm -Rf "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/build/operations/index.html";
|
||||
cp -rvf "$CI_PROJECT_DIR/artifacts/build/Documentation.Build/build/operations" "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/build/";
|
||||
rm -Rf "$CI_PROJECT_DIR/artifacts/build/Documentation.Build";
|
||||
fi
|
||||
|
||||
|
||||
- echo "[DEBUG] fetch gitlab-ci project docs"
|
||||
- 'HTTP_STATUS_FILE=$(curl --location -o /dev/null --silent --head --write-out "%{http_code}" --header "PRIVATE-TOKEN: ${GIT_COMMIT_TOKEN}" "https://gitlab.com/api/v4/projects/28543717/jobs/artifacts/development/download?job=Documentation%2EBuild")'
|
||||
- echo "[DEBUG] HTTP_STATUS_FILE=$HTTP_STATUS_FILE"
|
||||
- |
|
||||
if [ "0$HTTP_STATUS_FILE" != "0200" ]; then
|
||||
echo "[ERROR] Unable to fetch Job Artifacts due to HTTP status of $HTTP_STATUS_FILE";
|
||||
# exit 1;
|
||||
else
|
||||
curl --location --output gitlab-ci-artifacts.zip --header "PRIVATE-TOKEN: ${GIT_COMMIT_TOKEN}" "https://gitlab.com/api/v4/projects/28543717/jobs/artifacts/development/download?job=Documentation%2EBuild";
|
||||
unzip gitlab-ci-artifacts.zip;
|
||||
rm -Rf "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/build/projects/gitlab-ci";
|
||||
cp -rvf "$CI_PROJECT_DIR/artifacts/build/Documentation.Build/build/projects/gitlab-ci" "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/build/projects/gitlab-ci/";
|
||||
rm -Rf "$CI_PROJECT_DIR/artifacts/build/Documentation.Build";
|
||||
fi
|
||||
|
||||
|
||||
- echo "[DEBUG] fetch docker-mail project docs"
|
||||
- 'HTTP_STATUS_FILE=$(curl --location -o /dev/null --silent --head --write-out "%{http_code}" --header "PRIVATE-TOKEN: ${GIT_COMMIT_TOKEN}" "https://gitlab.com/api/v4/projects/33611657/jobs/artifacts/development/download?job=Documentation%2EBuild")'
|
||||
- echo "[DEBUG] HTTP_STATUS_FILE=$HTTP_STATUS_FILE"
|
||||
- |
|
||||
if [ "0$HTTP_STATUS_FILE" != "0200" ]; then
|
||||
echo "[ERROR] Unable to fetch Job Artifacts due to HTTP status of $HTTP_STATUS_FILE";
|
||||
# exit 1;
|
||||
else
|
||||
curl --location --output docker-mail-artifacts.zip --header "PRIVATE-TOKEN: ${GIT_COMMIT_TOKEN}" "https://gitlab.com/api/v4/projects/33611657/jobs/artifacts/development/download?job=Documentation%2EBuild";
|
||||
unzip docker-mail-artifacts.zip;
|
||||
rm -Rf "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/build/projects/docker-mail";
|
||||
cp -rvf "$CI_PROJECT_DIR/artifacts/build/Documentation.Build/build/projects/docker-mail" "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/build/projects/docker-mail/";
|
||||
rm -Rf "$CI_PROJECT_DIR/artifacts/build/Documentation.Build";
|
||||
fi
|
||||
|
||||
|
||||
# # below 2 lines commented out as need to ffigure out how to download artifacts.
|
||||
# - rm -Rf "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/build/operations/index.html"
|
||||
# - echo "cp -rvn" "$CI_PROJECT_DIR/artifacts/build/Website.Build/build/operations" "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/build/"
|
||||
|
||||
|
||||
# # copy ops pages into main site, not overwriting
|
||||
# #- cp -rvn "$CI_PROJECT_DIR/artifacts/build/Static Pages/build/"* "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/build/"
|
||||
|
||||
|
||||
# # below line commented out as need to ffigure out how to download artifacts.
|
||||
# - cp -rvf "$CI_PROJECT_DIR/artifacts/build/Website.Build/build/operations" "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/build/"
|
||||
|
||||
- echo "copy prepare files (sitemap, search file) to fullsite (overwrite)"
|
||||
- echo "copy each sub-repo build to fullsite (merge)"
|
||||
# - echo mv "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/full-site" public
|
||||
needs:
|
||||
- 'Website.Build'
|
||||
# only available in gitlab premium
|
||||
# use: - "curl -O --header 'PRIVATE-TOKEN: ${GITLAB_API_TOKEN}' https://gitlab.example.com/api/v4/projects/${PROJECT_A_ID}/jobs/${REMOTE_JOB_ID}/artifacts/${REMOTE_FILENAME}"
|
||||
# - project: nofusscomputing/ops
|
||||
# job: Static Pages
|
||||
# ref: development
|
||||
# artifacts: true
|
||||
artifacts:
|
||||
expire_in: 24 hrs
|
||||
when: always
|
||||
paths:
|
||||
- "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/*"
|
||||
resource_group: preperation
|
||||
resource_group: build
|
||||
rules:
|
||||
- if: '$CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != "master"'
|
||||
|
||||
- if: '$JOB_STOP_MKDOCS_BUILD'
|
||||
when: never
|
||||
|
||||
- if: # condition_git_tag
|
||||
$CI_COMMIT_TAG != null &&
|
||||
$CI_COMMIT_BRANCH == null
|
||||
exists:
|
||||
- 'mkdocs.{yaml,yml}'
|
||||
when: always
|
||||
|
||||
# - if: # condition_master_branch_push
|
||||
# $CI_COMMIT_BRANCH == "master" &&
|
||||
# $CI_PIPELINE_SOURCE == "push"
|
||||
# exists:
|
||||
# - 'mkdocs.{yaml,yml}'
|
||||
# when: always
|
||||
|
||||
- if: # condition_dev_branch_push
|
||||
$CI_COMMIT_BRANCH &&
|
||||
(
|
||||
$CI_PIPELINE_SOURCE == "api"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "pipeline"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "schedule"
|
||||
)
|
||||
# See nofusscomputing/projects/gitlab-ci#34 for extra $CI_PIPELINE_SOURCE
|
||||
exists:
|
||||
- 'mkdocs.{yaml,yml}'
|
||||
# No changes check # See nofusscomputing/projects/gitlab-ci#34
|
||||
# changes:
|
||||
# paths:
|
||||
# - '{docs/**,pages/**}/*.md'
|
||||
# compare_to: 'master'
|
||||
when: always
|
||||
|
||||
- if: # condition_not_master_or_dev_push
|
||||
$CI_COMMIT_BRANCH != "master" &&
|
||||
$CI_COMMIT_BRANCH != "development" &&
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
exists:
|
||||
- 'mkdocs.{yaml,yml}'
|
||||
changes:
|
||||
paths:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
compare_to: 'development'
|
||||
when: always
|
||||
|
||||
- when: never
|
||||
|
||||
|
||||
Merge Project Docs:
|
||||
extends: .merge_project_docs
|
||||
needs:
|
||||
- job: Get Project Documentation
|
||||
artifacts: true
|
||||
- job: Website.Build
|
||||
artifacts: true
|
||||
|
||||
|
||||
|
||||
|
||||
pages:
|
||||
stage: deploy
|
||||
variables:
|
||||
GIT_STRATEGY: none
|
||||
script:
|
||||
- mv "$CI_PROJECT_DIR/artifacts/prepare/Assemble.Website.Prepare/build" public
|
||||
needs: [ 'Assemble.Website.Prepare' ]
|
||||
- |
|
||||
if [ -d "$CI_PROJECT_DIR/artifacts/prepare/Merge.Project.Docs/build" ]; then
|
||||
|
||||
mv "$CI_PROJECT_DIR/artifacts/prepare/Merge.Project.Docs/build" public;
|
||||
|
||||
else
|
||||
|
||||
mv "$CI_PROJECT_DIR/artifacts/build/Website.Build/build" public;
|
||||
|
||||
fi
|
||||
needs:
|
||||
- job: Website.Build
|
||||
artifacts: true
|
||||
- job: 'Merge Project Docs'
|
||||
optional: true
|
||||
environment:
|
||||
name: staging
|
||||
name: Gitlab Pages
|
||||
url: $CI_PAGES_URL
|
||||
resource_group: preperation
|
||||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
rules:
|
||||
- if: '$CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != "master"'
|
||||
# - if: '$CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != "master" && $CI_PIPELINE_SOURCE == "push"'
|
||||
# when: on_success
|
||||
|
||||
# Build docs on tag so they can be downloaded from the tag job and are always available.
|
||||
- if: # condition_git_tag
|
||||
$CI_COMMIT_TAG != null &&
|
||||
$CI_COMMIT_BRANCH == null
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
when: on_success
|
||||
|
||||
- if: # condition_master_branch_push
|
||||
$CI_COMMIT_BRANCH == "master" &&
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
when: on_success
|
||||
|
||||
- if: # condition_dev_branch_push
|
||||
$CI_COMMIT_BRANCH == "development" &&
|
||||
(
|
||||
$CI_PIPELINE_SOURCE == "pipeline"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "schedule"
|
||||
)
|
||||
# See nofusscomputing/projects/gitlab-ci#34 for extra $CI_PIPELINE_SOURCE
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
# No changes check # See nofusscomputing/projects/gitlab-ci#34
|
||||
# changes:
|
||||
# paths:
|
||||
# - '{docs/**,pages/**}/*.md'
|
||||
# compare_to: 'master'
|
||||
when: on_success
|
||||
|
||||
- if: # condition_not_master_or_dev_push
|
||||
$CI_COMMIT_BRANCH != "master" &&
|
||||
$CI_COMMIT_BRANCH != "development" &&
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
changes:
|
||||
paths:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
compare_to: 'development'
|
||||
when: on_success
|
||||
|
||||
- when: never
|
||||
|
||||
|
||||
@ -165,17 +340,63 @@ pages:
|
||||
reports:
|
||||
junit:
|
||||
- "*.junit.xml"
|
||||
resource_group: preperation
|
||||
rules:
|
||||
- if: '$CI_COMMIT_BRANCH'
|
||||
# - if: '$CI_COMMIT_BRANCH && $CI_PIPELINE_SOURCE == "push"'
|
||||
# when: on_success
|
||||
|
||||
# Build docs on tag so they can be downloaded from the tag job and are always available.
|
||||
- if: # condition_git_tag
|
||||
$CI_COMMIT_TAG != null &&
|
||||
$CI_COMMIT_BRANCH == null
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
when: on_success
|
||||
|
||||
- if: # condition_master_branch_push
|
||||
$CI_COMMIT_BRANCH == "master" &&
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
when: on_success
|
||||
|
||||
- if: # condition_dev_branch_push
|
||||
$CI_COMMIT_BRANCH == "development" &&
|
||||
(
|
||||
$CI_PIPELINE_SOURCE == "pipeline"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "schedule"
|
||||
)
|
||||
# See nofusscomputing/projects/gitlab-ci#34 for extra $CI_PIPELINE_SOURCE
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
|
||||
# No changes check # See nofusscomputing/projects/gitlab-ci#34
|
||||
# changes:
|
||||
# paths:
|
||||
# - '{docs/**,pages/**}/*.md'
|
||||
# compare_to: 'master'
|
||||
when: on_success
|
||||
|
||||
- if: # condition_not_master_or_dev_push
|
||||
$CI_COMMIT_BRANCH != "master" &&
|
||||
$CI_COMMIT_BRANCH != "development" &&
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
changes:
|
||||
paths:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
compare_to: 'development'
|
||||
when: on_success
|
||||
|
||||
- when: never
|
||||
|
||||
|
||||
Unit Tests:
|
||||
extends: .Pytest_template
|
||||
needs: [ 'Website.Build' ]
|
||||
resource_group: preperation
|
||||
script:
|
||||
- mv "$CI_PROJECT_DIR/artifacts/build/Website.Build/build" build
|
||||
- pytest --verbose --junitxml=unit_test.junit.xml --tb=line test/unit
|
||||
@ -192,44 +413,18 @@ Unit Tests:
|
||||
# - echo "placeholder job for integration tests" > "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/DETEMEME.txt"
|
||||
|
||||
|
||||
|
||||
.Add_SSHKey: &Add_SSHKey_Before_Script |
|
||||
mkdir -p ~/.ssh
|
||||
chmod 700 ~/.ssh
|
||||
eval $(ssh-agent -s)
|
||||
SSH_KEY_NAME=SSH_PRIVATE_KEY_${ANSIBLE_USER}
|
||||
echo "Debug SSH_KEY_NAME[$SSH_KEY_NAME]"
|
||||
chmod 700 "${!SSH_KEY_NAME}"
|
||||
ssh-add "${!SSH_KEY_NAME}"
|
||||
#update next line so that ca key can be obtained. original source is ansible repo
|
||||
#HOST_SSH_ID=$(cat roles/openssh-server/files/nww-nl/host_ca.pub)
|
||||
HOST_SSH_ID=$(cat ${SSH_HOST_CA})
|
||||
echo DEBUG HOST_SSH_ID[$HOST_SSH_ID]
|
||||
echo "@cert-authority *.networkedweb.com $HOST_SSH_ID" > ~/.ssh/known_hosts
|
||||
chmod 700 ~/.ssh/known_hosts
|
||||
ls -la ~/.ssh
|
||||
|
||||
|
||||
public_website:
|
||||
stage: publish
|
||||
image: debian:buster-slim
|
||||
image: alpine
|
||||
variables:
|
||||
GIT_STRATEGY: none
|
||||
before_script:
|
||||
- if [ "0$ANSIBLE_USER" == "0" ]; then ANSIBLE_USER=deploy; fi
|
||||
- echo Debug ANSIBLE_USER[$ANSIBLE_USER]
|
||||
- apt update
|
||||
- apt install --no-install-recommends -y ssh
|
||||
- ls -la "$CI_PROJECT_DIR/artifacts/prepare/Assemble.Website.Prepare/build"
|
||||
- mv "$CI_PROJECT_DIR/artifacts/prepare/Assemble.Website.Prepare/build" "$CI_PROJECT_DIR/public"
|
||||
- rm -Rf "$CI_PROJECT_DIR/public/build"
|
||||
- ls -la "$CI_PROJECT_DIR"
|
||||
- ls -la "$CI_PROJECT_DIR/public"
|
||||
- *Add_SSHKey_Before_Script
|
||||
- ls -la /html
|
||||
script:
|
||||
- ssh ${ANSIBLE_USER}@${HOST_PUBLIC_WEBSITE} sudo rm -Rf ${PUBLIC_WEBSITE_PATH}/*
|
||||
- scp -r public/* ${ANSIBLE_USER}@${HOST_PUBLIC_WEBSITE}:${PUBLIC_WEBSITE_PATH}
|
||||
needs: [ 'Assemble.Website.Prepare', 'Unit Tests']
|
||||
- rm -rf /html/*
|
||||
- cp -r "$CI_PROJECT_DIR/artifacts/prepare/Merge.Project.Docs/build"/* /html/
|
||||
- ls -laR /html/
|
||||
needs: [ 'Merge Project Docs', 'Unit Tests']
|
||||
resource_group: production
|
||||
environment:
|
||||
name: production
|
||||
@ -238,12 +433,33 @@ public_website:
|
||||
paths:
|
||||
- public
|
||||
rules:
|
||||
- if: '$CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH == "master"'
|
||||
- if: # condition_master_branch_push
|
||||
$CI_COMMIT_BRANCH == "master" &&
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
when: on_success
|
||||
- if: '$CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH == "development" && $CI_PIPELINE_SOURCE != "merge_request_event"'
|
||||
when: manual
|
||||
- if: '$CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != "development" && $CI_COMMIT_BRANCH != "master" && $CI_PIPELINE_SOURCE != "merge_request_event"'
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- when: never
|
||||
|
||||
- if: # condition_dev_branch_push
|
||||
$CI_COMMIT_BRANCH == "development" &&
|
||||
(
|
||||
$CI_PIPELINE_SOURCE == "pipeline"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "schedule"
|
||||
)
|
||||
# See nofusscomputing/projects/gitlab-ci#34 for extra $CI_PIPELINE_SOURCE
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
# No changes check # See nofusscomputing/projects/gitlab-ci#34
|
||||
# changes:
|
||||
# paths:
|
||||
# - '{docs/**,pages/**}/*.md'
|
||||
# compare_to: 'master'
|
||||
allow_failure: true
|
||||
when: manual
|
||||
- when: never
|
||||
tags:
|
||||
- production
|
||||
- website
|
||||
|
162
.gitlab/project_docs.gitlab-ci.yml
Normal file
162
.gitlab/project_docs.gitlab-ci.yml
Normal file
@ -0,0 +1,162 @@
|
||||
---
|
||||
|
||||
# Variables required:
|
||||
# ASSEMBLE_PROJECT_NAME: ''
|
||||
# ASSEMBLE_PROJECT_ID: ''
|
||||
# ASSEMBLE_PROJECT_PATH: ''
|
||||
.fetch_project_docs:
|
||||
stage: chores
|
||||
needs: []
|
||||
|
||||
variables:
|
||||
GIT_STRATEGY: none
|
||||
before_script:
|
||||
- mkdir -p "$CI_PROJECT_DIR/artifacts/project_docs"
|
||||
|
||||
script:
|
||||
- echo "[DEBUG] Fetch Project ${ASSEMBLE_PROJECT_NAME}"
|
||||
|
||||
- 'HTTP_STATUS_FILE=$(curl --location -o /dev/null --silent --head --write-out "%{http_code}" --header "PRIVATE-TOKEN: ${GIT_COMMIT_TOKEN}" "https://gitlab.com/api/v4/projects/${ASSEMBLE_PROJECT_ID}/jobs/artifacts/development/download?job=Documentation%2EBuild")'
|
||||
|
||||
- echo "[DEBUG] HTTP_STATUS_FILE=$HTTP_STATUS_FILE"
|
||||
|
||||
- |
|
||||
if [ "0$HTTP_STATUS_FILE" != "0200" ]; then
|
||||
|
||||
echo "[ERROR] Unable to fetch Job Artifacts due to HTTP status of $HTTP_STATUS_FILE";
|
||||
|
||||
# exit 1;
|
||||
|
||||
else
|
||||
|
||||
curl --location --output artifacts.zip --header "PRIVATE-TOKEN: ${GIT_COMMIT_TOKEN}" "https://gitlab.com/api/v4/projects/${ASSEMBLE_PROJECT_ID}/jobs/artifacts/development/download?job=Documentation%2EBuild";
|
||||
|
||||
unzip artifacts.zip;
|
||||
|
||||
# rm -Rf "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/$CI_JOB_NAME/build/projects/gitlab-ci";
|
||||
|
||||
cp -rvf "$CI_PROJECT_DIR/artifacts/build/Documentation.Build/build/${ASSEMBLE_PROJECT_PATH}" "$CI_PROJECT_DIR/artifacts/project_docs/$(echo -n "${ASSEMBLE_PROJECT_PATH}" | sed -e "s/\//./g")/";
|
||||
|
||||
rm -Rf "$CI_PROJECT_DIR/artifacts/build/Documentation.Build";
|
||||
fi
|
||||
|
||||
artifacts:
|
||||
expire_in: 24 hrs
|
||||
when: always
|
||||
paths:
|
||||
- "$CI_PROJECT_DIR/artifacts/"
|
||||
rules:
|
||||
|
||||
# Docs must always be built for:
|
||||
# - git tag
|
||||
# - dev branch
|
||||
# - master branch
|
||||
- if: # condition_git_tag
|
||||
(
|
||||
$CI_COMMIT_TAG
|
||||
)
|
||||
||
|
||||
(
|
||||
(
|
||||
$CI_COMMIT_BRANCH == "development"
|
||||
||
|
||||
$CI_COMMIT_BRANCH != "master"
|
||||
)
|
||||
&&
|
||||
(
|
||||
$CI_PIPELINE_SOURCE == "pipeline"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "schedule"
|
||||
)
|
||||
)
|
||||
||
|
||||
(
|
||||
$CI_COMMIT_BRANCH == "master"
|
||||
&&
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
)
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
when: always
|
||||
|
||||
- when: never
|
||||
|
||||
|
||||
|
||||
.merge_project_docs:
|
||||
stage: prepare
|
||||
variables:
|
||||
GIT_STRATEGY: none
|
||||
before_script:
|
||||
- mkdir -p $CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/Merge.Project.Docs
|
||||
- mv "$CI_PROJECT_DIR/artifacts/build/Website.Build/build" "$CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/Merge.Project.Docs/"
|
||||
script:
|
||||
|
||||
- ls -l ${CI_PROJECT_DIR}/artifacts/project_docs/
|
||||
|
||||
- | # Merge Project docs to website
|
||||
for i in `ls ${CI_PROJECT_DIR}/artifacts/project_docs/`; do
|
||||
|
||||
echo "Found Path - $i";
|
||||
|
||||
export JOIN_PROJECT_PATH=$(echo -n "${i}" | sed -e "s/\./\//g");
|
||||
|
||||
echo "set as project path [${JOIN_PROJECT_PATH}]";
|
||||
|
||||
rm -Rf $CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/Merge.Project.Docs/build/${JOIN_PROJECT_PATH};
|
||||
|
||||
cp -rvf $CI_PROJECT_DIR/artifacts/project_docs/${i} $CI_PROJECT_DIR/artifacts/$CI_JOB_STAGE/Merge.Project.Docs/build/${JOIN_PROJECT_PATH}/;
|
||||
|
||||
done
|
||||
|
||||
- | # Assemble website and project sources to build search index
|
||||
echo "ToDo: build website and docs together to get the search index to add to the website";
|
||||
|
||||
- | # Join sitemaps together
|
||||
echo "ToDo: Join all Sitemaps together into one";
|
||||
|
||||
artifacts:
|
||||
expire_in: 24 hrs
|
||||
when: always
|
||||
paths:
|
||||
- "$CI_PROJECT_DIR/artifacts/"
|
||||
|
||||
rules:
|
||||
|
||||
# Docs must always be built for:
|
||||
# - git tag
|
||||
# - dev branch
|
||||
# - master branch
|
||||
- if: # condition_git_tag
|
||||
(
|
||||
$CI_COMMIT_TAG
|
||||
)
|
||||
||
|
||||
(
|
||||
(
|
||||
$CI_COMMIT_BRANCH == "development"
|
||||
||
|
||||
$CI_COMMIT_BRANCH != "master"
|
||||
)
|
||||
&&
|
||||
(
|
||||
$CI_PIPELINE_SOURCE == "pipeline"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
||
|
||||
$CI_PIPELINE_SOURCE == "schedule"
|
||||
)
|
||||
)
|
||||
||
|
||||
(
|
||||
$CI_COMMIT_BRANCH == "master"
|
||||
&&
|
||||
$CI_PIPELINE_SOURCE == "push"
|
||||
)
|
||||
exists:
|
||||
- '{docs/**,pages/**}/*.md'
|
||||
when: always
|
||||
|
||||
- when: never
|
Submodule gitlab-ci updated: 3e068f98c5...673441f83a
92
mkdocs.yml
92
mkdocs.yml
@ -2,7 +2,7 @@ INHERIT: website-template/mkdocs.yml
|
||||
|
||||
repo_name: Website
|
||||
repo_url: https://gitlab.com/nofusscomputing/infrastructure/website
|
||||
edit_uri: '/-/ide/project/nofusscomputing/projects/docker-mail/edit/development/-/pages/'
|
||||
edit_uri: '/-/ide/project/nofusscomputing/projects/website/edit/development/-/pages/'
|
||||
|
||||
nav:
|
||||
- Home: index.md
|
||||
@ -11,6 +11,10 @@ nav:
|
||||
|
||||
- articles/index.md
|
||||
|
||||
- 2023:
|
||||
|
||||
- articles/2023/new_website.md
|
||||
|
||||
- 2015:
|
||||
|
||||
- articles/2015/choose_internet_service.md
|
||||
@ -25,12 +29,94 @@ nav:
|
||||
|
||||
- projects/index.md
|
||||
|
||||
- Ansible Roles: projects/ansible-roles/README.md
|
||||
- Ansible:
|
||||
|
||||
- Docker Mail: projects/docker-mail/index.md
|
||||
- projects/ansible/index.md
|
||||
|
||||
- Ansible Execution Environment:
|
||||
|
||||
- projects/ansible/execution_environment/index.md
|
||||
|
||||
- Collections:
|
||||
|
||||
- projects/ansible/collection/index.md
|
||||
|
||||
- Centurion:
|
||||
|
||||
- projects/ansible/collection/centurion/index.md
|
||||
|
||||
- Firewall:
|
||||
|
||||
- projects/ansible/collection/firewall/index.md
|
||||
|
||||
- Kubernetes:
|
||||
|
||||
- projects/ansible/collection/kubernetes/index.md
|
||||
|
||||
- netbox:
|
||||
|
||||
- projects/ansible/collection/netbox/index.md
|
||||
|
||||
- phpIPAM Scan Agent:
|
||||
|
||||
- projects/ansible/collection/phpipam_scan_agent/index.md
|
||||
|
||||
- Playbooks:
|
||||
|
||||
- projects/ansible/playbooks/index.md
|
||||
|
||||
- Roles:
|
||||
|
||||
- projects/ansible/roles/index.md
|
||||
|
||||
- Common:
|
||||
|
||||
- projects/ansible/roles/common/index.md
|
||||
|
||||
- Git Configuration:
|
||||
|
||||
- projects/ansible/roles/git_configuration/index.md
|
||||
|
||||
- Home Assistant:
|
||||
|
||||
- projects/ansible/roles/homeassistant/index.md
|
||||
|
||||
- Testing:
|
||||
|
||||
- projects/ansible/roles/ansible_test/index.md
|
||||
|
||||
- Docker:
|
||||
|
||||
- projects/docker/index.md
|
||||
|
||||
- BIND DNS Server:
|
||||
|
||||
- projects/docker/bind/index.md
|
||||
|
||||
- Docker GLPI:
|
||||
|
||||
- projects/glpi/index.md
|
||||
|
||||
- Docker Mail:
|
||||
|
||||
- projects/docker-mail/index.md
|
||||
|
||||
- Centurion ERP:
|
||||
|
||||
- projects/centurion_erp/index.md
|
||||
|
||||
- Gitlab CI: projects/gitlab-ci/index.md
|
||||
|
||||
- ITIL:
|
||||
|
||||
- Runbooks:
|
||||
|
||||
- projects/itil/runbooks/index.md
|
||||
|
||||
- Kubernetes Monitoring: projects/kubernetes_monitoring/index.md
|
||||
|
||||
- LDAP Self Service: projects/ldap_self_service/index.md
|
||||
|
||||
- Python Gitlab Management: projects/python-gitlab-management/README.md
|
||||
|
||||
- Operations:
|
||||
|
29
pages/articles/2023/new_website.md
Normal file
29
pages/articles/2023/new_website.md
Normal file
@ -0,0 +1,29 @@
|
||||
---
|
||||
title: Site Refurbishment
|
||||
description: it's an update.
|
||||
date: 2023-08-01
|
||||
template: article.html
|
||||
type: blog
|
||||
author: jon
|
||||
copyrightHolder: jon
|
||||
about: https://nofusscomputing.com
|
||||
tags:
|
||||
- Automation
|
||||
- Website
|
||||
- Update
|
||||
---
|
||||
|
||||
It's been a while and for all intents and purposes; Prior to today you would not have been mistaken for thinking that our site was dead in the water. I could give reasons, but the reality is it's an excuse and we all know that *"they're like arseholes, everyones got one!!"* As it currently stands, I find myself with a little extra time on my hands so this site revamp is the start and first visibility of what I've been doing.
|
||||
|
||||
I've spent a good part of a few of a few decades working with computers. Whilst this has been an interesting journey, in the last few years I've discovered Configuration-as-Code. The concept itself wasn't exactly new to me, I just put off learning anything about it past the name. As creatures of habits, us humans, once we have found our way we tend to stick to that routine or better stated, with what we know.
|
||||
Moving from the early days (norton ghost and clonezilla) with manually built images for every different type of machine. which became very monotonous to manually update the images with patches. The opportunity had presented itself resently where for the first time in over two decades, I'm required to rebuild my infrastructre from scratch. As daunting as this sounds, given the leaps and bounds that have occured in the last decade, even more in the last five years. Technologies have evolved to the point where now it takes a fraction of the time to do what used to take upwards of a week. Upgrades now are not rebuild the image from scratch, clone and redeploy. Now, I punch the keyboard and characters show on the screen, then I run a program, Ansible. It reads the jibberish (json/yaml) and presto, Bobs your uncle, a deploy has occured. Fresh deployment or updates, doesn't matter, run the same code again and Ansible ensures it's setup how it's supposed to be. Need to update a piece of software, too easy, change the version number in your config files.
|
||||
|
||||
Other things of note worthy mention:
|
||||
|
||||
- For Family and friends, free of course I host Password vault, <https://vault.nofusscomputing.com>. This enables you to install an app on your phone and within your web browser which lets you sync your passwords, identities and secrets-and using zero-trust full encryption. Best feature of all,you only have to remember your vault password, as everything else is stored in the vault.
|
||||
|
||||
- Helpdesk now deployed publicly, <https://helpdesk.nofusscomputing.com>. Along with automating everything else a Service Catalog is being extended to automate other tasks.
|
||||
|
||||
- Website updating now occurs automagically. We do this via Gitlab using CD/CI pipelines. Now I just edit a file, push the changes and the changes deploy my site on the interwebs.
|
||||
|
||||
- Our [projects](../../projects/index.md) from [GitHub](https://github.com/NoFussComputing) and [GitLab](https://gitlab.com/nofusscomputing) deploy their docs to our site, again automagically.
|
BIN
pages/assets/nfc_revamp.png
Normal file
BIN
pages/assets/nfc_revamp.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 136 KiB |
BIN
pages/assets/nfc_revamp_dark.png
Normal file
BIN
pages/assets/nfc_revamp_dark.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 136 KiB |
@ -8,6 +8,7 @@ hide:
|
||||
- toc
|
||||
---
|
||||
|
||||

|
||||
<div style="background: url(assets/nfc_revamp.png) no-repeat center top; background-size: 282px 90px; width: 100%; height: 120px; display: flex;">
|
||||
<span style="align-self: flex-end; width: 100%; text-align: center; color: #009900; font-weight: bold; font-size: 14pt;">Using Technology to make life easier</span>
|
||||
</div>
|
||||
|
||||
Home Page
|
||||
|
@ -1,5 +0,0 @@
|
||||
# Ansible Roles
|
||||
|
||||
| :red_circle: This page is a placeholder for the ansible-roles repo's docs. |
|
||||
|:---|
|
||||
| _If you can see this page there has been an error, please report the issue on gitlab_ |
|
0
pages/projects/ansible/collection/firewall/index.md
Normal file
0
pages/projects/ansible/collection/firewall/index.md
Normal file
9
pages/projects/ansible/collection/index.md
Normal file
9
pages/projects/ansible/collection/index.md
Normal file
@ -0,0 +1,9 @@
|
||||
---
|
||||
title: Ansible Collections
|
||||
description: No Fuss Computings Ansible Collections
|
||||
date: 2024-02-21
|
||||
template: project.html
|
||||
about: https://gitlab.com/nofusscomputing/projects/ansible
|
||||
---
|
||||
|
||||
This section of the website contains Ansible Collection projects and the details of how to use said projects.
|
0
pages/projects/ansible/collection/netbox/index.md
Normal file
0
pages/projects/ansible/collection/netbox/index.md
Normal file
510
pages/projects/ansible/index.md
Normal file
510
pages/projects/ansible/index.md
Normal file
@ -0,0 +1,510 @@
|
||||
---
|
||||
title: Ansible Projects
|
||||
description: No Fuss Computings Ansible Projects
|
||||
date: 2023-06-01
|
||||
template: project.html
|
||||
about: https://gitlab.com/nofusscomputing/projects/ansible
|
||||
---
|
||||
|
||||
This section of the website contains Ansible projects and the details of how to use said projects. Across All of our Ansible projects we standardize as much as possible.
|
||||
|
||||
Any playbooks and roles we create are designed with the below ansible setup in mind. Whilst there are many ways ~~to skin a cat~~ setup ansible, If you deviate from below you will be required to test to ensure that if using our playbooks/roles, that they work as intended. If you find that there is a better way of setting up Ansible, raise an issue with your proposal and we'll discuss.
|
||||
|
||||
- [No Fuss Computing playbooks](playbooks/index.md)
|
||||
|
||||
- [No Fuss Computing roles](roles/index.md)
|
||||
|
||||
|
||||
## Inventory Setup
|
||||
|
||||
The Inventory should be setup under an SCM, git in this case; So that a version history is maintained. This also fosters a full audit trail as part of the complete host lifecycle. Idealy the Inventory along with directories `files` and `templates.` should be contained in it's own git repository. Using this method provides that the git history only pertain to the inventory alone, and therefore any install/configuration of a host.
|
||||
|
||||
!!! tip
|
||||
If you must include `playbooks` and `roles` wihin your inventory repository it's a good idea that these still be their own repositories with them added to the inventory repository as a git sub-module.
|
||||
|
||||
Ansible inventory directory structure.
|
||||
|
||||
``` bash
|
||||
.
|
||||
├── ansible.cfg
|
||||
├── files
|
||||
│ ├── all
|
||||
│ │ ├──
|
||||
│ │ ├──
|
||||
│ ├── node1
|
||||
│ │ ├──
|
||||
│ │ ├──
|
||||
│ ├── k3s-prod
|
||||
│ │ ├── Ingress-manifest-AWX.yaml
|
||||
│ │ └── deployment-manifest-test_web_server.yaml
|
||||
│ ├── k3s-testing
|
||||
│ └── deployment-manifest-test_web_server.yaml
|
||||
|
|
||||
├── .inventory_root
|
||||
│
|
||||
├── inventory
|
||||
│ ├── development
|
||||
│ │ ├── group_vars
|
||||
│ │ │ ├── all.yaml
|
||||
│ │ │ ├── debian.yaml
|
||||
│ │ ├── hosts.yaml
|
||||
│ │ └── host_vars
|
||||
│ │ ├── laptop2.yaml
|
||||
│ │ ├── node1.yaml
|
||||
│ │ ├── node2.yaml
|
||||
│ │ ├── node3.yaml
|
||||
│ │ ├── node4.yaml
|
||||
│ │ └── node5.yaml
|
||||
│ └── production
|
||||
│ ├── group_vars
|
||||
│ │ ├── all
|
||||
│ │ │ ├── main.yaml
|
||||
│ │ │ ├── vault.yaml
|
||||
│ │ │ └── versions_software.yaml
|
||||
│ │ ├── awx.yaml
|
||||
│ ├── hosts.yaml
|
||||
│ └── host_vars
|
||||
│ ├── node1.yaml
|
||||
│ ├── k3s-prod
|
||||
│ │ ├── backup.yaml
|
||||
│ │ ├── kubernetes.yaml
|
||||
│ │ ├── main.yaml
|
||||
│ │ └── vault.yaml
|
||||
│ ├── k3s-testing
|
||||
│ ├── main.yaml
|
||||
│ └── vault.yaml
|
||||
├── playbooks
|
||||
│ ├── all.yaml
|
||||
├── README.md
|
||||
└── templates
|
||||
├── hosts
|
||||
│ └── k3s-prod
|
||||
│ └── HelmChart-manifest-NginX-ingress.yaml
|
||||
│
|
||||
└── groups
|
||||
```
|
||||
|
||||
| name | Type | Description |
|
||||
|:---|:---:|:---|
|
||||
| ansible.cfg | _file_ | Ansible configuration file applicable to this inventory |
|
||||
| files | _directory_ | Contain files that a host may require. Playbook task iterates over by hostname and group name. Sub-directories for hostname / group-name |
|
||||
| .inventory_root | _file_ | This file is used by `nfc_common` role to determin the root directory of the inventory. |
|
||||
| inventory | _directory_ | Ansible inventory. If multiple inventories exist can use sub folders. |
|
||||
| playbooks | _directory_ | Should be a git submodule. _This keeps inventory and playbooks SCM related to each only._ |
|
||||
| README.md | _file_ | Inventory readme with applicable info. |
|
||||
| templates | _directory_ | This directory is the same as the `files` directory except contains jinja templates. |
|
||||
|
||||
|
||||
### Inventory
|
||||
|
||||
Naming of host inventory files is to use the hostname portion of the FQDN only. i.e. for a host with a FQDN of `myhostname.domain.tld` it's `inventory_hostname` would be `myhostname`. This requirement is a must as many parts of our roles and playbooks depend upon this value matching the DNS system.
|
||||
|
||||
|
||||
#### hosts file
|
||||
|
||||
The hosts file `host.yaml` contains all hosts and by which group they are part of.
|
||||
|
||||
|
||||
### Variable Files
|
||||
|
||||
Preference for variable files is that there is one file per subject. i.e. for the variables for a keycloak deployment, all be in one variable file, and under a directory matching the host/group name.
|
||||
|
||||
|
||||
### Playbooks
|
||||
|
||||
For playbook usage in AWX / Ansible Automation platform, the following changes are required to be made to **all** playbooks:
|
||||
|
||||
- variable `nfc_pb_host` is used for a template survey variable for a host selector for limiting hosts when running a play.
|
||||
|
||||
Example implementaion
|
||||
``` yaml
|
||||
- name: Desktops and Sub-groups
|
||||
hosts: |-
|
||||
{%- if
|
||||
nfc_pb_host is defined
|
||||
and
|
||||
nfc_pb_host in groups.desktops
|
||||
-%}
|
||||
{{ nfc_pb_host }}
|
||||
{%- else -%}
|
||||
{{ groups.desktops }}
|
||||
{%- endif %}
|
||||
```
|
||||
|
||||
!!! warning "Important"
|
||||
The building of the variable is dynamic and must check if the host is part of the group the playbook is for. this ensures that the playbook will only ever run for a host that is part of that group.
|
||||
|
||||
- variable `nfc_pb_kubernetes_cluster_name` is used for a template survey variable for the dynamic building of the cluster group name.
|
||||
|
||||
Example implementaion
|
||||
``` yaml
|
||||
- name: Kubernetes Group and sub-groups
|
||||
hosts: |-
|
||||
{%- if
|
||||
nfc_pb_host is defined
|
||||
and
|
||||
nfc_pb_host in groups.kubernetes
|
||||
-%}
|
||||
{{ nfc_pb_host }}
|
||||
{%- elseif nfc_pb_kubernetes_cluster_name is defined -%}
|
||||
kubernetes_cluster_{{ nfc_pb_kubernetes_cluster_name }}
|
||||
{%- else -%}
|
||||
{{ groups.kubernetes }}
|
||||
{%- endif %}
|
||||
```
|
||||
|
||||
### Templates
|
||||
|
||||
Templates directory contains only two sub-deirectories `groups` and `hosts` under each of these folders are folders by group/host name that contain template files. Preferernece is leaning toards not using the `.j2` extension as the IDE may loose functionality by using.
|
||||
|
||||
Naming of template files is in format `{item-type}-{what-uses}-{friendly name that uses underscores not hyphon}.{file_extension}`
|
||||
|
||||
| Item Type | what uses | Notes
|
||||
|:---|:---:|:---|
|
||||
| config | bind | Configuration file for bind dns server |
|
||||
| dnszone | bind | a bind server DNS zone |
|
||||
| `{kubernetes kind}` | manifest | A kubernetes manifest |
|
||||
|
||||
|
||||
#### Feature gates
|
||||
|
||||
Templates when added to the group folder should be setup with a feature gate. This eanbles simple yaml to be defined to allow the template to deploy.
|
||||
|
||||
example of yaml declaration that host/group would read.
|
||||
``` yaml
|
||||
feature_gates:
|
||||
is_prime: false
|
||||
monitoring: true
|
||||
operator_awx: true
|
||||
operator_grafana: true
|
||||
operator_prometheus: true
|
||||
postgres_cluster: true
|
||||
rook_ceph: true
|
||||
```
|
||||
|
||||
Seting a feature gate on a template is as simple as enclosing the entire contents of the file with a jinja if statement. i.e. `{% if path.feature_gates.monitoring | default(false) | bool %}the content here{% endif %}`
|
||||
|
||||
|
||||
## Playbooks
|
||||
|
||||
Playbooks are used for grouping of hosts and/or groups for a task or set of tasks that are required to be run. All playbooks must return artifacts that exist to serve the purpose of having information on the play that can be used in further automations.
|
||||
|
||||
|
||||
### Artifacts
|
||||
|
||||
The artificates returned are set using the `ansible.builtin.set_stats` module. Prior to setting these facts with the `stats` module they must be set as facts first using the `ansible.builtin.set_fact` module. the latter enables passing of the artifacts via cli and `stats` from within AWX / Ansible Automation Platform.
|
||||
|
||||
!!! tip
|
||||
When setting the artifacts, ensure `per_host=false` is set so that artifacts work within AWX / Ansible Automation Platform.
|
||||
|
||||
Common artifacts structure. **ALL** playbooks must set these variables.
|
||||
|
||||
``` yaml
|
||||
# 'nfc_automation', dict. Global Variable, This is set from within the first playbook
|
||||
# ran and updated as required with the end time updated by the last playbook.
|
||||
nfc_automation:
|
||||
error: 0 # Boolean, 0=no Error, 1=Error occured
|
||||
time:
|
||||
start: "{{ '%Y-%m-%dT%H:%M:%S %z' | strftime }}" # String of date time, set at time of setting 'nfc_automation'
|
||||
end: 0 # String of date time, set when play finished, and updated by subsequent plays
|
||||
# Determin end time of play or duration of play when used with start time, even on error.
|
||||
|
||||
# 'nfc_task', list. every playbook creates its own task dict to add to this list.
|
||||
nfc_task:
|
||||
- name: "glpi"
|
||||
start: "{{ '%Y-%m-%dT%H:%M:%S %z' | strftime }}"
|
||||
tags: "{{ ansible_run_tags }}"
|
||||
|
||||
```
|
||||
|
||||
The above must be set from within every playbook regardless of what else is in the playbooks.
|
||||
|
||||
example playbook to set artifacts and variables
|
||||
|
||||
``` yaml
|
||||
---
|
||||
|
||||
#
|
||||
# Playbook Template
|
||||
#
|
||||
# This playbook template is the base template for All of our playbooks.
|
||||
#
|
||||
# No Fuss Computing <https://nofusscomputing.gitlab.io/projects/ansible/ansible_playbooks/projects/ansible/>
|
||||
#
|
||||
# Requirements:
|
||||
# - ansible >= 2.8
|
||||
#
|
||||
|
||||
- name: Playbook Template
|
||||
hosts: localhost
|
||||
become: false
|
||||
|
||||
|
||||
pre_tasks:
|
||||
|
||||
|
||||
# Play and task set time
|
||||
- name: Set Start Time
|
||||
ansible.builtin.set_fact:
|
||||
nfc_task_starttime: "{{ ('%Y-%m-%dT%H:%M:%S %z' | strftime) | string }}"
|
||||
no_log: "{{ nfc_pb_no_log_setup_facts | default(true) | bool }}"
|
||||
tags:
|
||||
- always
|
||||
|
||||
|
||||
# Setup dictionary 'nfc_automation'
|
||||
- name: Set Automation Facts
|
||||
ansible.builtin.set_fact:
|
||||
nfc_automation: {
|
||||
"time": {
|
||||
"start": "{{ nfc_task_starttime | string }}",
|
||||
"end": 0
|
||||
}
|
||||
}
|
||||
no_log: "{{ nfc_pb_no_log_setup_facts | default(true) | bool }}"
|
||||
when: nfc_automation is not defined
|
||||
tags:
|
||||
- always
|
||||
|
||||
|
||||
# Setup dictionary 'nfc_task'
|
||||
- name: Set Automation Facts
|
||||
ansible.builtin.set_fact:
|
||||
nfc_task: {
|
||||
"name": "{{ ansible_play_name | lower | string }}",
|
||||
"error": 0,
|
||||
"roles": "{{ ansible_play_role_names | string }}",
|
||||
"skip_tags": "{{ ansible_skip_tags | list }}",
|
||||
"start": "{{ nfc_task_starttime | string }}",
|
||||
"tags": "{{ ansible_run_tags | list }}"
|
||||
}
|
||||
no_log: "{{ nfc_pb_no_log_setup_facts | default(true) | bool }}"
|
||||
tags:
|
||||
- always
|
||||
|
||||
|
||||
- name: Block - pre_tasks
|
||||
block:
|
||||
|
||||
|
||||
########################################################################
|
||||
#
|
||||
# Your tasks here
|
||||
#
|
||||
########################################################################
|
||||
|
||||
|
||||
rescue:
|
||||
|
||||
# there was an error, set error object
|
||||
- name: Set error fact
|
||||
ansible.builtin.set_fact:
|
||||
nfc_task: "{{ nfc_task | combine({
|
||||
'error': 1
|
||||
}) }}"
|
||||
no_log: "{{ nfc_pb_no_log_setup_facts | default(true) | bool }}"
|
||||
tags:
|
||||
- always
|
||||
|
||||
|
||||
always:
|
||||
|
||||
|
||||
# Check if error occured and fail task
|
||||
- name: Error Check
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- nfc_task.error | int == 0
|
||||
msg: Error occured, Fail the play run
|
||||
tags:
|
||||
- always
|
||||
|
||||
|
||||
# Don't use the 'roles' section.
|
||||
roles: []
|
||||
# if the included role(s) do not contain a rescue block, the playbook may stop
|
||||
# executing in this section (roles) with the post_tasks not running. This will
|
||||
# cause the artifacts to be incomplete. It's recommended to include your roles
|
||||
# in section(s) 'pre_tasks', 'tasks' or 'post_tasks' and from within a block with
|
||||
# rescue so that the playbook can complete and ensure that all artifacts are set.
|
||||
|
||||
|
||||
tasks:
|
||||
|
||||
|
||||
- name: Block - tasks
|
||||
block:
|
||||
|
||||
# Check for error and fail play on error
|
||||
- name: Error Check
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- nfc_task.error | int == 0
|
||||
msg: Error eccured, follow error path to fail play
|
||||
|
||||
|
||||
########################################################################
|
||||
#
|
||||
# Your tasks here
|
||||
#
|
||||
########################################################################
|
||||
|
||||
rescue:
|
||||
|
||||
|
||||
# there was an error, set error object
|
||||
- name: Set error fact
|
||||
ansible.builtin.set_fact:
|
||||
nfc_task: "{{ nfc_task | combine({
|
||||
'error': 1
|
||||
}) }}"
|
||||
no_log: "{{ nfc_pb_no_log_setup_facts | default(true) | bool }}"
|
||||
tags:
|
||||
- always
|
||||
|
||||
|
||||
always:
|
||||
|
||||
|
||||
# Check if error occured and fail task
|
||||
- name: Error Check
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- nfc_task.error | int == 0
|
||||
msg: Error occured, Fail the play run
|
||||
tags:
|
||||
- always
|
||||
|
||||
|
||||
post_tasks:
|
||||
|
||||
- name: Tasks post_task
|
||||
block:
|
||||
|
||||
|
||||
# Check for error and fail play on error
|
||||
- name: Error Check
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- nfc_task.error | int == 0
|
||||
msg: Error occured, follow error path to fail play
|
||||
tags:
|
||||
- always
|
||||
|
||||
|
||||
########################################################################
|
||||
#
|
||||
# Your tasks here
|
||||
#
|
||||
########################################################################
|
||||
|
||||
|
||||
rescue:
|
||||
|
||||
|
||||
# there was an error, set error object
|
||||
- name: Set error fact
|
||||
ansible.builtin.set_fact:
|
||||
nfc_task: "{{ nfc_task | combine({
|
||||
'error': 1
|
||||
}) }}"
|
||||
no_log: "{{ nfc_pb_no_log_setup_facts | default(true) | bool }}"
|
||||
tags:
|
||||
- always
|
||||
|
||||
|
||||
always:
|
||||
|
||||
|
||||
# Task and automation end time.
|
||||
- name: Fetch End time
|
||||
ansible.builtin.set_fact:
|
||||
nfc_task_endtime: "{{ '%Y-%m-%dT%H:%M:%S %z' | strftime }}"
|
||||
no_log: "{{ nfc_pb_no_log_setup_facts | default(true) | bool }}"
|
||||
tags:
|
||||
- always
|
||||
|
||||
|
||||
# Set task end time
|
||||
- name: Set task Facts
|
||||
ansible.builtin.set_fact:
|
||||
nfc_tasks: "{{ nfc_tasks | default([]) + [ nfc_task | combine({
|
||||
'end': nfc_task_endtime | string
|
||||
}) ] }}"
|
||||
no_log: "{{ nfc_pb_no_log_setup_facts | default(true) | bool }}"
|
||||
tags:
|
||||
- always
|
||||
|
||||
|
||||
# Set Automation end time.
|
||||
# every playbook must set this variable so that the end time
|
||||
# is equal to the fail time or the end of a group of playbooks.
|
||||
- name: Set automation end time
|
||||
ansible.builtin.set_fact:
|
||||
nfc_automation: "{{ nfc_automation | combine({
|
||||
'time': nfc_automation.time | combine({
|
||||
'end': nfc_task_endtime | string
|
||||
})
|
||||
}) }}"
|
||||
nfc_task_endtime: null
|
||||
no_log: "{{ nfc_pb_no_log_setup_facts | default(true) | bool }}"
|
||||
tags:
|
||||
- always
|
||||
|
||||
|
||||
# Set the artifacts as a fact for subsequent playbook useage
|
||||
# Note: variable 'per_host' must be 'false' so that the artifacts
|
||||
# work within AWX / Ansible Automation Platform.
|
||||
- name: Create Automation Artifact
|
||||
ansible.builtin.set_stats:
|
||||
data:
|
||||
nfc_automation: "{{ nfc_automation }}"
|
||||
nfc_tasks: "{{ nfc_tasks }}"
|
||||
per_host: false
|
||||
tags:
|
||||
- always
|
||||
|
||||
|
||||
# Final error check to fail the entire play run on error
|
||||
- name: Error Check
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- nfc_task.error | int == 0
|
||||
msg: Error occured, Fail the play run
|
||||
tags:
|
||||
- always
|
||||
|
||||
|
||||
vars: {}
|
||||
|
||||
|
||||
```
|
||||
|
||||
The above template playbook is designed for post automation should it be required to run. `nfc_automation` is for the entire play/workflow with `nfc_tasks` being a list of `nfc_task` dictionary from each playbook. `nfc_task` is there for you to add your own artifacts to and without any additional effort from you, will be added to the global artifacts.
|
||||
|
||||
|
||||
### Playbook Variables
|
||||
|
||||
Within any playbook that we create any variable that is set within the playbook is to be prefixed with `nfc_pb_`. Currently we have the following variables that are reserved and set as part of how we structure our playbooks.
|
||||
|
||||
- `nfc_automation` Details on the play/run. see artifacts above for details.
|
||||
|
||||
- `nfc_pb_no_log_setup_facts` Boolean value used as a feature gate on whether to log `set_fact` tasks that are for setting up the play. i.e. artifacts. setting this value to `false` will caused the tasks to be logged.
|
||||
|
||||
- `nfc_tasks` List of all `nfc_task` dictionaries of the play. see artifacts above for details.
|
||||
|
||||
|
||||
## AWX / Tower / Automation Platform
|
||||
|
||||
|
||||
### Prime host
|
||||
|
||||
If you use a system like AWX / Tower / Automation Platform the inventory should be designed in a way that you have a prime host. The prime host is a single host that once it exists, it's capable of rebuilding all of the infrastructure within the inventory. Using the prime host method, you only require the variable secrets (vault encrypted) of the prime host and only those pertinent to rebuilding the prime host. This should only be the backup decryption key (vault encrypted).
|
||||
|
||||
!!! warning Warning
|
||||
Prime Host requires that the backup decryption key be updated within the inventory whenever it changes. There is also a requirement that the vault encryption key be available and not stored on infrastructure that without or that infrastructure not existing you cant access the vault key. i.e. password manager.
|
||||
|
||||
|
||||
## ToDo
|
||||
|
||||
- Explain usage of file `.inventory_root` which must exist as nfc_common _(todo: see kubernetes playbook/master)_ _may no longer be required a project structure is known along with using variable `playbook_dir`_
|
0
pages/projects/ansible/playbooks/index.md
Normal file
0
pages/projects/ansible/playbooks/index.md
Normal file
0
pages/projects/ansible/roles/ansible_test/index.md
Normal file
0
pages/projects/ansible/roles/ansible_test/index.md
Normal file
0
pages/projects/ansible/roles/common/index.md
Normal file
0
pages/projects/ansible/roles/common/index.md
Normal file
0
pages/projects/ansible/roles/homeassistant/index.md
Normal file
0
pages/projects/ansible/roles/homeassistant/index.md
Normal file
77
pages/projects/ansible/roles/index.md
Normal file
77
pages/projects/ansible/roles/index.md
Normal file
@ -0,0 +1,77 @@
|
||||
---
|
||||
title: Ansible Roles
|
||||
description: No Fuss Computings Ansible Roles Projects
|
||||
date: 2023-11-10
|
||||
template: project.html
|
||||
about: https://gitlab.com/nofusscomputing/projects/ansible
|
||||
---
|
||||
|
||||
This section of the website contains Ansible roles and the details of how to use said projects. Across All of our Ansible roles we standardize as much as possible. This document will contain the details of said standardization.
|
||||
|
||||
|
||||
Our roles:
|
||||
|
||||
- Common
|
||||
|
||||
- Docker Management
|
||||
|
||||
- Git Configuration
|
||||
|
||||
- [Home Assistant](homeassistant/index.md)
|
||||
|
||||
- SSH
|
||||
|
||||
|
||||
## Role Requirements
|
||||
|
||||
This section covers what by default, be part of all ansible roles we create.
|
||||
|
||||
|
||||
=== "ansible.builtin.set_stats"
|
||||
|
||||
As part of the role, setting of ansible stats with `ansible.builtin.set_stats` must be provided. This enables a single variable that can be used after the play has completed. Usage of a role that includes the usage of `ansible.builtin.set_stats` within AWX enables population of the artifacts and passing of the stats between workflows/job templates.
|
||||
|
||||
|
||||
```yaml
|
||||
- name: Stat Values
|
||||
ansible.builtin.set_fact:
|
||||
stat_values: |
|
||||
{
|
||||
"host_{{ inventory_hostname | replace('.', '_') | replace('-', '_') }}": {
|
||||
"roles": {
|
||||
role_name: {
|
||||
"enabled": true,
|
||||
"installed": false,
|
||||
"empty_list": [],
|
||||
"empty_dict": {}
|
||||
}
|
||||
},
|
||||
playbooks: {
|
||||
"{{ inventory_hostname }}": "here"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- name: Create Final Stats not Per Host
|
||||
ansible.builtin.set_stats:
|
||||
data: "{{ stat_values | from_yaml }}"
|
||||
per_host: false
|
||||
aggregate: true
|
||||
|
||||
- name: Clear Stat Values
|
||||
ansible.builtin.set_fact:
|
||||
stat_values: null
|
||||
```
|
||||
|
||||
- `Stat Values` is only required if the variable names require expansion. _Can be omitted if no variable expansion required for variable name._
|
||||
|
||||
- `Create Final Stats not Per Host` sets the artifacts/stats.
|
||||
|
||||
- `Clear Stat Values` remove the stat fact. only required if using `Stat Values`.
|
||||
|
||||
!!! tip AWX Gotcha
|
||||
AWX requires that `per_host` be set to `false` when setting stats for artifacts to work. Hence the structure of the artifacts above use hostname prefixed with `host_`. This method enables programatic checking if by host due to the presence of `host_` in the dictionary name.
|
||||
|
||||
=== "Variable naming"
|
||||
|
||||
- All Role Variables to be prefixed with the role name.
|
0
pages/projects/centurion_erp/index.md
Normal file
0
pages/projects/centurion_erp/index.md
Normal file
0
pages/projects/docker/bind/index.md
Normal file
0
pages/projects/docker/bind/index.md
Normal file
0
pages/projects/docker/index.md
Normal file
0
pages/projects/docker/index.md
Normal file
5
pages/projects/glpi/index.md
Normal file
5
pages/projects/glpi/index.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Docker GLPI
|
||||
|
||||
| :red_circle: This page is a placeholder for the python-gitlab-management repo's docs. |
|
||||
|:---|
|
||||
| _If you can see this page there has been an error, please report the issue on gitlab_ |
|
5
pages/projects/itil/runbooks/index.md
Normal file
5
pages/projects/itil/runbooks/index.md
Normal file
@ -0,0 +1,5 @@
|
||||
# ITIL Runbooks
|
||||
|
||||
| :red_circle: This page is a placeholder for the python-gitlab-management repo's docs. |
|
||||
|:---|
|
||||
| _If you can see this page there has been an error, please report the issue on gitlab_ |
|
5
pages/projects/kubernetes_monitoring/index.md
Normal file
5
pages/projects/kubernetes_monitoring/index.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Docker GLPI
|
||||
|
||||
| :red_circle: This page is a placeholder for the python-gitlab-management repo's docs. |
|
||||
|:---|
|
||||
| _If you can see this page there has been an error, please report the issue on gitlab_ |
|
0
pages/projects/ldap_self_service/index.md
Normal file
0
pages/projects/ldap_self_service/index.md
Normal file
@ -91,18 +91,20 @@ class Data:
|
||||
|
||||
if 'gitlab.com/-/ide/project' not in url: # ignore gitlab ide links
|
||||
|
||||
link = self.parse_url(url)
|
||||
if 'nofusscomputing.com' not in url: # ignore gitlab ide links
|
||||
|
||||
hyperlink_source_file = {'name': source_file, 'location': link_location}
|
||||
link = self.parse_url(url)
|
||||
|
||||
if link['url_id'] in data['hyperlinks']:
|
||||
hyperlink_source_file = {'name': source_file, 'location': link_location}
|
||||
|
||||
data['hyperlinks'][link['url_id']]['source_files'].append(hyperlink_source_file)
|
||||
if link['url_id'] in data['hyperlinks']:
|
||||
|
||||
else:
|
||||
data['hyperlinks'][link['url_id']]['source_files'].append(hyperlink_source_file)
|
||||
|
||||
link['source_files'] = [ hyperlink_source_file ]
|
||||
data['hyperlinks'][link['url_id']] = link
|
||||
else:
|
||||
|
||||
link['source_files'] = [ hyperlink_source_file ]
|
||||
data['hyperlinks'][link['url_id']] = link
|
||||
|
||||
|
||||
events = [self.process_browser_log_entry(entry) for entry in self.driver.get_log('performance')]
|
||||
|
@ -13,7 +13,11 @@ class Test:
|
||||
|
||||
|
||||
def setup_method(self):
|
||||
pass
|
||||
self.ignore_url_alive_check = {
|
||||
'gitlab.com': [
|
||||
'nofusscomputing/infrastructure/website/-/new/development'
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
@ -36,12 +40,29 @@ class Test:
|
||||
packages.urllib3.disable_warnings(category=InsecureRequestWarning)
|
||||
|
||||
request = get(data['url'], verify=False)
|
||||
skip_test = False
|
||||
|
||||
print(str(data) + str(request.status_code))
|
||||
|
||||
assert request.status_code == 200, (
|
||||
f"Hyperlink [{data['url_id']}] to location [{data['url']}] failed,"
|
||||
f"with status [{request.status_code}].")
|
||||
|
||||
if data['domain'] in self.ignore_url_alive_check:
|
||||
if data['request_path'] in self.ignore_url_alive_check[data['domain']]:
|
||||
skip_test = True
|
||||
|
||||
|
||||
if not skip_test:
|
||||
|
||||
assert (
|
||||
request.status_code == 200
|
||||
or
|
||||
request.status_code == 401
|
||||
or
|
||||
request.status_code == 403
|
||||
), (
|
||||
f"Hyperlink [{data['url_id']}] to location [{data['url']}] failed,"
|
||||
f"with status [{request.status_code}].")
|
||||
else:
|
||||
assert True
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
|
Submodule website-template updated: 4ea7ab29be...8735f623dc
Reference in New Issue
Block a user