Laureline's Wiki

Laureline's Wiki

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
heig:cld:lab07 [2017/05/15 14:46] – [Task 2: Create a VM on Amazon Web Services] mikeheig:cld:lab07 [2017/05/15 17:09] (current) – external edit 127.0.0.1
Line 7: Line 7:
 DONE DONE
  
-<code>+<code bash>
 Yoda:~ frederic$ ansible --version Yoda:~ frederic$ ansible --version
 ansible 2.3.0.0 ansible 2.3.0.0
Line 19: Line 19:
 DONE DONE
  
-<code>+<code bash>
 ssh -i id_rsa ubuntu@ec2-54-147-90-78.compute-1.amazonaws.com ssh -i id_rsa ubuntu@ec2-54-147-90-78.compute-1.amazonaws.com
 ... ...
Line 29: Line 29:
 DONE DONE
  
-<code>+<code bash>
 Yoda:playbooks frederic$ ansible testserver -i hosts -m ping Yoda:playbooks frederic$ ansible testserver -i hosts -m ping
 Enter passphrase for key '/Users/frederic/.ssh/id_rsa':  Enter passphrase for key '/Users/frederic/.ssh/id_rsa': 
Line 39: Line 39:
 </code> </code>
  
-<code>+<code bash>
 Yoda:playbooks frederic$ ansible testserver -m ping Yoda:playbooks frederic$ ansible testserver -m ping
  
Line 50: Line 50:
 </code> </code>
  
-<code>+<code bash>
 Yoda:playbooks frederic$ ansible testserver -m command -a uptime Yoda:playbooks frederic$ ansible testserver -m command -a uptime
 Enter passphrase for key '/Users/frederic/.ssh/id_rsa':  Enter passphrase for key '/Users/frederic/.ssh/id_rsa': 
