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.
