Ansible es un sistema de despliegue e instalación de configs/software, se puede pensar en él como un puppet pero los servidores a gestionar no corren ningún agente ni piden ninguna config si no que el servidor donde tenemos las configs las aplicará a los servidores bajo demanda a través de ssh cada vez que así lo desee el sysadmin. Las únicas dependencias son acceso ssh y las librerias de python necesarias según las operaciones que se quieran llevar a cabo.
Compilamos ansible:
emerge -av app-admin/ansible
En los servers a administrar es necesario tener gentoolkit instalado:
NOTA: Ansible lee toda nuestra config SSH -> ~/.ssh/config pero solo si se utiliza el modo openssh, si se habilita paramiko NO
Añadimos hosts a gestionar:
chown -R root:kr0m /etc/ansible/
chmod 775 /etc/ansible/
vi /etc/ansible/hosts
Pingeamos los hosts para asegurarnos de que hay conectividad:
node00 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Si tenemos acceso con un usuario restringido y queremos pasar a root mediante sudo.
Accedemos como bruce pasando a root mediante sudo:
Accedemos como bruce pasando a batman mediante sudo:
Podemos ejecutar un comando(Ad-Hoc command) en todos los servers con:
node00 | SUCCESS | rc=0 >>
Linux node00 4.4.0-16-generic #32-Ubuntu SMP Thu Mar 24 22:38:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
Para gestionar software:
http://docs.ansible.com/ansible/portage_module.html
Instalamos htop mediante ansible:
lxd00 | SUCCESS => {
"changed": false,
"msg": "Packages already present."
}
En el fichero de hosts se puede organizar por grupos:
[webservers]
foo.example.com
bar.example.com
[dbservers]
one.example.com
two.example.com
three.example.com
Además podemos indicar el puerto a utilizar:
badwolf.example.com:5309
También es posible utilizar patrones:
[webservers]
www[01:50].example.com
[databases]
db-[a:f].example.com
Si necesitamos utilizar variables para configurar los hosts se pueden definir aquí también:
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
Otra opción es dejar el listado de hosts “limpio” y definir las variables en otra sección:
[atlanta]
host1
host2
[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
También es posible tener el fichero de inventario de hosts/grupos en el fichero principal y meter las variables de grupos en:
ntp_server: acme.example.org
database_server: storage.example.org
Ansible dispone de una gran variedad de módulos, algunos de ellos son:
-
Usuarios:
ansible all -m user -a “name=foo password=”
ansible all -m user -a “name=foo state=absent” -
Repositorios de git:
ansible webservers -m git -a “repo=git://foo.example.org/repo.git dest=/srv/myapp version=HEAD” -
Servicios:
ansible webservers -m service -a “name=httpd state=started”
ansible webservers -m service -a “name=httpd state=restarted”
ansible webservers -m service -a “name=httpd state=stopped”
Los facts son variables que se pueden utilizar para tomar ciertas decisiones en la ejecución del playbook.
Podemos consultar los facts con:
Obtenemos el fact ansible_distribution y donde machee ejecutar X:
# talk to all hosts just so we can learn about them
- hosts: all
tasks:
- group_by: key=os_{{ ansible_distribution }}
- name: Gentoos stuff
hosts: os_Gentoo
tasks:
- name: install nano
portage: package=app-editors/nano state=present
- name: Ubuntuss stuff
hosts: os_Ubuntu
tasks:
- name: install nano
apt: name=nano state=present
Ejecutamos el playbook:
Podemos debugear ejecutando paso a paso el playbook:
También es posible ejecutar un playbook en un único host, en el playbook indicaremos - hosts: all y filtraremos con un argumento extra, –limit: