Ansible is a reliable configuration management tool. It is shipped with a lot of modules including those provided by the communities. Some modules are essential and come in very handy in everyday tasks.
Ansible is pushed-based and works by generating a Python script that will be run on the target server. It means the target server is required to have Python which is also commonly shipped in any Linux distros.
package
The module is used to manage packages in the target host. It is like running apt
, yum
, or aptitude
. The following snippet is an example of its usage to install the Nginx package using the package manager.
tasks:
- name: Install Nginx
package:
name: nginx
state: present
update_cache: True
file
It is used to manage files, symlinks, links, or folders on the target host. These are the two examples.
tasks:
- name: Create a directory
file:
path: "/home/luki/mydir"
state: directory
mode: 0750
- name: Copy a file
file:
src: "/home/luki/my.conf"
dest: "/etc/my.conf"
state: link
copy
It is used to move files from Ansible (local) host to the target host. For example, we want to copy two files in a local directory to another directory in the remote host.
tasks:
- name: Copy files
copy:
src: "files/{{ item }}"
dest: "/home/luki/files"
mode: 0644
loop:
- "file1.txt"
- "file2.txt"
template
It works very similarly to copy
but it will generate the content of the file based on the specified template. The template is based on Jinja. It can be advantageous when we want to create configuration files whose contents depend on local or remote variables.
tasks:
- name: Copy homepage
template:
src: templates/index.html.j2
dest: "{{ web_root }}/index.html"
The following snippet is an example of the index.html.j2
file. It passes two variables that are natively maintained by Ansible. The output file will have those variables replaced with the actual values.
<body>
<h1>Server is configured by Ansible</h1>
<ul>
<li>Host IP: {{ ansible_host }}</li>
<li>Host User: {{ ansible_user }}</li>
</ul>
</body>
service
Having services or daemon programs that always run on a server is common. This module will be an abstraction for maintaining the services whatever service manager we use, systemd
or systemctl
.
tasks:
- name: Restart nginx
service:
name: nginx
state: restarted
get_url
Rather than using curl
tool available on Linux, it is recommended to use this module. The module can monitor the existence of the downloaded file and decide whether a download should be run based on some properties.
tasks:
- name: Download My File
get_url:
url: https://website.com/files/my-file
dest: ~/file.txt
force: True
shell
If there are actions that Ansible is not covered yet or we need to execute certain functions on the remote host, the shell module comes in handy. The module allows us to execute Linux shell commands. The following example shows a call to the curl
CLI tool through a shell. The args
section is an alternative way to pass shell
module's supported arguments while we use a string as shell
's value.
tasks:
- name: Install NVM
shell: >
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
args:
creates: "{{ ansible_env.HOME }}/.nvm/nvm.sh"
apt
This module is very similar to the package
module. The difference is that it uses APT explicitly while the package
module prefers to use aptitude. The supported arguments are also very similar.
tasks:
- name: Install Docker required packages
apt:
force_apt_get: True
force: True # allow_unauthenticated && allow_downgrade
name:
- ca-certificates
- curl
- gnupg
- lsb-release
state: latest
update_cache: True
apt_repository
If we need to add items to the APT source list, we can utilize this module. It is safer than using a shell script to append items to the list because as we know Ansible call is idempotent so we don't need to validate if there is any duplication.
tasks:
- name: Add Docker's repository
apt_repository:
filename: docker
repo: "deb [arch={{ [ansible_architecture] | map('extract', deb_architectures) | first }} signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
state: present
debug
It can be used to display any messages from previous tasks or other system processes. The following example shows an example of using it for displaying some host variables.
tasks:
- name: Debug environment variables
debug:
msg: "{{ ansible_env }}"
- name: Debug host information
debug:
msg: "{{ item }}"
with_items:
- "{{ ansible_distribution }}"
- "{{ ansible_distribution_version }}"
- "{{ ansible_distribution_release }}" # same as command: lsb_release -cs
- "{{ ansible_architecture }}"
Comments
Post a Comment