From 56b851ea1bc0030c3ee612588c00b1172305540e Mon Sep 17 00:00:00 2001 From: Nick Sweeting Date: Fri, 13 Sep 2024 04:55:40 -0700 Subject: [PATCH] more ansible playbooks improvements --- archivebox/playbooks/install_all.yml | 8 ++ archivebox/playbooks/install_npm.yml | 83 +++++++++------------ archivebox/playbooks/install_package.yml | 20 +++-- archivebox/playbooks/install_pip.yml | 14 +--- archivebox/playbooks/install_singlefile.yml | 53 +++++++------ archivebox/playbooks/install_ytdlp.yml | 3 + archivebox/playbooks/load_binaries.yml | 31 ++++++-- 7 files changed, 111 insertions(+), 101 deletions(-) create mode 100644 archivebox/playbooks/install_all.yml diff --git a/archivebox/playbooks/install_all.yml b/archivebox/playbooks/install_all.yml new file mode 100644 index 00000000..03caa6e3 --- /dev/null +++ b/archivebox/playbooks/install_all.yml @@ -0,0 +1,8 @@ +--- +- import_playbook: install_ytdlp.yml + vars: + state: 'latest' + +- import_playbook: install_singlefile.yml + vars: + state: 'latest' diff --git a/archivebox/playbooks/install_npm.yml b/archivebox/playbooks/install_npm.yml index 57d94450..b2326d66 100644 --- a/archivebox/playbooks/install_npm.yml +++ b/archivebox/playbooks/install_npm.yml @@ -1,4 +1,21 @@ --- + +- import_playbook: install_package.yml + vars: + state: 'latest' + install_packages: + node: + bin_name: 'node' + packages: ['node'] + when: BINARIES.node is not defined + +- import_playbook: load_binaries.yml + vars: + load_binaries: + node: {bin_name: 'node', version_cmd: 'node --version'} + npm: {bin_name: 'npm', version_cmd: 'npm --version'} + when: BINARIES.npm is not defined + - name: "Install node, npm, and npx" hosts: localhost gather_facts: no @@ -11,7 +28,7 @@ MIN_NODE_VERSION: '22.7.0' MIN_NPM_VERSION: '10.8.3' state: 'latest' - packages: [] + install_npm: {} tasks: # - package: update_cache=yes # when: ansible_facts['os_family'] == "Debian" @@ -24,71 +41,39 @@ loop: - '{{LIB_DIR_NPM_BIN}}' - '{{LIB_DIR_BIN}}' + when: BINPROVIDERS.npm is not defined ################################################################################### - - name: "Install npm on system: [node, npm]" - ansible.builtin.package: - name: node - state: "{{state}}" - - name: "Install npm packages: {{packages}}" + - 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 + when: BINPROVIDERS.npm is not defined + + - name: "Install npm packages: {{install_npm}}" community.general.npm: name: '{{item}}' state: "{{state}}" path: '{{LIB_DIR_NPM}}' - loop: '{{packages}}' + loop: "{{install_npm|dictsort|map(attribute='1')|map(attribute='packages')|flatten}}" ################################################################################### - - name: Get installed node abspath - command: 'which node' - register: NODE_ABSPATH_FULL - changed_when: False - - - name: Get installed node version - command: 'node --version' - register: NODE_VERSION_FULL - changed_when: False - - - name: Get installed npm abspath - command: 'which npm' - register: NPM_ABSPATH_FULL - changed_when: False - - - name: Get installed npm version - command: 'npm --version' - register: NPM_VERSION_FULL - changed_when: False - - - set_fact: - NODE_ABSPATH: "{{NODE_ABSPATH_FULL.stdout_lines|first}}" - NODE_VERSION: "{{NODE_VERSION_FULL.stdout_lines|first|regex_replace('^.*?v?([\\d\\.]+).*$', '\\1')}}" - NPM_ABSPATH: "{{NPM_ABSPATH_FULL.stdout_lines|first}}" - NPM_VERSION: "{{NPM_VERSION_FULL.stdout_lines|first|regex_replace('^.*?v?([\\d\\.]+).*$', '\\1')}}" - - - name: Check that installed Chrome matches expected version - assert: - that: - - NODE_VERSION is version(MIN_NODE_VERSION, '<=') - - NPM_VERSION is version(MIN_NPM_VERSION, '<=') - quiet: true + ################################################################################### - set_fact: - NODE_BINARIES: - node: - abspath: "{{NODE_ABSPATH}}" - version: "{{NODE_VERSION}}" - npm: - abspath: "{{NPM_ABSPATH}}" - version: "{{NPM_VERSION}}" NODE_BINPROVIDERS: npm: - installer_abspath: "{{NPM_ABSPATH}}" - installer_version: "{{NPM_VERSION}}" + installer_abspath: "{{BINARIES.npm.abspath}}" + installer_version: "{{BINARIES.npm.version}}" PATH: "{{LIB_DIR_NPM_BIN}}" + when: BINPROVIDERS.npm is not defined - set_fact: - BINARIES: "{{ BINARIES | default({}) | combine(NODE_BINARIES) }}" BINPROVIDERS: "{{ BINPROVIDERS | default({}) | combine(NODE_BINPROVIDERS) }}" + when: BINPROVIDERS.npm is not defined - debug: msg: "{{ {'BINARIES': BINARIES, 'BINPROVIDERS': BINPROVIDERS} }}" diff --git a/archivebox/playbooks/install_package.yml b/archivebox/playbooks/install_package.yml index e0257962..89f80906 100644 --- a/archivebox/playbooks/install_package.yml +++ b/archivebox/playbooks/install_package.yml @@ -7,14 +7,12 @@ LIB_DIR: '{{DATA_DIR}}/lib' LIB_DIR_BIN: '{{LIB_DIR}}/bin' state: 'latest' - install_packages: - bash: - packages: ['bash'] - # curl: ['curl'] - # wget: ['wget'] - # git: ['git'] + install_packages: {} + # bash: + # packages: ['bash'] PACKAGE_BINPROVIDERS: {} PACKAGE_BINARIES: {} + BINPROVIDERS: {} tasks: # - package: update_cache=yes # when: ansible_facts['os_family'] == "Debian" @@ -24,13 +22,16 @@ 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 - - set_fact: + - name: Calculate flat list of all packages to install + set_fact: all_packages: "{{install_packages|dictsort|map(attribute='1')|map(attribute='packages')|flatten|unique}}" ################################################################################### @@ -48,10 +49,12 @@ ansible_package: installer_abspath: "{{ANSIBLE_INSTALLER_ABSPATH_FULL.stdout}}" installer_version: "{{ansible_version.full}}" - PATH: "{{ LIB_DIR_BIN }}" + 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) }}" + when: BINPROVIDERS.ansible_package is not defined - debug: msg: "{{ {'BINPROVIDERS': BINPROVIDERS} }}" @@ -61,3 +64,4 @@ vars: load_binaries: bash: + when: BINARIES.bash is not defined diff --git a/archivebox/playbooks/install_pip.yml b/archivebox/playbooks/install_pip.yml index 97a01e33..5ce51500 100644 --- a/archivebox/playbooks/install_pip.yml +++ b/archivebox/playbooks/install_pip.yml @@ -41,19 +41,16 @@ loop: - '{{LIB_DIR_PIP}}' - '{{LIB_DIR_BIN}}' + when: BINPROVIDERS.pip is not defined ################################################################################### - - - debug: - msg: - - "{{BINARIES.python}}" - - "{{BINARIES.pip}}" - 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: @@ -72,13 +69,10 @@ installer_abspath: "{{BINARIES.pip.abspath}}" installer_version: "{{BINARIES.pip.version}}" PATH: "{{LIB_DIR_PIP_BIN}}" + when: BINPROVIDERS.pip is not defined - set_fact: BINPROVIDERS: "{{ BINPROVIDERS | default({}) | combine(PIP_BINPROVIDERS) }}" + when: BINPROVIDERS.pip is not defined - debug: msg: "{{ {'BINARIES': BINARIES, 'BINPROVIDERS': BINPROVIDERS} }}" - -- import_playbook: load_binaries.yml - vars: - load_binaries: - bash: diff --git a/archivebox/playbooks/install_singlefile.yml b/archivebox/playbooks/install_singlefile.yml index aa1c0503..5e4d8c0f 100644 --- a/archivebox/playbooks/install_singlefile.yml +++ b/archivebox/playbooks/install_singlefile.yml @@ -1,35 +1,34 @@ --- -- name: Install node and single-file-cli + +- import_playbook: install_npm.yml + vars: + install_npm: + singlefile: {packages: ['single-file-cli@1.1.54']} + state: 'present' + +- import_playbook: load_binaries.yml + vars: + load_binaries: + singlefile: {bin_name: 'single-file', version_cmd: 'single-file --version', PATH: '{{BINPROVIDERS.npm.PATH}}'} + + +- name: "Install Singlefile" hosts: localhost gather_facts: no vars: - DATA_DIR: '/Volumes/NVME/Users/squash/Code/archiveboxes/archivebox7/data4' - NPM_BIN_DIR: '{{DATA_DIR}}/node_modules/.bin' - MIN_BIN_VERSION: '1.1.54' + SINGLEFILE_VERSION_EXACT: '1.1.54' tasks: - # - package: update_cache=yes - # when: ansible_facts['os_family'] == "Debian" + - name: Make sure Node and NPM are installed + assert: + that: + - BINARIES.node.version + - BINARIES.npm.version + quiet: true - - ansible.builtin.package: - name: node - state: present - - - community.general.npm: - name: 'single-file-cli' - version: '{{ MIN_BIN_VERSION }}' - path: '{{ NPM_BIN_DIR }}/../..' - - - command: '{{ NPM_BIN_DIR }}/single-file --version' - register: BIN_VERSION_FULL - changed_when: False - - - set_fact: - BIN_VERSION: "{{ BIN_VERSION_FULL.stdout_lines|first }}" + - name: Check that installed Singlefile version matches expected version + assert: + that: SINGLEFILE_VERSION_EXACT is version(BINARIES.singlefile.version, '==') + quiet: true - debug: - msg: - - "BIN_ABSPATH={{ NPM_BIN_DIR }}/single-file" - - "BIN_VERSION={{ BIN_VERSION }}" - - - assert: - that: BIN_VERSION is version(MIN_BIN_VERSION, '==', version_type='semver') + msg: "{{ {'BINARIES': BINARIES, 'BINPROVIDERS': BINPROVIDERS} }}" diff --git a/archivebox/playbooks/install_ytdlp.yml b/archivebox/playbooks/install_ytdlp.yml index 2d1357ab..1dde8059 100644 --- a/archivebox/playbooks/install_ytdlp.yml +++ b/archivebox/playbooks/install_ytdlp.yml @@ -37,3 +37,6 @@ assert: that: YTDLP_VERSION_MIN is version(BINARIES.ytdlp.version, '>=') quiet: true + + - debug: + msg: "{{ {'BINARIES': BINARIES, 'BINPROVIDERS': BINPROVIDERS} }}" diff --git a/archivebox/playbooks/load_binaries.yml b/archivebox/playbooks/load_binaries.yml index 7f0ef315..65a90152 100644 --- a/archivebox/playbooks/load_binaries.yml +++ b/archivebox/playbooks/load_binaries.yml @@ -6,18 +6,20 @@ DATA_DIR: '/Volumes/NVME/Users/squash/Code/archiveboxes/archivebox7/data4' LIB_DIR: '{{DATA_DIR}}/lib' LIB_DIR_BIN: '{{LIB_DIR}}/bin' + DEFAULT_PATH: '/bin' load_binaries: bash: bin_name: bash version_cmd: 'bash --version' # ffmpeg: # version_cmd: 'ffmpeg -version' + # PATH: '/opt/homebrew/bin:/usr/local/bin' # ytdlp: # bin_name: ytdlp # curl: # wget: # bin_name: wget - # version_cmd: 'wget --version' + # version_cmd: 'wget --version'] tasks: - name: Make sure lib folders exist file: @@ -27,14 +29,14 @@ ################################################################################### - name: Get installed binary abspath - command: "which {{item.1.bin_name|default(item.0)}}" + command: 'env PATH="{{item.1.PATH|default(DEFAULT_PATH)}}:$PATH" which {{item.1.bin_name|default(item.0)}}' register: ABSPATHS_FULL changed_when: false ignore_errors: true loop: "{{load_binaries|dictsort}}" - name: Get installed binary version - command: "{{item.1.version_cmd|default((item.1.bin_name|default(item.0)) + ' --version')}}" + command: 'env PATH="{{item.1.PATH|default(DEFAULT_PATH)}}:$PATH" {{item.1.version_cmd|default((item.1.bin_name|default(item.0)) + " --version")}}' register: VERSIONS_FULL changed_when: false ignore_errors: true @@ -47,22 +49,37 @@ state: link loop: "{{ABSPATHS_FULL.results|map(attribute='stdout_lines')|map('first')}}" - - set_fact: + - name: Collecting abspath results + set_fact: BINARY_ABSPATHS: "{{ BINARY_ABSPATHS | default({}) | combine({item.0: item.1}) }}" loop: "{{ keys | zip(values) }}" vars: keys: "{{load_binaries|dictsort|map(attribute='0')}}" values: "{{ABSPATHS_FULL.results|map(attribute='stdout_lines')|map('first')}}" - - set_fact: + - name: Collecting version results + set_fact: BINARY_VERSIONS: "{{ BINARY_VERSIONS | default({}) | combine({item.0: item.1}) }}" loop: "{{ keys | zip(values) }}" vars: keys: "{{load_binaries|dictsort|map(attribute='0')}}" values: "{{VERSIONS_FULL.results|map(attribute='stdout_lines')|map('first')|map('regex_replace', '^.*?v?([\\d\\.]+).*$', '\\1')}}" - - set_fact: - BINARIES: "{{ BINARIES | default({}) | combine({item: { 'abspath': BINARY_ABSPATHS[item], 'version': BINARY_VERSIONS[item] }}) }}" + - name: Updating BINARIES with loaded abspaths & versions + set_fact: + BINARIES: "{{ + BINARIES + | default({}) + | combine({ + item: load_binaries[item]|combine({ + 'bin_name': BINARY_ABSPATHS[item]|basename, + 'abspath': BINARY_ABSPATHS[item], + 'version': BINARY_VERSIONS[item], + 'symlink': LIB_DIR_BIN + '/' + BINARY_ABSPATHS[item]|basename, + 'version_cmd': load_binaries[item]['version_cmd']|default(item + ' --version'), + }), + }) + }}" loop: "{{load_binaries|dictsort|map(attribute='0')}}" ###################################################################################