= DevOps Sesión 11 (2022-03-16) Ansible
== Documentación relacionada
* ./4-Topic 704 Configuration Management
* ./Material Curso Ansible/DO407-AUTOMATION WITH ANSIBLE I.pdf
* ./Material Curso Ansible/Introduccion Ansible.txt
* ./Material Curso Ansible/Curso Ansible 2020.pdf
== Ansible
* ./Material Curso Ansible/DO407-AUTOMATION WITH ANSIBLE I.pdf
* [[https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html]]
vagrant up
vagrant ssh master-ansible
su -
ansible all -m ping
* agentless
* no permite deshacer (deberías crear otro playbook para deshacer y hay errores que no se pueden deshacer)
* no instalación base
* no monitoriza cambios
* otras herramientas
* puppet
* chet
* ansible
* salt
* nodo control, hosts administrados
* nodo control: tiene ansible (solo Linux)
* gestión hosts fichero txt
* /etc/ansible/hosts
* gestión a través de ssh (claves público-privadas)
=== defs
* Controller Machine: el equipo donde está instalado Ansible, es el responsable de ejecutar el aprovisionamiento en los servidores de destino
* Inventory: el fichero que contiene la información de los servidores que gestiona Ansible
* Playbook: el Sistema de aprovisionamiento de servidores, el cual está definido en un fichero con formato YAML
* Task: el bloque que define el procedimiento a realizar en el servidor de destino:modificar un fichero, instalar un paquete, etc…
* Module: es una capa abstracta de las tareas del Sistema, como crear o modidicar un fichero
* Role: es una forma de organizar nuestros PlayBooks para poder reusar código
* Play: es la ejecución de un aprovisionamiento, en pocas palabras: es lanza un PlayBook
* Facts: variables globales que contienen información del sistema
* Handlers: se usa para cambiar el estado de los servicios, como podría ser reiniciar, parar, etc un servicio
ansible --version
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /bin/ansible
python version = 2.7.5 (default, Jun 20 2019, 20:27:34) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
* **/etc/ansible/ansible.cfg**
* fichero configuración básica
* 4 módulos/secciones básicos
=== install
* server: python > 2.6
* clientes: python > 2.4
* configurar autenticación basada en SSH-KEYGEN
=== facts
* variables globales que contienen información del sistema
* ''ansible clientes -m setup | grep ansible_''
== inventory
* listado de hosts (estático)
* un host puede pertener a varios grupos (o no)
* recomendación crear inventarios por entornos
* dejar el inventario por defecto vacío (o dejar en blanco la variable de **ansible.cfg**)
* ''ansible -i /etc/ansible/desarrollo clientes -a "yum remove mc -y"''
* cambio fichero inventario
* ''ansible all %%--%%list-hosts''
* **[grupo:children]**: capacidad de añadir grupos al grupo
* variables sobre los hosts del inventario
* ansible_connection: tipo de conexión al host
* ansible_host: nombre del host, si es diferente del alias
* ansible_port: si no es el 22
* ansible_user:
* ansible_ssh_pass
* [[https://docs.ansible.com/ansible/2.3/playbooks_best_practices.html#best-practices-for-variables-and-vaults]]
* ansible_become: ansible_sudo, ansible_su, escalada de privilegios
* ansible_become_method
* ansible_become_user
* rangos [START:END]:
* 192.168.[4:7].[0:255]
* server[01:20].example.com
=== variables
* **[all:vars]**
* **[:vars]**
== comandos
=== adhoc
* comando adhoc (no módulo): ''ansible clientes -m command -a "yum remove mc -y"''
* se puede obviar el **-m command** porque es comando por defecto
=== help
* ''ansible-doc ''
* ''ansible-doc -s '': sumarizado
== playbooks
* libro de jugadas
* nodos afectados
* lista de tareas
* formato YAML
* recomendable empezar con **---** y acabar con *...* el fichero (para debug errores)
* ''ansible-playbook''
* ''%%--%%symtax-check''
* ''%%--%%check''
* ''%%--%%list-tasks''
* ''%%--%%step''
* ''%%--%%start-at-taks''
* ''%%--%%verbose''
* idempotencia: una tarea vuelta a ejecutar no la duplica, lo deja como está.
* Si se produce un error en una de las jugadas (a menos que se indique lo contrario **ignore_errors: True** [[https://docs.ansible.com/ansible/latest/user_guide/playbooks_error_handling.html|errores]]), se para la ejecución del playbook
=== .yaml
name: ...
gather_facts: No # ignorar recogida de variables
hosts: clientes # mirar patrones
user: root
tasks:
- name: Install Yum Instal
copy:
src: /etc/sudoers
dest: /etc/sudoers.edit
=== patrones
* separados por puntos o comas
* negar con **!**
* AND (ha de pertener a todos los grupos indicados): **&**
=== lab
ansible --version
ansible clientes -m setup | grep ansible_
ansible all --list-hosts
ansible clientes -m ping
ansible all -a "df -h /"
ansible all -a "cat /etc/redhat-release"
ansible --limit 192.168.33.12 all -a "cat /etc/redhat-release"
ansible clientes -m yum -a "name=nginx state=present"
ansible clientes -m yum -a "name=nginx state=absent"
ansible clientes -s -m shell -a "tail /var/log/messages | grep ansible-command | wc -l"
ansible clientes -m shell -a "tail /var/log/messages | grep ansible-command | wc -l"
ansible all -m shell -a "rpm -qa | egrep 'vim-enhanced|wget|unzip|mc'"
ansible clientes -v -a "id"
ansible clientes -vv -a "id"
ansible clientes -vvv -a "id"
* [[https://www.mkpasswd.net/index.php]] -> crypt-sha512
ansible cliente12 -m user -a "name=miercoles16 password=`echo '$6$8fCcohUEdyTjoXDd$gbqpwJzxU08YS6nhZwy6zwFCncBgpTxNHClS.MSKYOR1eQ7N68vCHCENpNnK83KbTo9LFEbvtoZYqiPF9mcDh/'` update_password=always state=present"
# asdasd
ansible cliente12 -m shell -a "cat /etc/passwd | grep miercoles16"
ansible cliente12 -m user -a "name=miercoles16 state=absent"
== Módulos
* se pueden indicar los parámetros en 1 línea o indentando en líneas separadas
=== copy
[[https://docs.ansible.com/ansible/2.9/modules/copy_module.html]]
===lineinfile
[[https://docs.ansible.com/ansible/2.9/modules/lineinfile_module.html]]
== Extra
* [[https://www.mkpasswd.net/]]
=== k8s
* [[https://k8syaml.com]]
* [[https://k3s.io/]]
* [[https://containerd.io/]]