consolidate ansible setup into roles dir

This commit is contained in:
Nick Sweeting 2024-09-17 00:48:47 -07:00
parent 25db6826ec
commit c55cd46ecb
No known key found for this signature in database
27 changed files with 763 additions and 91 deletions

View file

@ -0,0 +1,58 @@
#!/usr/bin/env ansible-playbook
---
# - name: "Install using apt/brew/pkg/yum/etc."
# hosts: localhost
# gather_facts: no
# vars:
# DATA_DIR: '/Volumes/NVME/Users/squash/Code/archiveboxes/archivebox7/data4'
# LIB_DIR: '{{DATA_DIR}}/lib'
# LIB_DIR_BIN: '{{LIB_DIR}}/bin'
# state: 'present'
# install_packages: {}
# # bash:
# # packages: ['bash']
# PACKAGE_BINPROVIDERS: {}
# PACKAGE_BINARIES: {}
# BINPROVIDERS: {}
# tasks:
# - package: update_cache=yes
# when: ansible_facts['os_family'] == "Debian"
- name: Make sure lib folders exist
file:
path: '{{LIB_DIR_BIN}}'
state: directory
recurse: true
when: BINPROVIDERS.ansible_package is not defined
- name: Get ansible binary abspath
command: 'which ansible'
register: ANSIBLE_INSTALLER_ABSPATH_FULL
changed_when: false
when: BINPROVIDERS.ansible_package is not defined
###################################################################################
- name: "Install system packages: {{all_packages}}"
ansible.builtin.package:
name: "{{item}}"
state: "{{state}}"
loop: "{{all_packages}}"
###################################################################################
- set_fact:
PACKAGE_BINPROVIDERS:
ansible_package:
installer_abspath: "{{ANSIBLE_INSTALLER_ABSPATH_FULL.stdout}}"
installer_version: "{{ansible_version.full}}"
PATH: "/opt/homebrew/bin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
when: BINPROVIDERS.ansible_package is not defined
- set_fact:
BINPROVIDERS: "{{ BINPROVIDERS | default({}) | combine(PACKAGE_BINPROVIDERS) }}"
cacheable: true
when: BINPROVIDERS.ansible_package is not defined
- debug:
msg: "{{ {'BINPROVIDERS': BINPROVIDERS} }}"

View file

@ -0,0 +1,5 @@
DATA_DIR: '{{playbook_dir}}'
LIB_DIR: '{{DATA_DIR}}/lib'
LIB_DIR_BIN: '{{LIB_DIR}}/bin'
state: present
all_packages: []

View file

@ -0,0 +1,31 @@
---
argument_specs:
main:
short_description: Load a specified binary from the environment/PATH into BINARIES fact.
options:
name:
type: "str"
required: true
description: "A string key for the binary"
bin_name:
type: "str"
required: false
description: "The basename of the binary file (optional, defaults to name)"
abspath:
type: "str"
required: false
description: "An absolute path to the binary (overrides any auto-detected one)"
version_cmd:
type: "str"
required: false
description: "The command to run to get the binary's version (optional, defaults to $ <bin_name> --version)"
PATH:
type: "str"
required: false
description: "The PATH to search for the binary (optional, defaults to environment $PATH)"

View file

