Ansible Roles (deel 1)

Om Ansible nog beter te gebruiken is het gebruik van Roles aan te raden. Met roles kunnen onafhankelijke collecties van taken, variabelen, templates, bestanden en modules worden gemaakt.
In mijn voorbeeld wil ik een x aantal webservers installeren met php welke de bestanden van een NFS share halen en daarbij ook een haproxy loadbalancer installeren. Voor de eenvoud installeren we de load balancer op dezelfde server als de NFS. In de praktijk is dat natuurlijk niet aan te raden. Het ip nummer plan ziet er als volgt uit:
ansiblemaster 192.168.57.100
ansiblenode1 192.168.57.101
ansiblenode2 192.168.57.102
nfsserver/haproxy 192.168.57.103

Eerst sommen we even op wat er allemaal gedaan moet worden.
– Zoals in mijn voorgaande post moet ansible geïnstalleerd worden op alle nodes.
– Installatie van de NFS server
– Installatie van de NFS clients
– Mount de NFS clients aan de NFS server
– Installatie Apache webserver met PHP en configureren
– Installatie haproxy en configureren

We beginnen met de inventory file: /etc/ansible/hosts

[local]
localhost

[test12]
192.168.57.101
192.168.57.102

[test3]
192.168.57.103

Groep test12 is zijn de webserver nodes. test3 is de nfs/haproxy server.
Als we dat gedaan hebben kunnen we de roles aanmaken. Hiervoor maken we gebruik van het ansible-galaxy commando

mkdir -p /home/ansible/ansible/
cd /home/ansible/ansible/
ansible-galaxy init --init-path=/home/ansible/ansible/roles/ webserver
ansible-galaxy init --init-path=/home/ansible/ansible/roles/ nfsclient
ansible-galaxy init --init-path=/home/ansible/ansible/roles/ nfsserver
ansible-galaxy init --init-path=/home/ansible/ansible/roles/ haproxy

 

Aangezien ik graag wat dingen apart wil houden maak ik meerdere tasks aan. Voor de haproxy gebuik ik wel de main.yml file.
In de tasks file van de webserver maken we een aantal bestanden aan.
Ten eerste de apache.yml. Deze ziet er als volgt uit.

---
- name: Disable SELinux
  selinux:
    state: disabled
- name: install apache
  with_items:
    - httpd
    - php
    - php-mcrypt 
    - php-gd 
    - php-curl
  yum:
    name: "{{ item }}"
    state: latest
- name: start apache
  service:
    name: httpd
    state: started
    enabled: true
- name: Enable Firewall
  firewalld:
    service: http
    permanent: yes
    state: enabled
  ignore_errors: true

Vervolgens een changeconfig.yml. Welke er als volgt uitziet:

---
- name: change config
  template:
    src: httpd.j2
    dest: /etc/httpd/conf/httpd.conf
    owner: root
    group: root
    mode: '0775'
- name: Restart Apache
  service:
    name: httpd
    state: restarted

Dit had eventueel ook in hetzelfde bestand als apache.yml gekund.
Zoals je kunt zien gebruiken we een template bestand (httpd.j2) deze moet je plaatsen in de /home/ansible/ansible/roles/webserver/template file gezet worden en ziet er als volgt uit:

ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
<Directory />
AllowOverride none
Require all denied
</Directory>
DocumentRoot "/mnt/nfs"
<Directory "/mnt/nfs">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
<Files ".ht*">
Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule mime_module>
TypesConfig /etc/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf

Eigenlijk een gewone httpd.conf file, alleen hebben we de DocumentRoot aangepast naar de nfs share.
Tenslotte hebben we een main.yml gemaakt. Dit bestand wordt altijd uitgevoerd als je een bepaalde role gebruikt. De main.yml ziet er als volgt uit:

---
- include_tasks: apache.yml
- include_tasks: changeconfig.yml

Dit is alles om de webserver te installeren en te verwijzen naar de NFS share. We hebben echter de NFS share nog niet geregeld. Daarvoor gebruiken we een aparte role, nml. nfsclient. ook hier hebben we weer dezelfde directories als bij de webserver role.
Ten eerste maken we een yml file, nfsclient.yml. Dit bestand ziet er als volgt uit:

- name: Instal nfsclient
  yum:
    name: nfs-utils
    state: latest

Vervolgens zorgen we ervoor dat de nfs share gemount wordt. Dit doen we door middel van een nfsmount.yml. In dit bestand zetten we het volgende:

- block:
  - name: Mount NFS directory
    mount:
      path: /mnt/nfs
      src: 192.168.57.103:/mnt/nfsserver
      fstype: nfs
      state: mounted
  - name: Set File permissions
    file:
      path: /mnt/nfs
      mode: 0777
  become: yes

En als laatste hebben we voor deze rol ook een main.yml

---
# tasks file for nfsclient
- include_tasks: nfsclient.yml
- include_tasks: nfsmount.yml

Om vervolgens alles aan elkaar te knopen met een playbook maken we in /home/ansible/ansible een bestand/playbook aan install_webserver.yml

---
- hosts: test12
  become: yes
  roles:
    - role: nfsclient
    - role: webserver

We wachten nog even met het uitvoeren van dit playbook. We hebben namelijk de nfsserver nog niet in orde gemaakt. Dat gaan we doen in deel 2.