Files
dc-deployments-automation/roles/product_install/tasks/main.yml

208 lines
6.2 KiB
YAML

---
- name: Check for existing version cache file
stat:
path: "{{ atl_product_version_cache }}"
register: cached
# Case: File exists, always use its value
- name: Use version for product version
block:
- name: Read cached version from file
command: "cat {{ atl_product_version_cache }}"
register: atl_product_version_file
changed_when: false
- name: Set the local var to cached version
set_fact:
atl_cached_version: "{{ atl_product_version_file.stdout }}"
when: cached.stat.exists
- name: Determine if requested version is 'latest'
set_fact:
version_is_latest: "{{ atl_product_version is undefined or
not atl_product_version or
atl_product_version == 'latest' }}"
# Case: File doesn't exist and no version has been set; find latest.
- name: Fetch and cache latest version when no override
block:
- name: Fetch the latest edition version
include_tasks: "{{ atl_product_edition }}_version_latest.yml"
when: not cached.stat.exists and version_is_latest
######################################################################
# Version logic:
#
# At this point we have 3 values (possibly empty):
#
# * atl_product_version (supplied)
# * atl_cached_version
# * atl_latest_version
#
# If no cached value, use the supplied value or 'latest' if unset.
#
# If a cached file exists, and the requested version is 'latest' (or
# unset), cache wins.
#
# If a version is set, then it is honoured _if_ it is higher than the
# cached value (i.e. upgrade path).
- name: "Case: Version is latest"
block:
- name: "Case: Cached version exists, has precedence over 'latest'"
set_fact:
atl_download_version: "{{ atl_cached_version }}"
when: cached.stat.exists
- name: "Case: No cached version, use latest"
set_fact:
atl_download_version: "{{ atl_latest_version }}"
when: not cached.stat.exists
when: version_is_latest
- name: "Case: Version is not latest"
block:
- name: "Case: No cached version, or but supplied is higher; use supplied"
set_fact:
atl_download_version: "{{ atl_product_version }}"
when: (not cached.stat.exists) or
atl_product_version is version(atl_cached_version, '>')
- name: "Case: Cached version is higher, ignore supplied"
set_fact:
atl_download_version: "{{ atl_cached_version }}"
when: cached.stat.exists and
atl_product_version is version(atl_cached_version, '<=')
when: not version_is_latest
- name: "Fallthrough guard: Use cached or supplied version if nothing set"
set_fact:
atl_download_version: "{{ atl_cached_version or atl_product_version }}"
when: atl_download_version is not defined or
atl_download_version|length == 0
- name: Override the supplied version with the calculated one
set_fact:
atl_product_version: "{{ atl_download_version }}"
######################################################################
- name: Perform any additional per-edition version setup
include_tasks: "{{ atl_product_edition }}_extra_tasks.yml"
- name: Create installation directories
file:
path: "{{ item }}"
state: directory
mode: 0750
owner: "{{ atl_product_user }}"
group: "{{ atl_product_user }}"
with_items:
- "{{ atl_installer_temp }}"
- "{{ atl_product_home }}"
- "{{ atl_product_installation_versioned }}"
- "{{ atl_product_version_cache_dir }}"
- "{{ atl_product_home_shared_download_dir }}"
changed_when: false # For Molecule idempotence check
# At this point atl_product_version should be set, cache if necessary.
- name: Write override cached version when specified
template:
src: version.j2
dest: "{{ atl_product_version_cache }}"
force: true
# For the first run a temp binary should be downloaded but moved to shared home to ensure all subsequent nodes have access
# to the same specific version binary.
# To prevent a race condition with multiple downloads at the same time a directory is used as a lockfile (atomic operation).
- name: Assume temp binary should be downloaded
set_fact:
download_binary: yes
# Check for product installer in home_shared and lockdir to determine if it needs to be downloaded again.
- name: Check download lock directory exists
stat:
path: "{{ atl_product_home_shared_download_lockdir }}"
register: download_lockdir
- name: Check for presence of product installer in home_shared
stat:
path: "{{ atl_product_home_shared_download }}"
register: home_shared_downloaded
# If binary exists and lockdir exists use this binary instead
- name: Check Lock Directory and binary exists on shared_home
set_fact:
download_binary: no
when:
- home_shared_downloaded.stat.exists
- download_lockdir.stat.isdir is defined
- download_lockdir.stat.isdir
# If the binary was never installed, download it
- name: "Download product installer and move to shared directory"
block:
- name: Fetch product installer
get_url:
url: "{{ atl_product_download_url }}"
dest: "{{ atl_product_download }}"
mode: 0755
force: false
register: atl_product_downloaded
- name: Remove lockdir to prevent nodes relying on binary when copying
file:
path: "{{ atl_product_home_shared_download_lockdir }}"
state: absent
when: atl_product_downloaded is succeeded
register: lockdir_removed
- name: Copy temp installer to home_shared
copy:
src: "{{ atl_product_download }}"
dest: "{{ atl_product_home_shared_download }}"
remote_src: yes
when: lockdir_removed is succeeded
register: copied
- name: Delete old temp installer
file:
path: "{{ atl_product_download }}"
state: absent
when: copied is succeeded
register: temp_deleted
- name: Create lockdir once product installer downloaded and moved
file:
path: "{{ atl_product_home_shared_download_lockdir }}"
state: directory
when: temp_deleted is succeeded
when: download_binary
- name: Unpack the downloaded application depending on format
include_tasks: "unpack_{{ atl_download_format }}.yml"
- name: Symlink the installed version to current
file:
src: "{{ atl_product_installation_versioned }}"
dest: "{{ atl_product_installation_current }}"
state: link
force: true