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.