@ -0,0 +1,73 @@
---
- name: Make sure ./data/lib/bin folder exists
file:
path: '{{LIB_DIR_BIN}}'
state: directory
recurse: true
###################################################################################
- set_fact:
PATH: "{{PATH or DEFAULT_PATH}}"
bin_name: "{{bin_name or name}}"
BINARY_ABSPATH: null
BINARY_VERSION: null
- name: 'Get installed binary abspath: {{name}}'
command: 'env PATH="{{PATH}}:$PATH" which {{bin_name}}'
register: BINARY_ABSPATH
changed_when: BINARIES[name].abspath|default('NO VERSION FOUND') not in BINARY_ABSPATH.stdout
- set_fact:
bin_name: "{{BINARY_ABSPATH.stdout|basename or bin_name}}"
- set_fact:
version_cmd: "{{version_cmd or (bin_name + ' --version')}}"
- name: 'Get installed binary version: {{name}}'
command: 'env PATH="{{PATH}}:$PATH" {{version_cmd}}'
register: BINARY_VERSION
changed_when: BINARIES[name].version|default('NO VERSION FOUND') not in BINARY_VERSION.stdout
- name: 'Updating BINARIES with loaded abspaths & versions: {{name}}'
set_fact:
BINARIES: "{{ BINARIES
| default({})
| combine({
name: {
'name': name,
'bin_name': bin_name,
'version_cmd': version_cmd,
'symlink': LIB_DIR_BIN + '/' + name,
'abspath': BINARY_ABSPATH.stdout or abspath or None,
'version': BINARY_VERSION.stdout_lines|first|regex_replace('^.*?([\\d+\\.]+).*$', '\\1') or version or None,
'version_stdout': BINARY_VERSION.stdout or BINARY_VERSION.stderr,
'PATH': BINARY_ABSPATH.stdout|dirname or PATH,
},
})
}}"
cacheable: true
when: BINARY_ABSPATH.stdout and BINARY_VERSION.stdout
- name: 'Symlink installed binary into lib bin folder: {{name}}'
file:
src: "{{ BINARY_ABSPATH.stdout }}"
dest: "{{ LIB_DIR_BIN }}/{{ name }}"
state: link
force: true
when: BINARY_ABSPATH.stdout and BINARY_VERSION.stdout
changed_when: False
- debug:
msg:
- '{{BINARIES}}'
- name: Unset variables
set_fact:
name:
bin_name:
version_cmd:
PATH:
BINARY_ABSPATH:
BINARY_VERSION:

View file

@ -0,0 +1,11 @@
DATA_DIR: '{{playbook_dir}}'
LIB_DIR: '{{DATA_DIR}}/lib'
LIB_DIR_BIN: '{{LIB_DIR}}/bin'
DEFAULT_PATH: /bin
name:
bin_name:
version_cmd:
PATH:
abspath:
version:

View file

@ -0,0 +1,31 @@
---
argument_specs:
main:
short_description: Main entry point for the npm role
options:
state:
type: "str"
required: false
default: 'present'
description:
- "The desired state: present | latest"
npm_packages:
type: "list"
elements: "dict"
required: false
default: []
description: "A list of dicts with a defined structure and with default a value."
options:
key:
type: "str"
required: true
description: "A string name for the dependency"
packages:
type: "list"
elements: "str"
required: true
description: "What npm packages to install for the given dependency."

View file

@ -0,0 +1,59 @@
---
- name: Make sure lib folders exist
file:
path: '{{item}}'
state: directory
recurse: true
loop:
- '{{LIB_DIR_NPM_BIN}}'
- '{{LIB_DIR_BIN}}'
- name: "Install system packages: [node, npm]"
ansible.builtin.package:
name: "node"
state: "present"
- name: Load NPM and Node binaries
include_role:
name: load_binary
vars:
name: '{{item}}'
loop:
- node
- npm
- name: Check that installed Node version matches expected version
assert:
that:
- BINARIES.node.version is version(MIN_NODE_VERSION, '>=')
- BINARIES.npm.version is version(MIN_NPM_VERSION, '>=')
quiet: true
###################################################################################
# - name: "Install npm packages: {{install_npm}}"
# community.general.npm:
# name: '{{item}}'
# state: "{{state}}"
# path: '{{LIB_DIR_NPM}}'
# loop: "{{install_npm|dictsort|map(attribute='1')|map(attribute='packages')|flatten}}"
###################################################################################
###################################################################################
- set_fact:
NODE_BINPROVIDERS:
npm:
installer_abspath: "{{BINARIES.npm.abspath}}"
installer_version: "{{BINARIES.npm.version}}"
PATH: "{{LIB_DIR_NPM_BIN}}"
lib_dir_npm: "{{LIB_DIR_NPM}}"
- set_fact:
BINPROVIDERS: "{{ BINPROVIDERS | default({}) | combine(NODE_BINPROVIDERS) }}"
cacheable: true
- debug:
msg: "{{ {'BINARIES': BINARIES, 'BINPROVIDERS': BINPROVIDERS} }}"

