#!/usr/bin/env ansible-playbook --- - name: "Install puppeteer, puppeteer/browsers, and chrome" hosts: localhost gather_facts: true vars: LIB_DIR: '{{DATA_DIR}}/lib' LIB_DIR_BIN: '{{LIB_DIR}}/bin' LIB_DIR_BROWSERS: '{{LIB_DIR}}/browsers' CHROME_RELEASE_CHANNEL: 'chrome@stable' CHROME_VERSION_MIN: '128.0.6613.137' tasks: - include_role: name: setup_lib_npm vars: MIN_NODE_VERSION: '20.0.0' MIN_NPM_VERSION: '10.0.0' - name: "Install npm packages: [puppeteer, @puppeteer/browsers]" community.general.npm: name: '{{item}}' state: "present" path: '{{BINPROVIDERS.npm.lib_dir_npm}}' loop: - 'puppeteer' - '@puppeteer/browsers' - name: Make sure prerequisite folders exist file: path: '{{LIB_DIR_BROWSERS}}' state: directory recurse: true - name: Load puppeteer binary from installed NPM package include_role: name: load_binary vars: name: puppeteer PATH: '{{BINPROVIDERS.npm.PATH}}' - name: Load chrome binaries from environment PATH include_tasks: roles/load_binary/tasks/main.yml vars: name: 'chrome' bin_name: '{{chrome_executable}}' PATH: '{{ansible_env.PATH}}' with_items: - chrome # - chrome-browser # - chromium # - chromium-browser # - google-chrome # - google-chrome-browser # - google-chrome-stable # - google-chrome-beta # - google-chrome-canary # - google-chrome-unstable # - google-chrome-dev loop_control: loop_var: chrome_executable # break_when: # - BINARIES.chrome.version|default('') # - debug: # msg: "{{ {'BINARIES': BINARIES, 'BINPROVIDERS': BINPROVIDERS} }}" ################################################################################### - name: 'Install Chrome browser: npx @puppeteer/browsers install {{CHROME_RELEASE_CHANNEL}}' command: 'npx @puppeteer/browsers install {{CHROME_RELEASE_CHANNEL}} --path {{LIB_DIR_BROWSERS}}' register: CHROME_VERSION_FULL environment: PATH: "{{BINPROVIDERS.npm.PATH}}:{{ ansible_env.PATH }}" changed_when: CHROME_VERSION_MIN not in CHROME_VERSION_FULL.stdout when: not BINARIES.chrome.version|default('') # -> 'chrome@128.0.6613.137 /data/lib/browsers/chrome/linux_arm-128.0.6613.138/chrome-linux-arm64/...' ################################################################################### - name: Parse Chrome version and abspath from npx @puppeteer/browsers install output set_fact: CHROME_ABSPATH: "{{ CHROME_VERSION_FULL.stdout_lines|last|split(' ', 1)|last }}" CHROME_VERSION: "{{ CHROME_VERSION_FULL.stdout_lines|last|split('@', 1)|last|split(' ', 1)|first }}" when: not BINARIES.chrome.version|default('') - name: Create ./bin/chrome symlink to ./browsers/chrome/... binary copy: content: | #!/bin/bash exec '{{CHROME_ABSPATH|default(BINARIES.chrome.abspath)}}' "$@" dest: "{{LIB_DIR_BIN}}/chrome" changed_when: False - name: Ensure ./bin/chrome symlink is executable file: path: "{{LIB_DIR_BIN}}/chrome" mode: u+rx,g-rx,o-rwx state: 'file' changed_when: False ################################################################################### - set_fact: PUPPETEER_BINARIES: chrome: bin_name: 'chrome' abspath: "{{CHROME_ABSPATH|default(BINARIES.chrome.abspath) or None}}" version: "{{CHROME_VERSION|default(BINARIES.chrome.version) or None}}" symlink: "{{LIB_DIR_BIN}}/chrome" version_cmd: "chrome --version" binprovider: 'puppeteer' PUPPETEER_BINPROVIDERS: puppeteer: installer_abspath: "{{BINARIES.puppeteer.abspath}}" installer_version: "{{BINARIES.puppeteer.version}}" PATH: "{{LIB_DIR_BIN}}" lib_dir_browsers: "{{LIB_DIR_BROWSERS}}" - name: Check that installed Chrome matches expected version assert: that: PUPPETEER_BINARIES.chrome.version is version(CHROME_VERSION_MIN, '>=') quiet: true - set_fact: BINARIES: "{{ BINARIES | combine(PUPPETEER_BINARIES) }}" cacheable: true - debug: msg: "{{ {'BINARIES': BINARIES, 'BINPROVIDERS': BINPROVIDERS} }}"