diff --git a/knowledge base/ansible.md b/knowledge base/ansible.md
index cad9e72..1dfd105 100644
--- a/knowledge base/ansible.md
+++ b/knowledge base/ansible.md
@@ -188,12 +188,12 @@ Galaxy collections and roles worth a check:
UIs:
-| UI | Static inventories | Dynamic inventories |
-| ----------- | ------------------ | ------------------- |
-| [AWX] | ✓ | ✓ |
-| [Rundeck] | ✓ | ? |
-| [Semaphore] | ✓ | ✗ |
-| [Zuul] | ? | ? |
+| UI | Static inventories | Dynamic inventories |
+| -------------- | ------------------ | ------------------- |
+| [AWX] | ✓ | ✓ |
+| [Rundeck] | ✓ | ? |
+| [Semaphore UI] | ✓ | ✗ |
+| [Zuul] | ? | ? |
## Configuration
@@ -534,17 +534,21 @@ Return a boolean result.
Refer [Asynchronous actions and polling].
-Used to avoid connection timeouts and to run tasks concurrently.
+Useful for:
-Executing tasks in the background will return a Job ID that can be polled for information about that task.
+- Avoiding connection timeouts.
+- Running **independent** tasks concurrently.
+
+Tasks executing in asynchronous mode will return a Job ID that can be polled for information about that task.
Polling keeps the connection to the remote node open between polls.
Use the `async` keyword in playbook tasks.
Leaving it off makes tasks run synchronously, which is Ansible's default.
+> [!warning]
> As of Ansible 2.3, `async` does **not** support check mode and tasks using it **will fail** when run in check mode.
-Asynchronous tasks will create temporary async job cache file (in `~/.ansible_async/` by default).
+Asynchronous tasks will create temporary async job cache files (in `~/.ansible_async/` by default).
When asynchronous tasks complete **with** polling enabled, the related temporary async job cache file is automatically
removed. This does **not** happen for tasks that do **not** use polling.
@@ -575,9 +579,9 @@ Asynchronous playbook tasks **always** return changed.
### Run tasks in parallel
Use `async` with `poll` set to _0_.
-When `poll` is _0_, Ansible starts the task and immediately moves on to the next one with**out** waiting for a result
+When `poll` is _0_, Ansible starts the task, then immediately moves on to the next one with**out** waiting for a result
from the first.
-Each asynchronous task runs until it either completes, fails or times out (running longer than the value set for its
+Each asynchronous task runs until it either completes, fails, or times out (running longer than the value set for its
`async`). Playbook runs end with**out** checking back on asynchronous tasks.
```yaml
@@ -589,11 +593,11 @@ Each asynchronous task runs until it either completes, fails or times out (runni
poll: 0
```
-Operations requiring exclusive locks, such as YUM transactions, will make successive operations that require those files
-wait or fail.
+Operations requiring exclusive locks, such as YUM transactions, will make successive operations that require those same
+files wait or fail.
-Synchronize asynchronous tasks by registering them to obtain their job ID and using it with the `async_status` module in
-later tasks:
+Synchronize asynchronous tasks by registering them to obtain their job ID, and using it with the `async_status` module
+in later tasks:
```yaml
- tasks:
@@ -705,9 +709,9 @@ $ ANSIBLE_STDOUT_CALLBACK='json' ansible-playbook --inventory='localhost,' 'loca
## Handlers
-Blocks and `import_tasks` tend to make the handlers unreachable.
+Using blocks and `import_tasks` for handlers tends to make the handlers inside them unreachable.
-Instead of using blocks, give the same listen string to all involved handlers:
+Instead of using blocks, give the same `listen` key to all involved handlers:
```diff
- - name: Block name
@@ -724,7 +728,7 @@ Instead of using blocks, give the same listen string to all involved handlers:
+ …
```
-Instead of using `ìmport_tasks`, use `include_tasks`:
+Instead of using `import_tasks`, use `include_tasks`:
```diff
- name: First task
@@ -787,7 +791,7 @@ In playbooks:
message: some message
```
-Role assignments can**not** be parallelized at the time of writing.
+Roles are applied in order, and can**not** be parallelized at the time of writing.
### Role dependencies
@@ -819,7 +823,8 @@ See [Creating your own Ansible filter plugins].
## Execution environments
-Container images that can be used as Ansible control nodes.
+Container images that can be used as Ansible control nodes.
+Refer [Getting started with Execution Environments].
Prefer using `ansible-navigator` to `ansible-runner` for local runs as the latter is a pain in the ass to use directly.
@@ -926,6 +931,9 @@ collections:
Refer [Ansible Navigator documentation].
+Command-line tool and text-based user interface for creating, reviewing, running and troubleshooting Ansible content,
+including inventories, playbooks, collections, documentation and container images (execution environments).
+
Settings for Navigator can be provided, in order of priority from **highest** to lowest:
1. On the command line.
@@ -1015,7 +1023,7 @@ ansible-navigator … exec -- printenv | sort
## Secrets management
-Refer [handling secrets in your Ansible playbooks].
+Refer [Handling secrets in your Ansible playbooks].
Use **interactive prompts** to ask for values at runtime.
@@ -1033,8 +1041,7 @@ Use **interactive prompts** to ask for values at runtime.
line: "API_KEY={{ api_key }}"
```
-Use [Ansible Vault] for automated execution when one does **not** require
-to use specific secrets or password managers.
+Use [Ansible Vault] for automated execution when one does **not** require using specific secrets or password managers.
### Ansible Vault
@@ -1077,18 +1084,18 @@ Provide the Vault's password:
; ask_vault_pass = True
```
- Should the password file be executable, Ansible will execute it and use its output as the password for Vault.
- This works well to integrate with CLI-capable password managers:
+Should the password file be executable, Ansible will execute it, then use its output as the password for Vault.
+This works well to integrate with CLI-capable password managers:
- ```sh
- # File 'password_file.sh'
+```sh
+# File 'password_file.sh'
- # Gopass
- gopass show -o 'ansible/vault'
+# Gopass
+gopass show -o 'ansible/vault'
- # Bitwarden CLI
- # bw login --check >/dev/null && bw get password 'ansible vault'
- ```
+# Bitwarden CLI
+# bw login --check >'/dev/null' && bw get password 'ansible vault'
+```
Vault passwords can be any string, and there is currently no special command to create one.
One must provide the/a Vault password **every time one encrypts and/or decrypts data** with Vault.
@@ -1678,30 +1685,33 @@ Another _better (?)_ solution in playbooks/roles would be to sanitize the input
[awx]: awx.md
[integrate with aws ssm]: cloud%20computing/aws/ssm.md#integrate-with-ansible
-[rundeck]: rundeck.md
+[Rundeck]: rundeck.md
+[Semaphore UI]: semaphoreui.md
+
[examples]: ../examples/ansible/
[examples templating]: ../examples/ansible/templating.yml
-[8 ways to speed up your ansible playbooks]: https://www.redhat.com/sysadmin/faster-ansible-playbook-execution
+[8 ways to speed up your Ansible playbooks]: https://www.redhat.com/sysadmin/faster-ansible-playbook-execution
[ansible galaxy user guide]: https://docs.ansible.com/ansible/latest/galaxy/user_guide.html
[ansible navigator documentation]: https://ansible.readthedocs.io/projects/navigator/
[ansible runner]: https://ansible.readthedocs.io/projects/runner/en/stable/
[ansible v2.14 changelog]: https://github.com/ansible/ansible/blob/7bb078bd740fba8ad43cc69e18fc8aeb4719180a/changelogs/CHANGELOG-v2.14.rst#id11
[asynchronous actions and polling]: https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_async.html
[automating helm using ansible]: https://www.ansible.com/blog/automating-helm-using-ansible
-[blocks]: https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_blocks.html
+[Blocks]: https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_blocks.html
[collections index]: https://docs.ansible.com/ansible/latest/collections/index.html
[configuration]: https://docs.ansible.com/ansible/latest/reference_appendices/config.html
[debugging tasks]: https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_debugger.html
[defining variables at runtime]: https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_variables.html#defining-variables-at-runtime
[developing and testing ansible roles with molecule and podman - part 1]: https://www.ansible.com/blog/developing-and-testing-ansible-roles-with-molecule-and-podman-part-1/
-[execution environment definition]: https://ansible.readthedocs.io/projects/builder/en/stable/definition/
-[galaxy sivel.toiletwater]: https://galaxy.ansible.com/ui/repo/published/sivel/toiletwater/
-[galaxy]: https://galaxy.ansible.com/
-[introduction to ansible builder]: https://www.ansible.com/blog/introduction-to-ansible-builder/
+[Execution environment definition]: https://ansible.readthedocs.io/projects/builder/en/stable/definition/
+[Galaxy sivel.toiletwater]: https://galaxy.ansible.com/ui/repo/published/sivel/toiletwater/
+[Galaxy]: https://galaxy.ansible.com/
+[Getting started with Execution Environments]: https://docs.ansible.com/ansible/latest/getting_started_ee/index.html
+[Introduction to Ansible Builder]: https://www.ansible.com/blog/introduction-to-ansible-builder/
[patterns: targeting hosts and groups]: https://docs.ansible.com/ansible/latest/inventory_guide/intro_patterns.html
[protecting sensitive data with ansible vault]: https://docs.ansible.com/ansible/latest/vault_guide/index.html
[roles]: https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html
@@ -1722,10 +1732,10 @@ Another _better (?)_ solution in playbooks/roles would be to sanitize the input
[ansible vault with awx]: https://medium.com/t%C3%BCrk-telekom-bulut-teknolojileri/ansible-vault-with-awx-80b603617798
[ansible: set variable to file content]: https://stackoverflow.com/questions/24003880/ansible-set-variable-to-file-content
[check if a list contains an item in ansible]: https://stackoverflow.com/questions/28080145/check-if-a-list-contains-an-item-in-ansible/28084746
-[creating your own ansible filter plugins]: https://www.dasblinkenlichten.com/creating-ansible-filter-plugins/
-[easy things you can do to speed up ansible]: https://mayeu.me/post/easy-things-you-can-do-to-speed-up-ansible/
+[Creating your own Ansible filter plugins]: https://www.dasblinkenlichten.com/creating-ansible-filter-plugins/
+[Easy things you can do to speed up ansible]: https://mayeu.me/post/easy-things-you-can-do-to-speed-up-ansible/
[edit .ini file in other servers using ansible playbook]: https://syslint.com/blog/tutorial/edit-ini-file-in-other-servers-using-ansible-playbook/
-[handling secrets in your ansible playbooks]: https://www.redhat.com/sysadmin/ansible-playbooks-secrets
+[Handling secrets in your Ansible playbooks]: https://www.redhat.com/sysadmin/ansible-playbooks-secrets
[how can i hide skipped tasks output in ansible]: https://stackoverflow.com/questions/39189549/how-can-i-hide-skipped-tasks-output-in-ansible#76147924
[how can i pass variable to ansible playbook in the command line?]: https://stackoverflow.com/questions/30662069/how-can-i-pass-variable-to-ansible-playbook-in-the-command-line#30662156
[how to append to lists]: https://blog.crisp.se/2016/10/20/maxwenzin/how-to-append-to-lists-in-ansible
@@ -1734,13 +1744,13 @@ Another _better (?)_ solution in playbooks/roles would be to sanitize the input
[how to recursively set directory and file permissions]: https://superuser.com/questions/1024677/ansible-how-to-recursively-set-directory-and-file-permissions#1317715
[how to run ansible with_fileglob in alphabetical order?]: https://stackoverflow.com/questions/59162054/how-to-run-ansible-with-fileglob-in-alpabetical-order#59162339
[how to set up and use python virtual environments for ansible]: https://www.redhat.com/sysadmin/python-venv-ansible
-[how to speed up ansible playbooks drastically?]: https://www.linkedin.com/pulse/how-speed-up-ansible-playbooks-drastically-lionel-gurret
+[How to speed up Ansible playbooks drastically?]: https://www.linkedin.com/pulse/how-speed-up-ansible-playbooks-drastically-lionel-gurret
[how to use ansible with s3 - ansible aws_s3 examples]: https://www.middlewareinventory.com/blog/ansible-aws_s3-example/
[how to work with lists and dictionaries in ansible]: https://www.redhat.com/sysadmin/ansible-lists-dictionaries-yaml
[human-readable output format]: https://www.shellhacks.com/ansible-human-readable-output-format/
[include task only if file exists]: https://stackoverflow.com/questions/28119521/ansible-include-task-only-if-file-exists#comment118578470_62289639
[is it possible to use inline templates?]: https://stackoverflow.com/questions/33768690/is-it-possible-to-use-inline-templates#33783423
-[jinja2 templating]: https://jinja.palletsprojects.com/en/3.1.x/templates/
+[jinja2 templating]: https://jinja.palletsprojects.com/en/stable/templates/
[looping over lists inside of a dict]: https://www.reddit.com/r/ansible/comments/1b28dtm/looping_over_lists_inside_of_a_dict/
[merging two dictionaries by key in ansible]: https://serverfault.com/questions/1084157/merging-two-dictionaries-by-key-in-ansible#1084164
[mitogen for ansible]: https://mitogen.networkgenomics.com/ansible_detailed.html
@@ -1748,10 +1758,9 @@ Another _better (?)_ solution in playbooks/roles would be to sanitize the input
[only do something if another action changed]: https://raymii.org/s/tutorials/Ansible_-_Only-do-something-if-another-action-changed.html
[removing empty values from a list and assigning it to a new list]: https://stackoverflow.com/questions/60525961/ansible-removing-empty-values-from-a-list-and-assigning-it-to-a-new-list#60526774
[running your ansible playbooks in parallel and other strategies]: https://toptechtips.github.io/2023-06-26-ansible-parallel/
-[semaphore]: https://semaphoreui.com/
[unique filter of list in jinja2]: https://stackoverflow.com/questions/44329598/unique-filter-of-list-in-jinja2
[what is the exact list of ansible setup min?]: https://stackoverflow.com/questions/71060833/what-is-the-exact-list-of-ansible-setup-min#71061125
-[why ansible and python fork break on macos high sierra+ and how to solve]: https://ansiblepilot.medium.com/why-ansible-and-python-fork-break-on-macos-high-sierra-and-how-to-solve-d11540cd2a1b
+[Why Ansible and Python fork break on macOS High Sierra+ and how to solve]: https://ansiblepilot.medium.com/why-ansible-and-python-fork-break-on-macos-high-sierra-and-how-to-solve-d11540cd2a1b
[windows playbook example]: https://geekflare.com/ansible-playbook-windows-example/
[working with versions]: https://docs.ansible.com/ansible/latest/collections/community/general/docsite/filter_guide_working_with_versions.html
[yes and no, true and false]: https://chronicler.tech/red-hat-ansible-yes-no-and/
diff --git a/knowledge base/rundeck.md b/knowledge base/rundeck.md
index b8be9f2..7a0bd11 100644
--- a/knowledge base/rundeck.md
+++ b/knowledge base/rundeck.md
@@ -39,7 +39,7 @@ Refer [Integrate with Ansible].
[ansible]: ansible.md
-[docker-compose.yml]: ../containers/rundeck/docker-compose.yml
+[docker-compose.yml]: ../docker%20compositions/rundeck/docker-compose.yml
[basic exhibit]: https://github.com/rundeck/docker-zoo/blob/master/basic/