View file

@ -0,0 +1,7 @@
DATA_DIR: '{{playbook_dir}}'
LIB_DIR: '{{DATA_DIR}}/lib'
LIB_DIR_BIN: '{{LIB_DIR}}/bin'
LIB_DIR_NPM: '{{LIB_DIR}}/npm'
LIB_DIR_NPM_BIN: '{{LIB_DIR_NPM}}/node_modules/.bin'
MIN_NODE_VERSION: '20.0.0'
MIN_NPM_VERSION: '10.0.0'

View file

@ -0,0 +1,31 @@
---
argument_specs:
main:
short_description: Main entry point for the npm role
options:
state:
type: "str"
required: false
default: 'present'
description:
- "The desired state: present | latest"
npm_packages:
type: "list"
elements: "dict"
required: false
default: []
description: "A list of dicts with a defined structure and with default a value."
options:
key:
type: "str"
required: true
description: "A string name for the dependency"
packages:
type: "list"
elements: "str"
required: true
description: "What npm packages to install for the given dependency."

View file

@ -0,0 +1,59 @@
---
- name: Make sure lib folders exist
file:
path: '{{item}}'
state: directory
recurse: true
loop:
- '{{LIB_DIR_PIP}}'
- '{{LIB_DIR_BIN}}'
when: BINPROVIDERS.pip is not defined
- name: Load Python and Pip binaries
import_role:
name: load_binary
vars:
name: '{{item}}'
loop:
- python
- pip
when: BINARIES.python is not defined or BINARIES.pip is not defined
- assert:
that:
- BINARIES.python.version is version(MIN_PYTHON_VERSION, '>=')
- BINARIES.pip.version is version(MIN_PIP_VERSION, '>=')
quiet: true
when: BINPROVIDERS.pip is not defined
###################################################################################
# - name: "Install pip packages: {{install_pip}}"
# ansible.builtin.pip:
# name: '{{item}}'
# state: "{{state}}"
# virtualenv: '{{LIB_DIR_PIP}}/venv'
# virtualenv_python: "{{BINARIES.python.abspath}}"
# virtualenv_site_packages: yes
# loop: "{{install_pip|dictsort|map(attribute='1')|map(attribute='packages')|flatten}}"
###################################################################################
- set_fact:
PIP_BINPROVIDERS:
pip:
installer_abspath: "{{BINARIES.pip.abspath}}"
installer_version: "{{BINARIES.pip.version}}"
PATH: "{{LIB_DIR_PIP_BIN}}"
virtualenv: "{{LIB_DIR_PIP}}/venv"
virtualenv_python: "{{BINARIES.python.abspath}}"
when: BINPROVIDERS.pip is not defined
- set_fact:
BINPROVIDERS: "{{ BINPROVIDERS | default({}) | combine(PIP_BINPROVIDERS) }}"
cacheable: true
when: BINPROVIDERS.pip is not defined
- debug:
msg: "{{ {'BINARIES': BINARIES, 'BINPROVIDERS': BINPROVIDERS} }}"

View file

@ -0,0 +1,7 @@
DATA_DIR: '{{playbook_dir}}'
LIB_DIR: '{{DATA_DIR}}/lib'
LIB_DIR_BIN: '{{LIB_DIR}}/bin'
LIB_DIR_PIP: '{{LIB_DIR}}/pip'
LIB_DIR_PIP_BIN: '{{LIB_DIR_PIP}}/venv/bin'
MIN_PYTHON_VERSION: '3.10.0'
MIN_PIP_VERSION: '22.0'