====== Ansible best practice ======
Reference: xavki (youtube)
/etc/ansible/ansible.cfg
[defaults]
host_key_checking = False # don't ask for accepting ssh keys
callback_whithelist = profile_task # Print tasks duration
forks = 30 # Parallel sessions
log_path = ./ansible_log.txt
[ssh_connection]
pipelining = True # Send python command to target directly to python interpreter, better for perf
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s PreferredAuthentification=publickey
Collect only one time (during one hour) info (gather_cache) on target...os_version...
[defaults]
fact_caching = jsonfile
fact_caching_timeout = 3600
fact_caching_connection = /tmp/myfacts
Test you playbook
# ansible-playbook -i inventories/production myplaybook.yml --check
Or
# ansible-playbook -i inventories/production myplaybook.yml --dry-run
=== Using setup module ===
Collect directly gather facts
# ansible-playbook -i inventory.yml all -m setup
Filter on a specific setting
# ansible-playbook -i inventory.yml all -m setup -a "filter=ansible_user*"
===== Create a base folder structure =====
[ansible@lnxa100 ~]$ ansible-galaxy init test-role-1
- Role test-role-1 was created successfully
[ansible@lnxa100 ~]$ ll
drwxrwxr-x 2 ansible ansible 39 Mar 6 13:17 facts
drwxrwxr-x 10 ansible ansible 154 Mar 6 14:21 test-role-1
[ansible@lnxa100 ~]$ cd test-role-1/
[ansible@lnxa100 test-role-1]$ ll
drwxrwxr-x 2 ansible ansible 22 Mar 6 14:21 defaults
drwxrwxr-x 2 ansible ansible 6 Mar 6 14:21 files
drwxrwxr-x 2 ansible ansible 22 Mar 6 14:21 handlers
drwxrwxr-x 2 ansible ansible 22 Mar 6 14:21 meta
-rw-rw-r-- 1 ansible ansible 1328 Mar 6 14:21 README.md
drwxrwxr-x 2 ansible ansible 22 Mar 6 14:21 tasks
drwxrwxr-x 2 ansible ansible 6 Mar 6 14:21 templates
drwxrwxr-x 2 ansible ansible 39 Mar 6 14:21 tests
drwxrwxr-x 2 ansible ansible 22 Mar 6 14:21 vars
===== Inventory ====
You can export the variable or use the default
export ANSIBLE_HOSTS=~/hosts
Inventory type file can be json, text or yml
# vi /etc/ansible/hosts
[servers]
server1 ansible_host=203.0.113.111
server2 ansible_host=203.0.113.112
server3 ansible_host=203.0.113.113
[all:vars]
ansible_python_interpreter=/usr/bin/python3
List your inventory:
# ansible-inventory --list -y
all:
children:
servers:
hosts:
server1:
ansible_host: 203.0.113.111
ansible_python_interpreter: /usr/bin/python3
server2:
ansible_host: 203.0.113.112
ansible_python_interpreter: /usr/bin/python3
server3:
ansible_host: 203.0.113.113
ansible_python_interpreter: /usr/bin/python3
ungrouped: {}
Another example
# vi /etc/ansible/hosts
[servers]
server1 ansible_host=203.0.113.111
server2 ansible_host=203.0.113.112
server3 ansible_host=203.0.113.113
[all:vars]
ansible_python_interpreter=/usr/bin/python3
[linux:var]
ansible_connection=ssh
ansible_ssh_user=ansible
ansible_ssh_pass=secret_password
ansible_python_interpreter='/usr/bin/env python3'
ansible_become_method=sudo
==== Send result by mail ====