{"id":25640483,"url":"https://github.com/toninoes/devopsunirp2","last_synced_at":"2026-05-09T09:03:52.848Z","repository":{"id":92806773,"uuid":"378705242","full_name":"toninoes/devopsunirp2","owner":"toninoes","description":"Caso práctico 2 - Experto Universitario en Devops \u0026 Cloud - Universidad Internacional de la Rioja. Automatización y despliegue en entornos Cloud.","archived":false,"fork":false,"pushed_at":"2021-11-28T09:58:57.000Z","size":763,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-11T02:49:39.111Z","etag":null,"topics":["ansible","cloud","devops","kubernetes","terraform"],"latest_commit_sha":null,"homepage":"","language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/toninoes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-06-20T17:39:45.000Z","updated_at":"2021-11-28T09:59:00.000Z","dependencies_parsed_at":"2023-04-17T08:02:03.058Z","dependency_job_id":null,"html_url":"https://github.com/toninoes/devopsunirp2","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/toninoes/devopsunirp2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toninoes%2Fdevopsunirp2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toninoes%2Fdevopsunirp2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toninoes%2Fdevopsunirp2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toninoes%2Fdevopsunirp2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/toninoes","download_url":"https://codeload.github.com/toninoes/devopsunirp2/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toninoes%2Fdevopsunirp2/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261630561,"owners_count":23187221,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","cloud","devops","kubernetes","terraform"],"created_at":"2025-02-23T04:39:47.324Z","updated_at":"2026-05-09T09:03:47.809Z","avatar_url":"https://github.com/toninoes.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Despliegue de clúster de Kubernetes en Azure utilizando Terraform y Ansible.\n\nVamos a desplegarlas en una subred **192.168.1.0/24** las IP privadas de las máquinas serán:\n\n| Nombre | IP |\n|------|------|\n| nfs.acme.es  | 192.168.1.115/24 |\n| master.acme.es | 192.168.1.110/24 | \n| worker01.acme.es | 192.168.1.111/24 | \n\nDebido a las limitaciones de la cuenta Azure student de 4 vCPU y ya que la máquina que actúa como master necesita al menos 2 de ellos, hemos tenido que reducir a sólo 1 worker. Quedándonos así:\n\n| Role | Sistema Operativo / Tipo | vCPUs | Memoria (GiB) | Disco Duro |\n|------|-------------------|-------|---------------|------------|\n| nfs  | CentOS 8 / Standard_DS1_v2           | 1     | 4             | 1 x 30 GiB |\n| master | CentOS 8 / Standard_D2s_v3        | 2     | 8             | 1 x 30 GiB |\n| worker01 | CentOS 8 / Standard_DS1_v2       | 1     | 4             | 1 x 30 GiB |\n\nDebemos tener un par de claves en nuestro equipo, ya que se copiarán a las máquinas virtuales azure en el despliegue y las utilizaremos también luego para el nodo master que hará de controller de ansible, para ello hacemos en nuestro equipo:\n\n```console\ntoni@tonipc:~$ ssh-keygen -t rsa -b 4096\nGenerating public/private rsa key pair.\nEnter file in which to save the key (/home/toni/.ssh/id_rsa): \nEnter passphrase (empty for no passphrase): \nEnter same passphrase again: \nYour identification has been saved in id_rsa\nYour public key has been saved in id_rsa.pub\nThe key fingerprint is:\nSHA256:d6ePc0yE/+ZhkgTgxPq345n4iEV5vmbUnCUFt0YXPPUc tonipc\nThe key's randomart image is:\n+---[RSA 4096]----+\n|        o+..o o. |\n|        oo.o o  E|\n|        ..o. .o..|\n|     . o . .o .+o|\n|    . o S B ++. o|\n|     o   O =.++  |\n|      . +   += + |\n|     . = .  .o= +|\n|      +.+   .o.o.|\n+----[SHA256]-----+\n```\n\n## Terraform\nEn el directorio terraform de este repositorio se encuentra lo necesario para desplegar toda la infraestructura en Azure.\n\n### Instrucciones de despliegue de la infraestructura Azure\nEn primer lugar deberás alojar en este mismo directorio tu fichero de credenciales credentials.tf que tiene la siguiente estructura:\n\n```\n provider \"azurerm\" {\n  features {}\n  subscription_id = \"\u003cSUBSCRIPCION ID\u003e\"\n  client_id       = \"\u003cAPP_ID\u003e\"\n  client_secret   = \"\u003cPASSWORD\u003e\"\n  tenant_id       = \"\u003cTENANT\u003e\"\n}\n```\n\nEstos datos se obtendrán al hacer az login con el cli de Azure.\n\nComo en esta practica vamos a usar Centos8, deberas aceptar los términos de uso de dicha imagen en Azure con\n\n```console\n[toni@tonipc: ~]# az vm image terms accept --urn cognosys:centos-8-stream-free:centos-8-stream-free:1.2019.0810\n```\n\nTodo esto lo puedes hacer directamente en la Cloud Shell de la consola de Azure, si no quieres instalar el cliente en local.\n\nDebes de disponer de la última versión de Terraform instalada y finalmente ejecutar los siguientes comandos dentro del directorio terraform:\n\n```console\ntoni@tonipc:~/devopsunirp2/terraform$ terraform init\ntoni@tonipc:~/devopsunirp2/terraform$ terraform plan\ntoni@tonipc:~/devopsunirp2/terraform$ terraform apply\n```\n\n## Ansible\nContiene todos los ficheros necesarios para desplegar el clúster de Kubernetes y la aplicación.\nUna vez desplegada toda la infraestructura con Terraform, vamos a conectarnos al nodo master por ssh el cual será desde donde lanzaremos los comandos de ansible, pero antes desde nuestro equipo local haremos:\n\n```console\ntoni@tonipc:~$ MASTER=100.111.122.133 # IP pública asignada a master en Azure\ntoni@tonipc:~$ scp ~/.ssh/id_rsa ~/.ssh/id_rsa.pub  adminUsername@$MASTER:~/.ssh\ntoni@tonipc:~$ ssh adminUsername@$MASTER\n```\n\nUna vez conectados a master, haremos:\n\n```console\n[adminUsername@master ~]$ sudo yum install epel-release -y\n[adminUsername@master ~]$ sudo yum install ansible git -y\n[adminUsername@master ~]$ sudo sed '/host_key_checking/s/^#//g' -i /etc/ansible/ansible.cfg\n[adminUsername@master ~]$ git clone https://github.com/toninoes/devopsunirp2.git\n[adminUsername@master ~]$ cd devopsunirp2/ansible/\n[adminUsername@master ~]$ ./deploy.sh\nPLAY [Hacerlos en todos los hosts] *********************************************\n\nTASK [Gathering Facts] *********************************************************\nok: [worker01]\nok: [nfs]\nok: [master]\n\nTASK [all : Antes de actualizar todas las máquinas] ****************************\nchanged: [nfs]\nchanged: [worker01]\nchanged: [master]\n...\n...\n...\nPLAY [Hacerlo en master] ***********************************************************************************************************************************************\n\nTASK [Gathering Facts] *************************************************************************************************************************************************\nok: [master]\n\nTASK [app : Copiar fichero de la aplicacion] ***************************************************************************************************************************\nchanged: [master]\n\nTASK [Deploy application] **********************************************************************************************************************************************\nchanged: [master]\n\nPLAY RECAP *************************************************************************************************************************************************************\nmaster                     : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0\n\n```\n\n...y trás un rato estará todo desplegado.\n\n## Verificaciones\n\nPara verificar que los nodos están Ready:\n\n```console\n[root@master adminUsername]# kubectl get nodes\nNAME       STATUS   ROLES                  AGE   VERSION\nmaster     Ready    control-plane,master   46m   v1.21.2\nworker01   Ready    \u003cnone\u003e                 46m   v1.21.2\n[root@master adminUsername]#\n[root@master adminUsername]#\n[root@master adminUsername]#\n[root@master adminUsername]# kubectl get pods -A -o wide\nNAMESPACE            NAME                                       READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES\ncalico-system        calico-kube-controllers-7f58dbcbbd-r7lr4   1/1     Running   0          47m   192.169.219.65   master     \u003cnone\u003e           \u003cnone\u003e\ncalico-system        calico-node-gmkbg                          1/1     Running   0          47m   192.168.1.110    master     \u003cnone\u003e           \u003cnone\u003e\ncalico-system        calico-node-hzgxf                          1/1     Running   0          47m   192.168.1.111    worker01   \u003cnone\u003e           \u003cnone\u003e\ncalico-system        calico-typha-76569fffb4-6bj84              1/1     Running   0          46m   192.168.1.111    worker01   \u003cnone\u003e           \u003cnone\u003e\ncalico-system        calico-typha-76569fffb4-gcj7d              1/1     Running   0          47m   192.168.1.110    master     \u003cnone\u003e           \u003cnone\u003e\ndefault              jenkins-74c7d654c9-hjl8r                   1/1     Running   0          18m   192.169.5.3      worker01   \u003cnone\u003e           \u003cnone\u003e\nhaproxy-controller   haproxy-ingress-65c5db48c8-68mj7           1/1     Running   0          47m   192.169.5.1      worker01   \u003cnone\u003e           \u003cnone\u003e\nhaproxy-controller   ingress-default-backend-78f5cc7d4c-kqzcr   1/1     Running   0          47m   192.169.5.2      worker01   \u003cnone\u003e           \u003cnone\u003e\nkube-system          coredns-558bd4d5db-29dt8                   1/1     Running   0          47m   192.169.219.66   master     \u003cnone\u003e           \u003cnone\u003e\nkube-system          coredns-558bd4d5db-6q4xh                   1/1     Running   0          47m   192.169.219.67   master     \u003cnone\u003e           \u003cnone\u003e\nkube-system          etcd-master                                1/1     Running   0          47m   192.168.1.110    master     \u003cnone\u003e           \u003cnone\u003e\nkube-system          kube-apiserver-master                      1/1     Running   0          47m   192.168.1.110    master     \u003cnone\u003e           \u003cnone\u003e\nkube-system          kube-controller-manager-master             1/1     Running   0          47m   192.168.1.110    master     \u003cnone\u003e           \u003cnone\u003e\nkube-system          kube-proxy-ck6p6                           1/1     Running   0          47m   192.168.1.110    master     \u003cnone\u003e           \u003cnone\u003e\nkube-system          kube-proxy-xlcsn                           1/1     Running   0          47m   192.168.1.111    worker01   \u003cnone\u003e           \u003cnone\u003e\nkube-system          kube-scheduler-master                      1/1     Running   0          47m   192.168.1.110    master     \u003cnone\u003e           \u003cnone\u003e\ntigera-operator      tigera-operator-86c4fc874f-ktfzf           1/1     Running   0          47m   192.168.1.110    master     \u003cnone\u003e           \u003cnone\u003e\n[root@master adminUsername]#\n[root@master adminUsername]#\n[root@master adminUsername]# kubectl get pods\nNAME                       READY   STATUS    RESTARTS   AGE\njenkins-74c7d654c9-hjl8r   1/1     Running   0          21m\n```\n\nVemos con el get pods que nuestro jenkins está corriendo. Y ahora los eventos que han sucedido en nuestro clúster:\n\n```console\n[root@master adminUsername]# kubectl get events\nLAST SEEN   TYPE     REASON                    OBJECT                          MESSAGE\n23m         Normal   Scheduled                 pod/jenkins-74c7d654c9-hjl8r    Successfully assigned default/jenkins-74c7d654c9-hjl8r to worker01\n22m         Normal   Pulling                   pod/jenkins-74c7d654c9-hjl8r    Pulling image \"jenkins/jenkins:lts\"\n22m         Normal   Pulled                    pod/jenkins-74c7d654c9-hjl8r    Successfully pulled image \"jenkins/jenkins:lts\" in 27.992273494s\n22m         Normal   Created                   pod/jenkins-74c7d654c9-hjl8r    Created container jenkins\n22m         Normal   Started                   pod/jenkins-74c7d654c9-hjl8r    Started container jenkins\n23m         Normal   SuccessfulCreate          replicaset/jenkins-74c7d654c9   Created pod: jenkins-74c7d654c9-hjl8r\n23m         Normal   ScalingReplicaSet         deployment/jenkins              Scaled up replica set jenkins-74c7d654c9 to 1\n52m         Normal   NodeHasSufficientMemory   node/master                     Node master status is now: NodeHasSufficientMemory\n52m         Normal   NodeHasNoDiskPressure     node/master                     Node master status is now: NodeHasNoDiskPressure\n52m         Normal   NodeHasSufficientPID      node/master                     Node master status is now: NodeHasSufficientPID\n52m         Normal   Starting                  node/master                     Starting kubelet.\n52m         Normal   NodeHasSufficientMemory   node/master                     Node master status is now: NodeHasSufficientMemory\n52m         Normal   NodeHasNoDiskPressure     node/master                     Node master status is now: NodeHasNoDiskPressure\n52m         Normal   NodeHasSufficientPID      node/master                     Node master status is now: NodeHasSufficientPID\n52m         Normal   NodeAllocatableEnforced   node/master                     Updated Node Allocatable limit across pods\n52m         Normal   RegisteredNode            node/master                     Node master event: Registered Node master in Controller\n52m         Normal   Starting                  node/master                     Starting kube-proxy.\n51m         Normal   NodeReady                 node/master                     Node master status is now: NodeReady\n51m         Normal   Starting                  node/worker01                   Starting kubelet.\n51m         Normal   NodeHasSufficientMemory   node/worker01                   Node worker01 status is now: NodeHasSufficientMemory\n51m         Normal   NodeHasNoDiskPressure     node/worker01                   Node worker01 status is now: NodeHasNoDiskPressure\n51m         Normal   NodeHasSufficientPID      node/worker01                   Node worker01 status is now: NodeHasSufficientPID\n51m         Normal   NodeAllocatableEnforced   node/worker01                   Updated Node Allocatable limit across pods\n51m         Normal   RegisteredNode            node/worker01                   Node worker01 event: Registered Node worker01 in Controller\n51m         Normal   Starting                  node/worker01                   Starting kube-proxy.\n51m         Normal   NodeReady                 node/worker01                   Node worker01 status is now: NodeReady\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftoninoes%2Fdevopsunirp2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftoninoes%2Fdevopsunirp2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftoninoes%2Fdevopsunirp2/lists"}