From 3188c5742f2fbbf34e1fa7ca3d39e784a34c1984 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C5=A1o=20Stanovnik?= Date: Thu, 3 Jun 2021 16:10:00 +0200 Subject: [PATCH] Remove the use of `vars` and `hostvars` wherever possible. `vars` operates inconsistently in different combinations of Ansible (full/base/core) and Python versions. Variables are now instead explicitly loaded under a subkey, which also removes the need for filtering and makes access more explicit and semantic. --- roles/generate_readme/templates/readme.j2 | 10 +-- roles/install_demo/tasks/job_template.yml | 74 +++++++++++------------ roles/install_demo/tasks/load_vars.yml | 5 +- roles/install_demo/tasks/main.yml | 19 +++--- roles/install_demo/tasks/workflow.yml | 14 ++--- 5 files changed, 63 insertions(+), 59 deletions(-) diff --git a/roles/generate_readme/templates/readme.j2 b/roles/generate_readme/templates/readme.j2 index 99ba7a3..fbde842 100644 --- a/roles/generate_readme/templates/readme.j2 +++ b/roles/generate_readme/templates/readme.j2 @@ -30,7 +30,7 @@ ansible-playbook playbooks/install_demo.yml -e @choose_demo.yml # Demo Repository -This repository currently holds {{hostvars[inventory_hostname].items()|rejectattr('0', 'match', 'ansible_')|selectattr('1.name', 'defined')|sort(attribute='1.name')|count}} demos. +This repository currently holds {{job_template_definitions.items()|sort(attribute='1.name')|count}} demos. ## Infrastructure Demos @@ -42,7 +42,7 @@ This repository currently holds {{hostvars[inventory_hostname].items()|rejectatt -{% for key, value in hostvars[inventory_hostname].items()|rejectattr('0', 'match', 'ansible_')|selectattr('1.name', 'defined')|selectattr('1.category', 'match', 'infrastructure$')|sort(attribute='1.name') %} +{% for key, value in job_template_definitions.items()|selectattr('1.category', 'match', 'infrastructure$')|sort(attribute='1.name') %} @@ -65,7 +65,7 @@ This repository currently holds {{hostvars[inventory_hostname].items()|rejectatt -{% for key, value in hostvars[inventory_hostname].items()|rejectattr('0', 'match', 'ansible_')|selectattr('1.name', 'defined')|selectattr('1.category', 'match', 'network$')|sort(attribute='1.name') %} +{% for key, value in job_template_definitions.items()|selectattr('1.category', 'match', 'network$')|sort(attribute='1.name') %} @@ -87,7 +87,7 @@ This repository currently holds {{hostvars[inventory_hostname].items()|rejectatt -{% for key, value in hostvars[inventory_hostname].items()|rejectattr('0', 'match', 'ansible_')|selectattr('1.name', 'defined')|selectattr('1.category', 'match', 'security$')|sort(attribute='1.name') %} +{% for key, value in job_template_definitions.items()|selectattr('1.category', 'match', 'security$')|sort(attribute='1.name') %} @@ -109,7 +109,7 @@ This repository currently holds {{hostvars[inventory_hostname].items()|rejectatt -{% for key, value in hostvars[inventory_hostname].items()|rejectattr('0', 'match', 'ansible_')|selectattr('1.name', 'defined')|selectattr('1.category', 'match', 'developer$')|sort(attribute='1.name') %} +{% for key, value in job_template_definitions.items()|selectattr('1.category', 'match', 'developer$')|sort(attribute='1.name') %} diff --git a/roles/install_demo/tasks/job_template.yml b/roles/install_demo/tasks/job_template.yml index 040d55d..5a5c7c0 100644 --- a/roles/install_demo/tasks/job_template.yml +++ b/roles/install_demo/tasks/job_template.yml @@ -1,11 +1,11 @@ --- - name: add tower project awx.awx.tower_project: - name: "{{ vars[demo].project.name }}" - description: "{{ vars[demo].project.description }}" - organization: "{{ vars[demo].project.organization }}" - scm_type: "{{ vars[demo].project.scm_type }}" - scm_url: "{{ vars[demo].project.scm_url }}" + name: "{{ job_template_definitions[demo].project.name }}" + description: "{{ job_template_definitions[demo].project.description }}" + organization: "{{ job_template_definitions[demo].project.organization }}" + scm_type: "{{ job_template_definitions[demo].project.scm_type }}" + scm_url: "{{ job_template_definitions[demo].project.scm_url }}" tower_username: "{{ my_tower_username }}" tower_password: "{{ my_tower_password }}" tower_host: "{{ my_tower_host }}" @@ -14,58 +14,58 @@ - name: show values debug: msg: - - "name: {{ vars[demo].name }}" - - "description: {{ vars[demo].description }}" - - "job_type: {{ vars[demo].job_type }}" - - "inventory: {{ vars[demo].inventory }}" - - "project: {{ vars[demo].project.name }}" - - "playbook: {{ vars[demo].playbook }}" - - "fact_caching_enabled: {{ vars[demo].fact_caching_enabled | default('false') }}" - - "credential: {{ vars[demo].credential }}" - - "survey_enabled: {{ vars[demo].survey_enabled | default('false') }}" + - "name: {{ job_template_definitions[demo].name }}" + - "description: {{ job_template_definitions[demo].description }}" + - "job_type: {{ job_template_definitions[demo].job_type }}" + - "inventory: {{ job_template_definitions[demo].inventory }}" + - "project: {{ job_template_definitions[demo].project.name }}" + - "playbook: {{ job_template_definitions[demo].playbook }}" + - "fact_caching_enabled: {{ job_template_definitions[demo].fact_caching_enabled | default('false') }}" + - "credential: {{ job_template_definitions[demo].credential }}" + - "survey_enabled: {{ job_template_definitions[demo].survey_enabled | default('false') }}" - name: add single job template without survey awx.awx.tower_job_template: - name: "{{ vars[demo].name }}" - description: "{{ vars[demo].description }}" - job_type: "{{ vars[demo].job_type }}" - inventory: "{{ vars[demo].inventory }}" - project: "{{ vars[demo].project.name }}" - playbook: "{{ vars[demo].playbook }}" - fact_caching_enabled: "{{ vars[demo].fact_caching_enabled | default('false') }}" - credential: "{{ vars[demo].credential }}" - survey_enabled: "{{ vars[demo].survey_enabled }}" + name: "{{ job_template_definitions[demo].name }}" + description: "{{ job_template_definitions[demo].description }}" + job_type: "{{ job_template_definitions[demo].job_type }}" + inventory: "{{ job_template_definitions[demo].inventory }}" + project: "{{ job_template_definitions[demo].project.name }}" + playbook: "{{ job_template_definitions[demo].playbook }}" + fact_caching_enabled: "{{ job_template_definitions[demo].fact_caching_enabled | default('false') }}" + credential: "{{ job_template_definitions[demo].credential }}" + survey_enabled: "{{ job_template_definitions[demo].survey_enabled }}" tower_username: "{{ my_tower_username }}" tower_password: "{{ my_tower_password }}" tower_host: "{{ my_tower_host }}" validate_certs: false when: - - workshop_type in vars[demo].workshop_type - - not vars[demo].survey_enabled + - workshop_type in job_template_definitions[demo].workshop_type + - not job_template_definitions[demo].survey_enabled register: add_job_template until: add_job_template is not failed retries: 5 - name: add single job template with survey awx.awx.tower_job_template: - name: "{{ vars[demo].name }}" - description: "{{ vars[demo].description }}" - job_type: "{{ vars[demo].job_type }}" - inventory: "{{ vars[demo].inventory }}" - project: "{{ vars[demo].project.name }}" - playbook: "{{ vars[demo].playbook }}" - fact_caching_enabled: "{{ vars[demo].fact_caching_enabled | default('false') }}" - credential: "{{ vars[demo].credential }}" - survey_enabled: "{{ vars[demo].survey_enabled }}" - survey_spec: "{{ vars[demo].survey_spec }}" + name: "{{ job_template_definitions[demo].name }}" + description: "{{ job_template_definitions[demo].description }}" + job_type: "{{ job_template_definitions[demo].job_type }}" + inventory: "{{ job_template_definitions[demo].inventory }}" + project: "{{ job_template_definitions[demo].project.name }}" + playbook: "{{ job_template_definitions[demo].playbook }}" + fact_caching_enabled: "{{ job_template_definitions[demo].fact_caching_enabled | default('false') }}" + credential: "{{ job_template_definitions[demo].credential }}" + survey_enabled: "{{ job_template_definitions[demo].survey_enabled }}" + survey_spec: "{{ job_template_definitions[demo].survey_spec }}" tower_username: "{{ my_tower_username }}" tower_password: "{{ my_tower_password }}" tower_host: "{{ my_tower_host }}" validate_certs: false when: - - workshop_type in vars[demo].workshop_type - - vars[demo].survey_enabled + - workshop_type in job_template_definitions[demo].workshop_type + - job_template_definitions[demo].survey_enabled register: add_job_template until: add_job_template is not failed retries: 5 diff --git a/roles/install_demo/tasks/load_vars.yml b/roles/install_demo/tasks/load_vars.yml index c6657ab..0c9d557 100644 --- a/roles/install_demo/tasks/load_vars.yml +++ b/roles/install_demo/tasks/load_vars.yml @@ -2,7 +2,8 @@ - name: include all demo vars from install_demo roll include_vars: dir: "vars" + name: job_template_definitions -- name: will load vars from adjacent vars +- name: will load vars debug: - msg: "variables loaded from install_demo role" + msg: "variables loaded from install_demo role into job_template_definitions" diff --git a/roles/install_demo/tasks/main.yml b/roles/install_demo/tasks/main.yml index 2663f86..6c1abf7 100644 --- a/roles/install_demo/tasks/main.yml +++ b/roles/install_demo/tasks/main.yml @@ -1,21 +1,24 @@ --- +- name: explicitly load vars under a subkey for reliable access + include_tasks: load_vars.yml + - name: set facts from role vars set_fact: - demo_list: "{{ (dict(vars|dictsort|rejectattr('0', 'match', 'ansible_')|selectattr('1.name', 'defined')|selectattr('1.workshop_type', 'defined'))|dict2items)|map(attribute='key')|list }}" - full_demo_info: "{{ (dict(vars|dictsort|rejectattr('0', 'match', 'ansible_')|selectattr('1.name', 'defined')|selectattr('1.workshop_type', 'defined'))|dict2items) }}" + demo_list: "{{ ( job_template_definitions|map(attribute='key')|list }}" + full_demo_info: "{{ job_template_definitions|dict2items) }}" - name: provide info to terminal window debug: msg: - - "install {{ vars.demo }} on {{ my_tower_host }}" + - "install {{ demo }} on {{ my_tower_host }}" - "total demos: {{ demo_list | length }}" - "available demos are: {{ demo_list }}" - name: make sure demo is a valid demo assert: that: - - vars.demo is defined - - vars.demo in demo_list or vars.demo == "all" + - demo is defined + - demo in demo_list or demo == "all" msg: - "demo must be defined and be one of: {{ demo_list }}" - "full list can be found on https://github.com/ansible/product-demos" @@ -35,11 +38,11 @@ include_tasks: job_template.yml when: - demo != "all" - - vars[demo].workflow is not defined or not vars[demo].workflow + - job_template_definitions[demo].workflow is not defined or not job_template_definitions[demo].workflow - name: install single workflow include_tasks: workflow.yml when: - demo != "all" - - vars[demo].workflow is defined - - vars[demo].workflow + - job_template_definitions[demo].workflow is defined + - job_template_definitions[demo].workflow diff --git a/roles/install_demo/tasks/workflow.yml b/roles/install_demo/tasks/workflow.yml index 7e50a83..9affbcd 100644 --- a/roles/install_demo/tasks/workflow.yml +++ b/roles/install_demo/tasks/workflow.yml @@ -1,16 +1,16 @@ --- # these tasks will install a workflow -- name: "install all job templates in relation to workflow {{ hostvars[inventory_hostname][demo].name }}" +- name: "install all job templates in relation to workflow {{ job_template_definitions[demo].name }}" include_tasks: add_job_template.yml - loop: "{{ hostvars[inventory_hostname][demo].job_templates|dict2items }}" + loop: "{{ job_template_definitions[demo].job_templates|dict2items }}" -- name: "install workflow template {{ hostvars[inventory_hostname][demo].name }}" +- name: "install workflow template {{ job_template_definitions[demo].name }}" awx.awx.tower_workflow_template: - name: "{{ hostvars[inventory_hostname][demo].name }}" - description: "{{ hostvars[inventory_hostname][demo].description }}" - organization: "{{ hostvars[inventory_hostname][demo].organization }}" - schema: "{{ hostvars[inventory_hostname][demo].schema }}" + name: "{{ job_template_definitions[demo].name }}" + description: "{{ job_template_definitions[demo].description }}" + organization: "{{ job_template_definitions[demo].organization }}" + schema: "{{ job_template_definitions[demo].schema }}" tower_username: "{{ my_tower_username }}" tower_password: "{{ my_tower_password }}" tower_host: "{{ my_tower_host }}"
Video Walkthrough Workshop Types
{% if value.readme is defined%}{{value.name}}{% else %}{{value.name}}{% endif %} {{value.author}}Video Walkthrough Workshop Types
{{ value.name }} {{ value.author }}
demo: {{key }}
Video Walkthrough Workshop Types
{{ value.name }} {{ value.author }}
demo: {{ key }}
Video Walkthrough Workshop Types
{{ value.name }} {{ value.author }}
demo: {{ key }}