Настало время собраться с силами и выложить наконец 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
Если кто-то не помнит, про них я писал очень давно:
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
Комментариев нет:
Отправить комментарий