--- - name: Ensure Bun install root exists ansible.builtin.file: path: "{{ bun_install_root }}" state: directory owner: root group: root mode: "0755" - name: Set Bun artifact values ansible.builtin.set_fact: bun_archive_name: "bun-{{ bun_arch_suffix }}.zip" bun_download_url: "https://github.com/oven-sh/bun/releases/download/bun-v{{ bun_version }}/bun-{{ bun_arch_suffix }}.zip" bun_archive_path: "/tmp/bun-v{{ bun_version }}-{{ bun_arch_suffix }}.zip" bun_extract_path: "{{ bun_install_root }}/bun-v{{ bun_version }}-{{ bun_arch_suffix }}" - name: Ensure versioned Bun extract directory exists ansible.builtin.file: path: "{{ bun_extract_path }}" state: directory owner: root group: root mode: "0755" - name: Download Bun release archive ansible.builtin.get_url: url: "{{ bun_download_url }}" dest: "{{ bun_archive_path }}" mode: "0644" - name: Extract Bun archive ansible.builtin.unarchive: src: "{{ bun_archive_path }}" dest: "{{ bun_extract_path }}" remote_src: true creates: "{{ bun_extract_path }}/.extracted" - name: Mark Bun extraction complete ansible.builtin.file: path: "{{ bun_extract_path }}/.extracted" state: touch mode: "0644" - name: Locate extracted Bun binary ansible.builtin.find: paths: "{{ bun_extract_path }}" recurse: true file_type: file patterns: bun register: bun_binary_find - name: Fail when Bun binary is missing ansible.builtin.fail: msg: "Bun binary was not found under {{ bun_extract_path }} after extraction." when: bun_binary_find.matched | int == 0 - name: Select Bun binary path ansible.builtin.set_fact: bun_binary_path: "{{ (bun_binary_find.files | sort(attribute='path') | first).path }}" - name: Ensure Bun binary has execute permission ansible.builtin.file: path: "{{ bun_binary_path }}" mode: "0755" - name: Link Bun binary into standard PATH ansible.builtin.file: src: "{{ bun_binary_path }}" dest: /usr/local/bin/bun state: link force: true