My Ansible role to create a swapfile became painfully slow after its initial run. Turns out this was because once the swapfile is created Ansible's stat
command takes a long time to calculate the checksum on a multi-gigabite file.
$ time sha1sum swapfile
ff2975f9c13300a5b64c9d102fd2b83df4a1cd0f swapfile
real 2m21.507s
Sweet lord two-and-a-half minutes ain't gonna fly. Since I simply want an existence check on a file all the "get" parameters of Ansible were superfluous, but they're all enabled by default.
The Ansible 2.2 way of speeding up a simple file existence check is:
- name: Verify swapfile status
stat:
path: "{{ common_swapfile_location }}"
get_checksum: no
get_md5: no
mime: no
register: swap_status
changed_when: not swap_status.stat.exists
The Ansible 2.3 way has a new check and a rename, so:
- name: Verify swapfile status
stat:
path: "{{ common_swapfile_location }}"
get_checksum: no
get_md5: no
get_mime: no
get_attributes: no
register: swap_status
changed_when: not swap_status.stat.exists
For posterity this is my tasks/swapfile.yml
:
- name: Verify swapfile status
stat:
path: "{{ common_swapfile_location }}"
get_checksum: no
get_md5: no
mime: no
register: swap_status
changed_when: not swap_status.stat.exists
- name: Create swapfile
command: dd if=/dev/zero of={{ common_swapfile_location }} bs=1M count={{ common_swapfile_size }}
register: swap_created
when: swap_status.changed
- name: Set swapfile permissions
file:
path: "{{ common_swapfile_location }}"
owner: root
group: root
mode: 0600
when: swap_status.stat.exists or swap_created.changed
- name: Format swapfile
command: mkswap {{ common_swapfile_location }}
when: swap_created.changed
- name: Enable swapfile
command: swapon {{ common_swapfile_location }}
when: swap_created.changed
- name: Persist swapfile to fstab
mount:
name: none
src: "{{ common_swapfile_location }}"
fstype: swap
opts: defaults
passno: 0
dump: 0
state: present
when: swap_created.changed