суббота, 2 апреля 2016 г.

Ansible в примерах. Часть 1

В данный момент я изучаю замечательный инструмент Ansible.

Ansible — сравнительно молодая система управления конфигурацией, его история насчитывает чуть более четырех лет. Но, несмотря на это, он стремительно и быстро ворвался в мир систем управления конфигурацией, потеснив Chef, Puppet и SaltStack.

Давайте посмотрим на него внимательно, чтобы понять, почему он так любим технарями.

Итак, чем же хорош ansbile:
- низкий порог входа;
- декларативный язык описания конфигурации;
- на управляемые узлы не нужно устанавливать никакого дополнительного ПО;
- просто написать дополнительный модуль.

Установку я описал чуть ранее: http://blog.asidorov.name/2016/02/ansible-ubuntu-1204.html



Добавим в /etc/ansible/hosts новый хост:
[test]
ubuntu ansible_ssh_host=192.168.0.102 ansible_connection=ssh ansible_ssh_user=root


Пример 1:

Создадим простой плейбук и проверим его работу:
# cat web-notls.yml 
- name: Configure webserver with nginx # название плейбука
  hosts: ubuntu # хосты к которым будет применен плейбук
  sudo: True
  tasks: # Задачи, которые надо выполнить на удаленном хосте
    - name: Install nginx # Название задачи
      apt: name=nginx update_cache=yes # используем модуль apt для обновления кеша пакетов (update_cache=yes) и установки nginx (name=nginx)

    - name: copy nginx config file # Скопируем файл files/nginx.conf с локального сервера на удаленный хост
      copy: src=files/nginx.conf dest=/etc/nginx/sites-available/default 

    - name: Enable configuration # создадим симлинк для включения сайта
      file: > 
        dest=/etc/nginx/sites-enabled/default
        src=/etc/nginx/sites-available/default
        state=link

    - name: copy index.html # скопируем с локального сервера файл templates/index.html.j2 с правами доступа 0644
      template: src=templates/index.html.j2 dest=/usr/share/nginx/html/index.html
        mode=0644

    - name: restart nginx # Перезапустим nginx
      service: name=nginx state=restarted

Содержимое files/nginx.conf:
# cat files/nginx.conf
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

root /usr/share/nginx/html;
index index.html index.htm;

server_name ans.com www.ans.com;

location / {
try_files $uri $uri/ =404;
}
}

Содержимое templates/index.html.j2:
# cat templates/index.html.j2 
<html>
<head>
<title>Welcome to ansible</title>
</head>
<body>
<h1> nginx, configured by Ansible</h1>
<p>If you can see this, Ansible successfully installed nginx.</p>

<p>{{ ansible_managed }}</p>
</body>
</html>

Запустим этот плейбук:
# ansible-playbook web-notls.yml

PLAY [Configure webserver with nginx] ******************************************

TASK [setup] *******************************************************************
ok: [ubuntu]

TASK [Install nginx] ***********************************************************
changed: [ubuntu]

TASK [copy nginx config file] **************************************************
changed: [ubuntu]

TASK [Enable configuration] ****************************************************
ok: [ubuntu]

TASK [copy index.html] *********************************************************
changed: [ubuntu]

TASK [restart nginx] ***********************************************************
changed: [ubuntu]

PLAY RECAP *********************************************************************
ubuntu                     : ok=6    changed=4    unreachable=0    failed=0   

Так как я задал сервер нейм ans.com и прописал в hosts: 192.168.0.102 ans.com, то при заходе на ans.com получаю такую картину:


Пример 2:

Создадим плейбук для настройки nginx с TLS:
# cat web-tls.yml
- name: Configure webserver with nginx and tls
  hosts: ubuntu
  sudo: True 
  vars: # Определим переменные для плейбука
    key_file: /etc/nginx/ssl/nginx.key
    cert_file: /etc/nginx/ssl/nginx.crt
    conf_file: /etc/nginx/sites-available/default
    server_name: ans.com

  tasks:
    - name: Install nginx
      apt: name=nginx update_cache=yes cache_valid_time=3600

    - name: create directories for ssl certificates # Создадим директорию для TLS
      file: path=/etc/nginx/ssl state=directory

# Копируем TLS файлы
    - name: copy TLS key
      copy: src=files/nginx.key dest={{ key_file }} owner=root mode=0600

    - name: copy TLS certificate
      copy: src=files/nginx.crt dest={{ cert_file }}

    - name: copy nginx config file
      template: src=templates/nginx.conf.j2 dest={{ conf_file }}

# Тут добавилось notify: restart nginx - это означает, что необходимо запустить обработчик с именем restart nginx
    - name: enable configuration
      file: dest=/etc/nginx/sites-enabled/default src={{ conf_file }} state=link
      notify: restart nginx

    - name: copy index.html
      template: src=templates/index.html.j2 dest=/usr/share/nginx/html/index.html mode=0644

# Сам обработчик, который перезапускает nginx
  handlers:
    - name: restart nginx
      service: name=nginx state=restarted

Генерируем SSL сертификат:
# openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -subj /CN=ans.com -keyout files/nginx.key -out files/nginx.crt
Generating a 2048 bit RSA private key
.........................................................................................+++
..........................+++
writing new private key to 'files/nginx.key'
-----

Содержимое templates/nginx.conf.j2:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

listen 443 ssl;

root /usr/share/nginx/html;
index index.html index.htm;

server_name {{ server_name }} www.{{ server_name }};
ssl_certificate {{ cert_file }};
ssl_certificate_key {{ key_file }};

location / {
try_files $uri $uri/ =404;
}
}

Запустим этот плейбук:
# ansible-playbook web-tls.yml
PLAY [Configure webserver with nginx and tls] **********************************

TASK [setup] *******************************************************************
ok: [ubuntu]

TASK [Install nginx] ***********************************************************
changed: [ubuntu]

TASK [create directories for ssl certificates] *********************************
ok: [ubuntu]

TASK [copy TLS key] ************************************************************
ok: [ubuntu]

TASK [copy TLS certificate] ****************************************************
ok: [ubuntu]

TASK [copy nginx config file] **************************************************
changed: [ubuntu]

TASK [enable configuration] ****************************************************
ok: [ubuntu]

TASK [copy index.html] *********************************************************
ok: [ubuntu]

RUNNING HANDLER [restart nginx] ************************************************
changed: [ubuntu]

PLAY RECAP *********************************************************************
ubuntu                     : ok=9    changed=3    unreachable=0    failed=0   



Комментариев нет:

Отправить комментарий