First of all, what is ansible?
Ansible is a simple-to-learn and very powerful configuration management tool. Ansible is not using a client deployed on clients like puppet or salt do, but instead it utilizes SSH Connections to run tasks on the destination hosts.
What I'm going to describe here is how to install ansible on a CentOS 7 Host, create the directory structure, write a role and reference to it
Alright now, let's get to install ansible. I'll use a CentOS 7 Host for this:
Notice that notify line? That notify will search for the 'restart sshd.service' in the current handlers directory for the role's directory structure. To make that work, let's create the specified handler.
Ansible is a simple-to-learn and very powerful configuration management tool. Ansible is not using a client deployed on clients like puppet or salt do, but instead it utilizes SSH Connections to run tasks on the destination hosts.
What I'm going to describe here is how to install ansible on a CentOS 7 Host, create the directory structure, write a role and reference to it
Alright now, let's get to install ansible. I'll use a CentOS 7 Host for this:
[archy@ansible ~]$ sudo yum -y install ansible
This will install ansible with all dependencies on your system. So far so good, let's create the directory structure where you'll most of the time be working in and the first host inventory which will be in /srv/ansible/inventories/production/hosts. [archy@ansible ~]$ sudo mkdir -p /srv/ansible/playbooks/{roles,inventories}
[archy@ansible ~]$ sudo mkdir /srv/ansible/playbooks/inventories/production
[archy@ansible ~]$ sudo vim /srv/ansible/playbooks/inventories/production/hosts
[apphosts]
app01.archyslife.lan
app02.archyslife.lan
Now with the directories and files created, let's give them the appropriate permissions, owners and groups. [archy@ansible ~]$ sudo chown -R nobody:ansible-users /srv/ansible/playbooks
[archy@ansible ~]$ sudo chmod 2775 /srv/ansible/playbooks
Now with the inventory created, let's create a role named base. Creating a role is very simple with ansible-galaxy. This will create all the directories and files for you. [archy@ansible ~]$ cd /srv/ansible/playbooks
[archy@ansible /srv/ansible/playbooks]$ ansible-galaxy init roles/base
[archy@ansible /srv/ansible/playbooks]$ tree
roles/base
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files
Since the directory structure is created, let's go ahead and edit the tasks/main.yml to contain some stuff we want to run. [archy@ansible /srv/ansible/playbooks]$ vim roles/base/tasks/main.yml
---
- name: install base packages
yum:
name:
- deltarpm
- lsof
- mailx
- tcpdump
- htop
- bmon
- iotop
- net-tools
- bind-utils
- nmap-ncat
- rsync
- tmux
- vim
- bash-completion
- policycoreutils-python
- setroubleshoot-server
- name: enabling selinux
selinux:
state: enforcing
policy: targeted
- name: disabling firewalld.service
service:
name: firewalld
state: stopped
enabled: no
- name: copying sshd-config
copy:
src: /srv/ansible/playbooks/roles/base/files/sshd_config
dest: /etc/ssh/sshd_config
owner: root
group: root
mode: 0600
notify: restart sshd.service
...
Notice that notify line? That notify will search for the 'restart sshd.service' in the current handlers directory for the role's directory structure. To make that work, let's create the specified handler.
[archy@ansible /srv/ansible/playbooks]$ vim roles/base/handlers/main.yml
---
- name: restart sshd.service
systemd:
name: sshd
state: restarted
enabled: yes
...
Now that that's created, let's write a playbook that includes the base role.
[archy@ansible /srv/ansible/playbooks]$ vim deploy_base.yml
---
- hosts: all
become: yes
gather_facts: True
roles:
- base
...
Alright, let's run the playbook and check if everything worked as expected.
[archy@ansible /srv/ansible/playbooks]$ ansible-playbook --inventory inventories/production/hosts --become --ask-become-pass deploy_base.yml
PLAY [all] ************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************
ok: [app01.archyslife.lan]
ok: [app02.archyslife.lan]
TASK [base : install base packages] ***********************************************************************************
changed: [app01.archyslife.lan]
changed: [app02.archyslife.lan]
TASK [base: enabling selinux] *****************************************************************************************
ok: [app01.archyslife.lan]
ok: [app02.archyslife.lan]
TASK [base : disabling firewalld.service] *****************************************************************************
changed: [app01.archyslife.lan]
changed: [app02.archyslife.lan]
TASK [base : copying sshd-config] *************************************************************************************
changed: [app01.archyslife.lan]
changed: [app02.archyslife.lan]
RUNNING HANDLER [base : restart sshd.service] ************************************************************************
changed: [app01.archyslife.lan]
changed: [app02.archyslife.lan]
PLAY RECAP ************************************************************************************************************
ansible01.archyslife.lan: ok=2 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
docker01.archyslife.lan : ok=2 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Alright, seems like everything has run successfully. Here's a quick recap on what we've done:
- Installed ansible on the host
- Created the directory Structure
- Created an inventory to work with
- Assigned proper permissions
- Created a base role and a playbook to run it all
You can add more roles and reference to them just like we did with this setup which allows for an expandable setup.
Please note that this setup is not recommended with AWX / Ansible Tower. In order to make full use of this, you'll have to create additional projects for each role with a requirements.yml and import the required roles. However this sums up this guide for now.
Feel free to comment and / or suggest any topics.
Comments
Post a Comment