webからファイルをダウンロードする(Ansible)

課題

Ubuntuでコマンドのセットアップを行いたいが、そのコマンドはデフォルトのaptリポジトリに入っておらず、自身でダウンロードしてPATHに配置する必要がある。Ansibleではどのように実現できるか。

解決策

ansible.builtin.get_urlモジュールを利用する。これは指定のURLからファイルをダウンロードするためのモジュールである。URL、配置パス、所有者や権限の設定を行うことができる。また環境変数として設定されているプロキシの利用有無の切り替え等も可能。

実際に筆者が作成した、get_urlを利用するplaybookを示す。このplaybookではyqをセットアップする。

- name: install yq main process
  hosts: all
  gather_facts: yes
  become: yes
  environment:
    http_proxy:  "{{ proxy_setting }}"
    https_proxy: "{{ proxy_setting }}"
  vars:
    ARCH: "{{ 'arm64' if ansible_architecture == 'aarch64' else 'amd64' }}"
  tasks:
  - name: install yq
    get_url:
      url: "https://github.com/mikefarah/yq/releases/latest/download/yq_linux_{{ ARCH }}"
      dest: /usr/local/bin/yq
      owner: root
      group: root
      mode: o=rwx,g=rx,o=rx
      use_proxy: "{{ 'true' if proxy_setting != '' else 'false' }}"

所感

このツールをAnsibleのコア機能の一部として提供してくれるのはありがたい。wgetcurlを使っても良いが、やはりそのときの環境や設定に依存してしまい面倒であるからだ。特にプロキシ設定に関して、playbook上から明示的に指示できるので、会社イントラ内での運用にも便利である。