Introducció
Ansible és una plataforma senzilla d'automatització de TI de codi obert. Pot configurar sistemes, desplegar programari, executar treballs ad hoc i organitzar tasques de TI més avançades com ara desplegaments o actualitzacions contínues sense temps d'inactivitat.
A continuació, et mostrem algunes característiques que fan que Ansible sigui únic:
- Gestiona les màquines sense agents aprofitant el dimoni SSH existent, de manera que no calen ports oberts addicionals ni agents personalitzats addicionals a les màquines remotes.
- Permet descriure la infraestructura en un llenguatge entenedor tant per a les màquines com per a les persones.
- Té una àmplia col·lecció de rols.
- Se centra en la seguretat aprofitant els estàndards existents.
- Segueix un cicle de llançament previsible presentat al full de ruta públic.
- Permet desenvolupar mòduls en qualsevol llenguatge dinàmic, no només en Python.
En aquest tutorial senzill, aprovisionarem un servidor Ubuntu 18.04 amb Ansible. A més, explorarem coses com ara mòduls d'Ansible, playbooks i rols.
Requisits previs
- Ansible 2.9+ instal·lat en una màquina local. Si ho necessites, pots consultar aquestes instruccions d'instal·lació.
- Coneixements bàsics de sistemes Unix (SSH, paquets Deb).
- Servidor Ubuntu 18.04 amb accés SSH (mitjançant un parell de claus SSH públiques i privades).
Fitxer d'inventari
Abans de poder fer res amb Ansible, hem d'especificar una llista d'amfitrions que Ansible controlarà. La manera més fàcil és crear un fitxer d'inventari estàtic, com presentem a continuació:
[web]
85.208.21.90
[web:vars]
ansible_user=root
ansible_port=22
ansible_ssh_private_key_file=privateKey.pem
Algunes coses que cal tenir en compte abans de continuar:
- Hem creat un grup d'inventari web amb l'adreça IP pública del nostre servidor Ubuntu 18.04. Hi ha molt més, així que pots donar un cop d'ull a la primera guia d'inventari per comprendre millor què pots aconseguir.
- També hem definit variables compartides per al grup web, indicant a Ansible quina clau privada SSH, port i usuari ha d'utilitzar.
- Hem utilitzat l'inventari estàtic, però Ansible també és compatible amb l'inventari dinàmic, que és especialment útil quan les màquines remotes s'encenen i s'apaguen sovint.
Si volguéssim aprovisionar més servidors web, afegiríem més IP, cadascuna en una línia nova del grup web. Fins i tot podríem utilitzar claus SSH privades diferents per amfitrió, com es mostra més avall.
[web]
85.208.21.90 ansible_ssh_private_key_file=privateKey1.pem
85.208.21.95 ansible_ssh_private_key_file=privateKey2.pem
[web:vars]
ansible_user=root
ansible_port=22
Nota
Si us plau, consulta la guia de paràmetres de comportament de l'inventari per obtenir més informació sobre altres variables disponibles d'Ansible.
Mòduls d'Ansible
La manera més ràpida de veure Ansible en acció és experimentar amb la seva interfície bàsica de línia d'ordres Ansible.
# ansible web -i inventory -m ping
En l'exemple anterior, hem utilitzat el mòdul ping i l'hem executat en totes les màquines del grup web definit al nostre fitxer d' inventari. Ping és un mòdul que s'utilitza habitualment per verificar la capacitat d'iniciar sessió i comprovar si l'executable de Python s'ha configurat correctament a les màquines remotes.
Vegem un altre exemple que utilitza l'indicador --check per habilitar un mode d'execució en sec:
# ansible web --check -i inventory -m apt -a "name=nodejs state=latest"
Aquí hem utilitzat el mòdul apt per instal·lar el paquet més recent de nodejs a les mateixes màquines del nostre grup web. Si el paquet nodejs ja s'ha instal·lat, Ansible no ho tornarà a fer, com es mostra més avall:
85.208.21.90 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"cache_update_time": 1586849592,
"cache_updated": false,
"changed": false
}
Tot i que aquests exemples ad hoc mostren com treballar amb amfitrions remots utilitzant mòduls Ansible i CLI Ansible, la millor part encara ha d'arribar. Explorem junts els playbooks d'Ansible.
Playbooks d'Ansible
Els playbooks d'Ansible contenen el llenguatge de configuració, desplegament i orquestració d'Ansible. Tenen el format YAML, estan dissenyats per ser llegibles per persones i estan pensats per mantenir-se en el control de codi font.
Comencem amb un llibre d'estadístiques senzill stats.yml que recopilarà informació variada sobre les nostres màquines remotes:
- name: Stats
hosts: all
gather_facts: True
tasks:
- name: Debug Gathered Facts
debug:
var: item
with_items:
- "{{ ansible_lsb }}"
- "{{ ansible_default_ipv4 }}"
- "{{ ansible_date_time }}"
- "{{ ansible_dns }}"
- "{{ ansible_env }}"
- "{{ ansible_hostname }}"
- "{{ ansible_memory_mb }}"
- "{{ ansible_memfree_mb }}"
- name: Capture OS Name
command: uname -a
register: os_name
- name: Debug OS Name
debug:
var: os_name.stdout
Abans de continuar, intentem comprendre què acaba de passar.
- gather_facts és un booleà que controla si el play executarà automàticament la tasca de setup per recopilar dades dels amfitrions. Podríem ometre'l, ja que és True per defecte.
- hosts defineix una llista de grups, amfitrions o patrons d'amfitrió que es tradueix en una llista d'amfitrions remots als quals ens adreçarem. Hem utilitzat el grup predeterminat all, ja que volem obtenir estadístiques de tots els nostres amfitrions.
- remote_user defineix un usuari utilitzat per iniciar sessió a la destinació mitjançant el connector de connexió. En el nostre cas, és redundant perquè també hem definit ansible_user al nostre fitxer d' inventari.
- Els mòduls de setup i debug ajuden a depurar les variables d'amfitrió recopilades per Ansible. Si vols veure totes les variables possibles, pots fer-ho a la documentació de variables de dades d'Ansible.
Ara que ja tenim els coneixements bàsics del playbook d'Ansible, intentem executar-lo amb el CLI ansible-playbook com es mostra a continuació:
# ansible-playbook -i inventory stats.yml
Com a resultat, hauríem de veure una cosa semblant al fragment següent. (Tingues en compte que s'ha eliminat part del fragment per motius de brevetat).
PLAY [Stats] ************************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************************
ok: [85.208.21.90]
TASK [Debug Gathered Facts] *********************************************************************************************************************************
ok: [85.208.21.90] => (item={'id': 'Ubuntu', 'description': 'Ubuntu 18.04 LTS', 'release': '18.04', 'codename': 'bionic', 'major_release': '18'}) => {
"ansible_loop_var": "item",
"item": {
"codename": "bionic",
"description": "Ubuntu 18.04 LTS",
"id": "Ubuntu",
"major_release": "18",
"release": "18.04"
}
}
...
ok: [85.208.21.90] => (item={'nameservers': ['127.0.0.53']}) => {
"ansible_loop_var": "item",
"item": {
"nameservers": [
"127.0.0.53"
]
}
}
...
ok: [85.208.21.90] => (item=578) => {
"ansible_loop_var": "item",
"item": 578
}
TASK [Capture OS Name] **************************************************************************************************************************************
changed: [85.208.21.90]
TASK [Debug OS Name] ****************************************************************************************************************************************
ok: [85.208.21.90] => {
"os_name.stdout": "Linux tekmi 4.15.0-96-generic #97-Ubuntu SMP Wed Apr 1 03:25:46 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux"
}
PLAY RECAP **************************************************************************************************************************************************
85.208.21.90 : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Amb això, hem provat el poder d'automatització d'Ansible. Tot i així, per anar més enllà, explorem junts la galàxia Ansible i l'ecosistema de rols.
Playbooks d'Ansible amb rols
Pots escriure un playbook complex en un fitxer llarg, però no seria més pràctic reutilitzar els fitxers i organitzar-ho tot millor? Per sort, Ansible se n'ha ocupat i ofereix tres maneres de fer-ho:
- includes
- imports
- roles
Includes i imports es van afegir a Ansible 2.4 i permeten dividir playbooks grans en fitxers més petits, que es poden utilitzar en diversos playbooks pare o fins i tot diverses vegades en el mateix playbook.
Roles permet més que el simple fet d'empaquetar les tasques juntes i pot incloure variables, gestors o fins i tot mòduls i altres connectors. També es poden compartir a través de la galàxia Ansible, un lloc web gratuït per trobar, descarregar i compartir rols desenvolupats per la comunitat.
En aquest tutorial, instal·larem dos rols: el rol PHP i el rol Composer, com es mostra més avall:
# ansible-galaxy install --roles-path . geerlingguy.php geerlingguy.composer
Després de descarregar aquests rols al directori actual (gràcies a --roles-path.), creem el nostre segon playbook, com es mostra a continuació:
- name: PHP and Composer
hosts: web
gather_facts: True
vars:
php_default_version_debian: "7.2"
php_enable_webserver: false
roles:
- geerlingguy.php
- geerlingguy.composer
Hi ha dues parts importants que hi tenen lloc:
- l'opció vars, que en el nostre cas sobreescriu dues variables del rol PHP. Aquesta opció té més coses per oferir, i per això pots explorar la guia de variables de playbook.
- l'opció roles, que permet utilitzar de manera estàtica qualsevol rol local o descarregat. Pel que fa a Ansible 2.4, també hi ha una opció include_role per utilitzar rols en línia i de manera dinàmica. Pots consultar la guia d'ús de rols per obtenir més informació.
Com amb qualsevol playbook, l'últim pas és executar-lo mitjançant el CLI ansible-playbook:
# ansible-playbook -i inventory php_composer.yml
I amb aquesta última ordre, hem acabat el nostre breu recorregut per Ansible. Enhorabona!
Resum
Hem explorat junts diverses parts interessants de l'eina d'automatització Ansible. Per resumir el nostre viatge, recapitulem què hem fet:
- Hem après a crear un inventari senzill i estàtic.
- Hem conegut diversos mòduls d'Ansible, incloent-hi depuració, configuració i ping.
- Hem creat un playbook senzill i hem depurat algunes variables d'amfitrions recopilades per Ansible.
- Hem descobert Ansible Galaxy i n'hem descarregat rols PHP i Composer.
Ansible és una plataforma d'automatització potent i cal temps per dominar-ne totes les funcions. Si vols ampliar els teus coneixements, pots llegir el llibre complet Ansible: en funcionament: automatització de la gestió de la configuració i del desplegament de manera fàcil.