When provisioning Linux machine we often start from minimal vanilla base images or even ISO files. We need to install different software packages from different sources and versions over and over again.
- Sometime from built-in package repositories using the native package manager like
apt
on Debian/Ubuntu - Sometimes we need to add additional package repositories
- Sometime we need to download DEB files from URLs
- Sometimes we need to download archive files
- Sometimes we need to install packages using pip
- ….
In Ansible you usually use the following collection/modules for those tasks:
ansible.builtin.apt
ansible.builtin.get_url
ansible.builtin.package
ansible.builtin.pip
ansible.builtin.unarchive
Here is one of our general purpose Ansible playbook for installing various packages. Which packages are actually installed is defined in a variables file
, which also can be a host_vars
or a group_vars
file. If a variable is not defined the specific task is skipped. That means, we only change a few variables for different machines or machine groups.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | --- - hosts : linux become: true tasks: - name : Install apt keys apt_key: url: '{{ item.name }}' state: present loop: '{{ install_apt_keys }}' when: - install_apt_keys is defined - install_apt_keys | length > 0 tags: - install_apt_keys - name : Install apt repositores apt_repository: repo: '{{item.name}}' filename: '{{item.filename}}' state: present loop: '{{ install_apt_repositories }}' when: - install_apt_repositories is defined - install_apt_repositories | length > 0 tags: - install_apt_repositories - name : Install packages package: name: '{{item.name}}' state: present loop: '{{ install_packages }}' when: - install_packages is defined - install_packages | length > 0 tags: - install_packages - name : Download and install deb from url apt: deb: '{{ item.url }}' loop: '{{ install_packages_deb_from_url }}' when: - install_packages_deb_from_url is defined - install_packages_deb_from_url | length > 0 tags: - install_packages_deb_from_url - name : Install archives from url unarchive: src: '{{ item.url }}' dest: '{{ item.dest }}' remote_src: yes loop: '{{ install_archives_from_url }}' when: - install_archives_from_url is defined - install_archives_from_url | length > 0 tags: - install_archives_from_url - name : Install pips pip: name: '{{item.name}}' state: latest loop: '{{ install_pips }}' when: - install_pips is defined - install_pips | length > 0 tags: - install_pips - name : Download files from url get_url: url: '{{ item.url }}' dest: '{{ item.dest }}' mode: '{{ item.mode }}' owner: '{{ item.owner }}' group: '{{ item.group }}' loop: '{{ download_files_from_url }}' when: - download_files_from_url is defined - download_files_from_url | length > 0 tags: - download_files_from_url |
Here is an example variables file
, which also can be a host_vars
or a group_vars
file.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | drone_cli_version: 1.4.0 kompose_version: 1.22.0 kubectl_version: 1.19.2 packer_version: 1.7.8 restic_version: 0.12.1 terraform_version: 1.1.2 vagrant_version: 2.2.18 install_apt_keys: install_apt_repositories: - { name : 'deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ {{ansible_distribution_release}} main' , filename : 'azurecli' } install_packages: - { name : 'apt-transport-https' } - { name : 'software-properties-common' } - { name : 'aptitude' } - { name : 'ca-certificates' } - { name : 'curl' } - { name : 'dirmngr' } - { name : 'lsb-release' } - { name : 'iotop' } - { name : 'python3-pip' } - { name : 'python3-setuptools' } - { name : 'python3-wheel' } install_packages_deb_from_url: - { url : 'https://releases.hashicorp.com/vagrant/{{ vagrant_version }}/vagrant_{{ vagrant_version }}_x86_64.deb' } install_archives_from_url: - { dest : /usr/local/bin , url : 'https://releases.hashicorp.com/packer/{{ packer_version }}/packer_{{ packer_version }}_linux_amd64.zip' } - { dest : /usr/local/bin , url : 'https://releases.hashicorp.com/terraform/{{ terraform_version }}/terraform_{{ terraform_version }}_linux_amd64.zip' } - { dest : /usr/local/bin , url : 'https://github.com/harness/drone-cli/releases/download/v{{ drone_cli_version }}/drone_linux_amd64.tar.gz' } install_pips: - { name : 'passlib' } - { name : 'cryptography' } download_files_from_url: - { dest : '/usr/local/bin/kubectl' , url : 'https://storage.googleapis.com/kubernetes-release/release/v{{ kubectl_version }}/bin/linux/amd64/kubectl' , mode : '755' , owner : root , group : root } - { dest : '/usr/local/bin/kompose' , url : 'https://github.com/kubernetes/kompose/releases/download/v{{ kompose_version }}/kompose-linux-amd64' , mode : '755' , owner : root , group : root } |