Create an Ansible playbook that will assure nginx is present, configured and running on all hosts in the "web" group:
1. Has variables for `nginx_test_message` and `nginx_keepalive_timeout`.
2. Assures that the following yum packages are present on the each web host:
* nginx
* python-pip
* python-devel
* gcc
3. Assure that the uwsgi pip package is present on each host.
4. Generate a host-specific home page with the value of `nginx_test_message` for each host using the provided `index.html.j2` template.
5. Generate a configuration with the value of `nginx_keepalive_timeout` for each host using the provided `nginx.conf.j2` template.
6. Assure that nginx is running on each host.
7. The playbook should restart nginx if the homepage or configuration file is altered.
While developing the playbook use the --syntax-check to check your work and debug problems.
Run your playbook in verbose mode using the -v switch to get more information on what Ansible is doing.
Try -vv and -vvv for added verbosity. Also consider running --check to do a dry-run as you are developing.
On your control node, change to the directory /home/studentnn/lightbulb/workshops/ansible_engine/basic_playbook/resources (please note you will need to specify the correct user under the home directory)
To change directories, type;
$ cd /home/studentnn/lightbulb/workshops/ansible_engine/basic_playbook/resources
Verify the index.html.j2 and nginx.conf.j2 files are present by typing; ls
On your control node open an editor (such as vi or nano) and create the following ansible playbook (be sure to start with the 3 dashes in the first line);
---
- name: install and start nginx with wsgi
hosts: web
become: yes
vars:
nginx_packages:
- nginx
- python-pip
- python-devel
- gcc
nginx_test_message: This is a test message
nginx_keepalive_timeout: 115
nginx_webserver_port: 80
tasks:
- name: nginx packages are present
yum:
name: "{{ item }}"
state: present
with_items: "{{ nginx_packages }}"
notify: restart-nginx-service
- name: uwsgi package is present
pip:
name: uwsgi
state: present
notify: restart-nginx-service
- name: latest default.conf is present
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
backup: yes
notify: restart-nginx-service
- name: latest index.html is present
template:
src: index.html.j2
dest: /usr/share/nginx/html/index.html
- name: nginx service is started and enabled
service:
name: nginx
state: started
enabled: yes
# smoke test that nginx came up and is serving home page
- name: proper response from localhost can be received
uri:
url: http://localhost/
return_content: yes
register: response
until: 'nginx_test_message in response.content'
retries: 10
delay: 1
handlers:
- name: restart-nginx-service
service:
name: nginx
state: restarted
Save the file as "basic_playbook.yml".
Verify the syntax of the ansible playbook you just created by typing;
$ ansible-playbook basic_playbook.yml --syntax-check
Example Output: $ ansible-playbook basic_playbook.yml --syntax-check playbook: basic_playbook.yml
Then run the playbook by typing:
$ ansible-playbook basic_playbook.yml
Example Output: $ ansible-playbook basic_playbook.yml PLAY [install and start nginx with wsgi] ********************************************************************************************* TASK [Gathering Facts] *************************************************************************************************************** ok: [node-1] ok: [node-3] ok: [node-2] TASK [nginx packages are present] **************************************************************************************************** ok: [node-1] => (item=[u'nginx', u'python-pip', u'python-devel', u'gcc']) ok: [node-2] => (item=[u'nginx', u'python-pip', u'python-devel', u'gcc']) ok: [node-3] => (item=[u'nginx', u'python-pip', u'python-devel', u'gcc']) TASK [uwsgi package is present] ****************************************************************************************************** ok: [node-1] ok: [node-2] ok: [node-3] TASK [latest default.conf is present] ************************************************************************************************ changed: [node-1] changed: [node-2] changed: [node-3] TASK [latest index.html is present] ************************************************************************************************** changed: [node-1] changed: [node-2] changed: [node-3] TASK [nginx service is started and enabled] ****************************************************************************************** changed: [node-1] changed: [node-2] changed: [node-3] TASK [proper response from localhost can be received] ******************************************************************************** ok: [node-1] ok: [node-2] ok: [node-3] RUNNING HANDLER [restart-nginx-service] ********************************************************************************************** changed: [node-2] changed: [node-1] changed: [node-3] PLAY RECAP *************************************************************************************************************************** node-1 : ok=8 changed=4 unreachable=0 failed=0 node-2 : ok=8 changed=4 unreachable=0 failed=0 node-3 : ok=8 changed=4 unreachable=0 failed=0
Verify nginx has been installed by testing one of your nodes. Open a browser on your laptop and point to the public IP address of one of your nodes (not the control node).
i.e. http://34.229.6.4
If successful, you should see a web page with the Ansible logo but now with the text: "This is a Test Message"
Extra Credit
Create, run and verify a seperate playbook that stops and removes nginx along with its configuration file and home page.
Playbook Solution:
---
- name: removes nginx with wsgi
hosts: web
become: yes
tasks:
- name: nginx service is stopped
service:
name: nginx
state: stopped
enabled: false
ignore_errors: yes
- name: nginx package is absent
yum:
name: nginx
state: absent
- name: uwsgi package is absent
pip:
name: uwsgi
state: absent
- name: files created by nginx-basic are absent
file:
name: "{{ item }}"
state: absent
with_items:
- /etc/nginx/nginx.conf
- /usr/share/nginx/html/index.html