пятница, 7 декабря 2018 г.

Ansible: автоматизируем создание VPS

     Настало время собраться с силами и выложить наконец ansible скрипты для автоматизации развертывания vps.

Если кто-то не помнит, про них я писал очень давно:

VPS: Увеличим производительность системы - добавим в систему Swap
VPS: продолжаем настройку, усилим безопасность сервера
Обходим ограничения интернет тарифов, качаем торренты на мегафоне и открываем заблокированные сайты

  Постараюсь рассказать о способах организации циклов, работе со словарями, переменными и тд.



Для начала создадим файл инвентори: server.list, с содержимым:
server1_ip_address
server2_ip_address

Для удобства объеденим их в группу proxy:
[proxy]
server1_ip_address
server2_ip_address

Отредактируем конф файл ansible.cfg:

- В случае, если мы еще не настраивали сервер, и на нем все еще разрешен доступ руту, расскомментируем строку:
remote_user = root

после исполнения нашего плейбука доступ руту будет запрещен и этот параметр прийдется изменить на имя другого пользователя (так же созданного в процессе выполнения плейбука).
Можно вместо данного ключа указать ansible_user=root в инвентори файле:
[proxy]
server1_ip_address ansible_user=root

- Расскомментируем, и установим в true  если не настроен доступ по ключам:
ask_pass      = True

- Раскомментируем и укажем путь для файла ключей (рекомендую  сначала выполнить плейбук, а затем прокинуть свой ключ под свежесозданного пользователя):
private_key_file = /path/to/file

Создаем файл main.yml :
я специально смешал в одном файле различные методы написания тасков (непосредственно в main и включением из отдельного файла, применение переменных, словари и тд)

# указываем область применения плейбука
# все хосты из группы proxy
- hosts: proxy


# работаем с файлами,
# удалим старый resolv.conf и создадим новый, с гугловыми серверами
    - name: Delete old resolv.conf
      file: path=/etc/resolv.conf state=absent
      become: yes

    - name: Change Name Servers
      lineinfile: path=/etc/resolv.conf state=present line="{{item}}"
      become: yes
      with_items:
        - 'nameserver 8.8.8.8'
        - 'nameserver 8.8.4.4'


# работа с менеджером пакетов apt
# укажем список пакетов для установки и пройдем циклом
# перечислим все пакеты с новой строки с дефисом.

    - name: Install additional packets
      apt: name={{item}} state=present update_cache=yes
      become: yes
      with_items:
        - bash-completion


# подключаем таски из внешних файлов
    - include: swap.yml
 

# используем словарь для описания пользователей,
# которых требуется создать на сервере
# используется во внешнем файле sshd.yml
    - include: sshd.yml
      vars:
        users:
          - { name: 'admin', password:  'passwd2345' }
          #- { name: 'admin1', password:  'passwd2345' }
         
    - include: iptables.yml
 

# Обработчики событий, вызываются при внесении изменений
# оператором notify. Имя - name должно быть одинаковым у хендлера и notify

  handlers:
      - name: restart sshd
        service: name=sshd state=reloaded
        become: yes   




Файл swap.yml :

---
# работа с фактами ansible
# и обработка ошибок
# проверяем размер свопа, если размер меньше половины рам
# регистрируем переменную swap

    - name: check swap size
      shell: /usr/bin/true
      register: swap
      when: ansible_swaptotal_mb < ansible_memfree_mb / 2

# игнорируем возможные ошибки
      ignore_errors: true
      tags: swap

# дебажим - смотрим состояние переменных, для удобства отслеживания
# в процессе разработки
    - debug:
        msg: "{{ swap }}"
      tags: swap


# удаляем старый своп файл /swapfile
# при условии, что переменная из предыдущего шага TRUE
# т.е размер свопа действительно меньше половины рамы
    - name: 0. Delete old swapfile
      command: swapoff /swapfile
      become: yes
      when: swap|bool  == true
      tags: swap

# устанавливаем метки, чтобы в дальнейшем вызывать таски только для одного тега
      tags: swap

# создаем новый своп, размером в половину рам
    - name: 1. Create Swap
# работа с модулем command
      command: dd if=/dev/zero of=/swapfile bs={{ ansible_memfree_mb / 2}} count=512k
      become: yes
      when: swap|bool  == true
      tags: swap

    - name: 2. mkswap /swapfile
      command: mkswap /swapfile
      become: yes
      when: swap|bool  == true
      tags: swap

    - name: 3. swapon /swapfile
      command: swapon /swapfile
      become: yes
      when: swap|bool  == true
      tags: swap

    - name: 4. Edit fstab

# работа с модулем line_in_file
      lineinfile: "path='/etc/fstab' line='/swapfile       none    swap    sw      0       0 '"
      become: yes

     when: swap|bool  == true


 Файл sshd.yml :

---
# работа с пользователеми
# создадим необходимых пользователей
# перечисленных в словаре  users
    - name: create non root user
# парсим словарь item.name - имя пользователя, item.password - пароль
      user: "name='{{ item.name }}' groups='sudo' shell='/bin/bash' password='{{ item.password | password_hash('sha512') }}'"
      become: yes
      tags: ssh
      with_items: "{{ users }}"


# Добавим всех созданных пользователей в sudoers
    - name: grant sudo to users
      lineinfile: "path='/etc/sudoers' line='{{ item.name }} ALL = (ALL) NOPASSWD: ALL'"
      with_items: "{{ users }}"
      become: yes
      tags: ssh


# запретим вход на сервер пользователю root (необходимо будет поменять пользователя в конфиге ansible, ключ remote_user)
    - name: Setting up sshd
      replace:
        dest: /etc/ssh/sshd_config
        regexp:  '{{ item.regexp }}'
        replace: '{{ item.line }}'
      with_items:
        - { regexp: '^#?PermitRootLogin yes*',               line: 'PermitRootLogin no' }
      tags: ssh
      become: yes

# Если был изменен конфиг sshd вызовем хендлер из main.yml
# и перезапустим sshd
      notify: restart sshd 


 Файл iptables.yml :

---
# используем готовый файл iptables созданный с помощью iptables-save,
# файл rool.new необходимо положить в поддиректорию files.
# в результате выполнения, наш файл будет загружен на сервер
# в директорию /root/
    - name: 0. Update IP tables Conf
      copy: src=files/rool.new dest=/root/rool.new
      become: yes
      tags: iptables
 

# восстановим правила iptables из нашего файла
    - name: 1. Apply new IP tables conf
      shell: iptables-restore /root/rool.new
      become: yes     
      tags: iptables

 

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

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

Популярные сообщения