Line 56: Line 56:
  12:44:43 up 31 min,  2 users,  load average: 0.00, 0.01, 0.05  12:44:43 up 31 min,  2 users,  load average: 0.00, 0.01, 0.05
 </code> </code>
 +
 ===== Task 4: Install web application ===== ===== Task 4: Install web application =====
 +
 +DONE
 +
 +<code bash>
 +Yoda:playbooks frederic$ ansible webservers -m ping
 +Enter passphrase for key '/Users/frederic/.ssh/id_rsa': 
 +testserver | SUCCESS => {
 +    "changed": false, 
 +    "ping": "pong"
 +}
 +</code>
 +
 +<code bash>
 +Yoda:playbooks frederic$ ansible-playbook web.yml
 +
 +PLAY [Configure webserver with nginx] **********************************************************************************************************************************************************************
 +
 +TASK [Gathering Facts] *************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [install nginx] ***************************************************************************************************************************************************************************************
 +changed: [testserver]
 +
 +TASK [copy nginx config file] ******************************************************************************************************************************************************************************
 +changed: [testserver]
 +
 +TASK [enable configuration] ********************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [copy index.html] *************************************************************************************************************************************************************************************
 +changed: [testserver]
 +
 +TASK [restart nginx] ***************************************************************************************************************************************************************************************
 +changed: [testserver]
 +
 +PLAY RECAP *************************************************************************************************************************************************************************************************
 +testserver                 : ok=6    changed=4    unreachable=0    failed=0
 +</code>
 +
 +{{ :heig:cld:cld07_t1.png?nolink |}}
  
 ===== Task 5: Test Desired State Configuration principles ===== ===== Task 5: Test Desired State Configuration principles =====
 +
 +**Return to the output of running the web.yml playbook the first time. There is one task that Ansible marked as ok.** 
 +
 +<code bash>
 +Yoda:playbooks frederic$ ansible-playbook web.yml
 +
 +PLAY [Configure webserver with nginx] **********************************************************************************************************************************************************************
 +
 +TASK [Gathering Facts] *************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [install nginx] ***************************************************************************************************************************************************************************************
 +changed: [testserver]
 +
 +TASK [copy nginx config file] ******************************************************************************************************************************************************************************
 +changed: [testserver]
 +
 +TASK [enable configuration] ********************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [copy index.html] *************************************************************************************************************************************************************************************
 +changed: [testserver]
 +
 +TASK [restart nginx] ***************************************************************************************************************************************************************************************
 +changed: [testserver]
 +
 +PLAY RECAP *************************************************************************************************************************************************************************************************
 +testserver                 : ok=6    changed=4    unreachable=0    failed=0
 +</code>
 +
 +**Which one?**
 +
 +The tasks that Ansible marked as ok are the followings : 
 +
 +  - //TASK [Gathering Facts]//
 +  - //TASK [enable configuration]//
 +
 +**Do you have a possible explanation?**
 +
 +The //garhering facts// task is a task in which Ansible try to connect to the distant servers to gather the information needed to do its job.
 +
 +The //enable configuration// task creates a symbolic link with a file contained in the sites-available folder to enable it. The //default// file targeted by the ansible task is probably created at the installation of nginx and already linked to the //default// file in the sites-enabled folder. That's why nothing had to change in this task.
 +
 +**Re-run the web.yml playbook a second time. In principle nothing should have changed. Compare Ansible's output with the first run.**
 +
 +<code bash>
 +Yoda:playbooks frederic$ ansible-playbook web.yml
 +
 +PLAY [Configure webserver with nginx] **********************************************************************************************************************************************************************
 +
 +TASK [Gathering Facts] *************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [install nginx] ***************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [copy nginx config file] ******************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [enable configuration] ********************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [copy index.html] *************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [restart nginx] ***************************************************************************************************************************************************************************************
 +changed: [testserver]
 +
 +PLAY RECAP *************************************************************************************************************************************************************************************************
 +testserver                 : ok=6    changed=1    unreachable=0    failed=0
 +</code>
 +
 +**Which tasks are marked as changed?**
 +
 +We can see that only the task //TASK [restart nginx]// is marked as changed.
 +
 +**Any surprises?**
 +
 +It'is not a surprise because we ordered the server to do so. In any case a rstart of the nginx server will be triggered, by that way the state of the server will allways change.
 +
 +**In the playbook comment out update_cache=yes and re-run the playbook.**
 +
 +<code bash>
 +Yoda:playbooks frederic$ ansible-playbook web.yml
 +
 +PLAY [Configure webserver with nginx] **********************************************************************************************************************************************************************
 +
 +TASK [Gathering Facts] *************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [install nginx] ***************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [copy nginx config file] ******************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [enable configuration] ********************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [copy index.html] *************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [restart nginx] ***************************************************************************************************************************************************************************************
 +changed: [testserver]
 +
 +PLAY RECAP *************************************************************************************************************************************************************************************************
 +testserver                 : ok=6    changed=1    unreachable=0    failed=0
 +</code>
 +
 +**SSH into the managed server. Modify the nginx configuration file /etc/nginx/sites-available/default, for example by adding a line with a comment. Re-run the playbook.**
 +
 +<code bash>
 +Yoda:playbooks frederic$ ansible-playbook web.yml
 +
 +PLAY [Configure webserver with nginx] **********************************************************************************************************************************************************************
 +
 +TASK [Gathering Facts] *************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [install nginx] ***************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [copy nginx config file] ******************************************************************************************************************************************************************************
 +changed: [testserver]
 +
 +TASK [enable configuration] ********************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [copy index.html] *************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [restart nginx] ***************************************************************************************************************************************************************************************
 +changed: [testserver]
 +
 +PLAY RECAP *************************************************************************************************************************************************************************************************
 +testserver                 : ok=6    changed=2    unreachable=0    failed=0
 +</code>
 +
 +**What does Ansible do to the file and what does it show in its output?**
 +
 +Ansible simply replace the modified file with the one specified in the task //copy nginx config file//.
 +
 +**Do something more drastic like completely removing the homepage and repeat the previous question.**
 +
 +<code bash>
 +Yoda:playbooks frederic$ ansible-playbook web.yml
 +
 +PLAY [Configure webserver with nginx] **********************************************************************************************************************************************************************
 +
 +TASK [Gathering Facts] *************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [install nginx] ***************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [copy nginx config file] ******************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [enable configuration] ********************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [copy index.html] *************************************************************************************************************************************************************************************
 +changed: [testserver]
 +
 +TASK [restart nginx] ***************************************************************************************************************************************************************************************
 +changed: [testserver]
 +
 +PLAY RECAP *************************************************************************************************************************************************************************************************
 +testserver                 : ok=6    changed=2    unreachable=0    failed=0
 +</code>
 +
 +**What does Ansible do to the file and what does it show in its output?**
 +
 +We can see that the deleted index.html file has been replaced with the one specified in the task //copy index.html//.
  
 ===== Task 6: Adding a handler for nginx restart ===== ===== Task 6: Adding a handler for nginx restart =====
 +
 +Here is the output of the Ansible command:
 +
 +<code bash>
 +Yoda:playbooks frederic$ ansible-playbook web.yml
 +
 +PLAY [Configure webserver with nginx] **********************************************************************************************************************************************************************
 +
 +TASK [Gathering Facts] *************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [install nginx] ***************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [copy nginx config file] ******************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [enable configuration] ********************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +TASK [copy index.html] *************************************************************************************************************************************************************************************
 +ok: [testserver]
 +
 +PLAY RECAP *************************************************************************************************************************************************************************************************
 +testserver                 : ok=5    changed=0    unreachable=0    failed=0
 +</code>
 +
 +We can see that this time the nginx server hasn't been restarted after the ansible command which was the comportment we wanted.
 +
 +**Copy the modified playbook into the lab report.**
 +
 +<code yaml>
 +- name: Configure webserver with nginx
 +  hosts: webservers
 +  sudo: True
 +  tasks:
 +    - name: install nginx
 +      apt: name=nginx #update_cache=yes
 +      notify:
 +        - restart nginx
 +    - name: copy nginx config file
 +      copy: src=files/nginx.conf dest=/etc/nginx/sites-available/default
 +      notify:
 +        - restart nginx
 +    - name: enable configuration
 +      file: >
 +        dest=/etc/nginx/sites-enabled/default
 +        src=/etc/nginx/sites-available/default
 +        state=link
 +      notify:
 +        - restart nginx  
 +    - name: copy index.html
 +      template: src=templates/index.html.j2 dest=/usr/share/nginx/html/index.html mode=0644
 +      notify:
 +        - restart nginx 
 +  handlers:
 +    - name: restart nginx
 +      service: name=nginx state=restarted
 +</code>
  
 ===== Task 7: Add more managed servers ===== ===== Task 7: Add more managed servers =====
 +
 +**Re-run the web.yml playbook. What do you observe in Ansible's output?**
 +
 +We can see that everything goes as expected. No tasks has been trigerred for the first server (IP: 54.147.90.78) which was already up to date. For the newly added server 4 tasks were trigered and the nginx server restarted as expected.
 +
 +<code bash>
 +Yoda:playbooks frederic$ ansible-playbook web.yml
 +
 +PLAY [Configure webserver with nginx] **********************************************************************************************************************************************************************
 +
 +TASK [Gathering Facts] *************************************************************************************************************************************************************************************
 +ok: [52.206.206.57]
 +
 +TASK [install nginx] ***************************************************************************************************************************************************************************************
 +ok: [54.147.90.78]
 +changed: [52.206.206.57]
 +
 +TASK [copy nginx config file] ******************************************************************************************************************************************************************************
 +ok: [54.147.90.78]
 +changed: [52.206.206.57]
 +
 +TASK [enable configuration] ********************************************************************************************************************************************************************************
 +ok: [54.147.90.78]
 +ok: [52.206.206.57]
 +
 +TASK [copy index.html] *************************************************************************************************************************************************************************************
 +ok: [54.147.90.78]
 +changed: [52.206.206.57]
 +
 +RUNNING HANDLER [restart nginx] ****************************************************************************************************************************************************************************
 +changed: [52.206.206.57]
 +
 +PLAY RECAP *************************************************************************************************************************************************************************************************
 +52.206.206.57              : ok=6    changed=4    unreachable=0    failed=0   
 +54.147.90.78               : ok=5    changed=0    unreachable=0    failed=0
 +</code>
 +
 +**Test the new server by pointing your web browser to it.**
 +
 +{{ :heig:cld:cld07_t3.png?nolink |}}
 +
 +**What happens if a server is not reachable? Shut down the second instance and re-run the playbook.**
 +
 +We can see that Ansible try to reach the server in vain so it change the status of the server to unreachable. We can also see that Ansible continue the other tasks on the available servers.
 +
 +<code bash>
 +Yoda:playbooks frederic$ ansible-playbook web.yml
 +
 +PLAY [Configure webserver with nginx] **********************************************************************************************************************************************************************
 +
 +TASK [Gathering Facts] *************************************************************************************************************************************************************************************
 +fatal: [52.206.206.57]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 52.206.206.57 port 22: Operation timed out\r\n", "unreachable": true}
 +ok: [54.147.90.78]
 +
 +TASK [install nginx] ***************************************************************************************************************************************************************************************
 +ok: [54.147.90.78]
 +
 +TASK [copy nginx config file] ******************************************************************************************************************************************************************************
 +ok: [54.147.90.78]
 +
 +TASK [enable configuration] ********************************************************************************************************************************************************************************
 +ok: [54.147.90.78]
 +
 +TASK [copy index.html] *************************************************************************************************************************************************************************************
 +ok: [54.147.90.78]
 + to retry, use: --limit @/Users/frederic/Desktop/CLD_Lab07/playbooks/web.retry
 +
 +PLAY RECAP *************************************************************************************************************************************************************************************************
 +52.206.206.57              : ok=0    changed=0    unreachable=1    failed=0   
 +54.147.90.78               : ok=5    changed=0    unreachable=0    failed=0
 +</code>
 +