Инструменты пользователя

Инструменты сайта


ansible

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
ansible [2016/01/28 07:08]
sander
ansible [2016/01/28 07:08] (текущий)
sander
Строка 1: Строка 1:
 +====== Ansible ======
 +Ansible является системой управления конфигурациями,​ установлен на сервере rastaban.
  
 +===== Установка. =====
 +
 +Добавляем в репозитории следующий источник:​
 +
 +<code bash>
 +deb http://​mirror.yandex.ru/​debian/​ testing main contrib non-free
 +</​code>​
 +Устанавливаем.
 +<code bash>
 +apt-get install ansible
 +</​code>​
 +
 +Так же для работы ansible необходим python 2.7 или выше.\\
 +\\
 +Конфигурационный файл находится в **/​etc/​ansible/​ansible.cfg**\\
 +Инвентаризационный файл(в нем описаны хосты и группы хостов) **/​etc/​ansible/​hosts**\\
 +
 +===== Подготовка к работе =====
 +
 +Для начала работы с ansible необходимо с генерировать ssh ключи и перенести публичные ключи на сервера с которыми будет осуществляться работа.
 +
 +Работаем под своим пользователем.
 +<code bash>
 +ssh-keygen
 +ssh-copy-id username@server
 +</​code>​
 +
 +Проверка работы
 +<code bash>
 +ssh user@server
 +</​code>​
 +Должно произойти подключение без запроса пароля.
 +
 +<note important>​Имена пользователя на всех хостах должно быть одинаковым!!!</​note>​
 +
 +
 +===== Блокировка пользователей на mail и squid =====
 +
 +
 +==== Логика. ====
 +
 +Скрипт /​etc/​ansible/​scripts/​rm_user принимает в качестве первого параметра имя целевого пользователя,​ и начинает выполнение playbook -а /​etc/​ansible/​playbook/​pb_rm_user.yml,​ который выполняет скрипты /​etc/​ansible/​scripts/​squid/​squid_rm_user (комментирует пользователя в /​etc/​squid/​passwd ) и /​etc/​ansible/​scripts/​mail/​rm_user_mail (/​etc/​passwd и удаляет его из почтовых алиасов) на целевых хостах с необходимыми параметрами. Комментирование пользователя идет в формате #​дата#​пользователь выполнивший блокировку#​блокируемая запись.После выполнения playbook -а, скрипт выводит результат своего выполнения (показывает заблокированные записи в /etc/passwd и /​etc/​squid/​passwd,​ при проверке /​etc/​pstfix/​aliases выводится ошибка,​ т.к. записи о пользователе там уже нет). В конце вызывает playbook /​etc/​ansible/​playbook/​pb_send_mail_rm_user.yml,​ который отправляет письмо о том, что пользователь заблокирован.
 +
 +Пример вызова скрипта ​
 +<code bash>
 +cd /​etc/​ansible/​scripts
 +./rm_user username
 +</​code>​
 +
 +==== Скрипт блокировки пользователя в squid ====
 + 
 +/​etc/​ansible/​scripts/​squid/​squid_rm_user
 +<code bash>
 +#!/bin/bash
 +
 +#​Скрипт комментирует пользователя в /​etc/​squid/​passwd.
 +#​Скрипт принимает в качестве первого параметра имя пользователя,​ регистр не важен.
 +#09.11.2015 Титов Александр
 +
 +if [ $# -eq 2 ]; then
 +    var
 +    user=$(echo $1 | tr [A-Z] [a-z])
 +    file_passwd=/​etc/​squid/​passwd
 +    file_passwd_back=/​etc/​squid/​passwd.back
 +    date=`date +%d.%m.%Y`
 +
 +    #back file
 +    cp $file_passwd $file_passwd_back
 +
 +    #remove user from squid passwd
 +    sed -i "​s/​^$user:/#​$date#​$2#&/​g"​ $file_passwd
 +else
 +    echo "Use: $0 username"​
 +fi
 +</​code>​
 +
 +==== Скрипт блокировки пользователя в mail ====
 +/​etc/​ansible/​scripts/​mail/​rm_user_mail
 +
 +<code bash>
 +#!/bin/bash
 +
 +#​Cкрипт удаляет пользователя из почтовых алиасов и комментирует в passwd.
 +#​Скрипт принимает в качестве первого параметра имя пользователя,​ регистр не важен, все приводится к нижнему.
 +#Так же делаются бекапы файлов,​ после каждого выполнения они перезаписываются.
 +#09.11.2015 Титов Александр
 +
 +if [ $# -eq 2 ]; then
 +    #var
 +    user=$(echo $1 | tr [A-Z] [a-z])
 +    file_passwd=/​etc/​passwd
 +    file_alias=/​etc/​postfix/​aliases
 +    file_passwd_back=/​etc/​passwd.back
 +    file_alias_back=/​etc/​postfix/​aliases.back
 +    date=`date +%d.%m.%Y`
 +
 +    #back file
 +    cp $file_passwd $file_passwd_back
 +    cp $file_alias $file_alias_back
 +
 +    #remove user from passwd
 +    sed -i "​s/​^$user:/#​$date#​$2#&/​g"​ $file_passwd
 +
 +    #remove user from aliases
 +    sed  -i "​s/,​$user,/,/​g ; s/,​$user$//​g ; s/​all:​\t$user,/​all:​\t/​ ; s/:​\t$user$//​g"​ $file_alias
 +    sed  -i "​s/​^[a-zA-Z0-9]*$//​g"​ $file_alias
 +
 +    #take aliases
 +    newaliases
 +else
 +    echo "Use: $0 username"​
 +fi
 +</​code>​
 +
 +==== Playbook удаления пользователя ====
 +/​etc/​ansible/​playbook/​cat pb_rm_user.yml
 +<code yaml>
 +- hosts: pismis
 +  tasks:
 +  - name: remove user from squid
 +    script: /​etc/​ansible/​scripts/​squid/​squid_rm_user {{ username }} {{adminuser}}
 +    become: yes
 +
 +- hosts: mail
 +  tasks:
 +  - name: remove user from mail
 +    script: /​etc/​ansible/​scripts/​mail/​rm_user_mail {{ username }} {{adminuser}}
 +    become: yes
 +</​code>​
 +
 +
 +==== Playbook отправки письма ====
 +/​etc/​ansible/​playbook/​pb_send_mail_rm_user.yml
 +<code yaml>
 +- hosts: localhost
 +  tasks:
 +  - name: send mail
 +    mail:
 +      host='​10.1.0.77'​
 +      port=25
 +      headers="​Content-type=text/​html"​
 +      to="​Technical support <​tp@vzljot.ru>,​ System administrators <​st@vzljot.ru>,​ Specialist in information security <​kononovvv@vzljot.ru>"​
 +      subject='​User {{ username ​ }} is locked by {{ adminuser }}.'
 +      body='​User {{ username ​ }} is locked by {{ adminuser }}.'
 +      from="​rastaban@vzljot.ru"​
 +</​code>​
 +==== Итоговый скрипт объединяющий все это и выполняющий проверку ====
 +/​etc/​ansible/​scripts/​rm_user
 +
 +<code bash>
 +#!/bin/bash
 +#Титов А.В. 10.11.2015
 +#​Скрипт комментирует целевого пользователя на mail и squid, удаляет его из почтовых алиасов.
 +#В качестве входного параметра принимается имя пользователя в транслите.
 +
 +if [ $# -eq 1 ]; then
 +    rmuser=$( echo $1 | tr [A-Z] [a-z] )
 +    echo $rmuser
 +    ansible-playbook /​etc/​ansible/​playbook/​pb_rm_user.yml -u${USER} --ask-become-pass --extra-vars="​username=${rmuser} adminuser=${USER}"​
 +    echo "​Пользователь $rmuser на mail в /​etc/​passwd"​
 +    ansible mail -u${USER} -m command -a "grep $rmuser /​etc/​passwd"​
 +    echo "​Пользователь $rmuser на mail в /​etc/​postfix/​aleases"​
 +    ansible mail -u${USER} -m command -a "grep $rmuser /​etc/​postfix/​aliases"​
 +    echo "​Пользователь $rmuser на pismis в /​etc/​squid/​passwd"​
 +    ansible pismis -u${USER} -m command -a "grep $rmuser /​etc/​squid/​passwd"​
 +    ansible-playbook /​etc/​ansible/​playbook/​pb_send_mail_rm_user.yml -u${USER} --extra-vars="​username=${rmuser} adminuser=${USER}"​
 +
 +else
 +    echo "Use: $0 username"​
 +fi
 +</​code>​
 +
 +
 +===== Создание пользователей на mail и proxy =====
 +
 +
 +==== Логика. ====
 +
 +Скрипт /​etc/​ansible/​scripts/​create_user принимает в качестве первого параметра имя целевого пользователя,​ в качестве второго ФИО пользователя в кавычках,​ и начинает выполнение playbook -а /​etc/​ansible/​playbook/​pb_add_user.yml который выполняет скрипты /​etc/​ansible/​scripts/​squid/​squid_pass (создает пользователя в /​etc/​squid/​passwd) и /​etc/​ansible/​scripts/​mail/​create_user_mail (создает пользователя в /​etc/​passwd,​ добавляет его в группу popusers и добавляет его в алиас all в /​etc/​postfix/​aliases). В случае успешного выполнения данного playbook -а, начинает выполнятся следующий /​etc/​ansible/​playbook/​pb_send_mail_add_user.yml,​ данный playbook собирает созданные пароли для пользователя и отправляет их на почту st, tp и kononovvv@vzljot.ru,​ в теме письма указывается пользователь для которого сгенерированы пароли и администратор,​ который их создал.
 +
 +Пример вызова скрипта ​
 +<code bash>
 +cd /​etc/​ansible/​scripts
 +./​create_user username "​ФИО"​
 +</​code>​
 +
 +==== Скрипт создания пользователя squd ====
 +/​etc/​ansible/​scripts/​squid/​squid_pass
 +<code bash>
 +#!/bin/bash
 +#​Скрипт для смены пароля или создания пользователя squid
 +#24.09.2015 Титов А.В.
 +#​Запускаем скрипт ./squdPass username
 +#​Регистр не важен, все приводится к нижнему
 +
 +if [ $# -eq 1 ]; then
 +    user=$(echo $1 | tr [A-Z] [a-z] )
 +    pass=$(date +%H%M)
 +    htpasswd -b /​etc/​squid/​passwd $user $pass
 +    echo $user":"​$pass > user_pass
 +else
 +    echo "Use: $0 username"​
 +fi
 +</​code>​
 +
 +==== Скрипт создания пользователя на mail ====
 +/​etc/​ansible/​scripts/​mail/​create_user_mail
 +<code bash>
 +#!/bin/sh
 +
 +upasswd=`/​usr/​bin/​pwgen -1cns`
 +username=`echo $1|tr "​A-Z"​ "​a-z"​`
 +comment=`echo $2 | iconv -f utf-8 -t cp1251`
 +
 +
 +
 +if [ -z $1 ]; then
 +    echo '​Missing "​username"​ field'
 +    exit 1
 +fi
 +
 +if [ -z "​$2"​ ]; then
 +    echo '​Missing "​comment"​ field'
 +    exit 1
 +fi
 +
 +useradd $username -s "/​bin/​false"​ -g popusers -c "​$comment"​ && echo $username:​$upasswd | chpasswd
 +sed -i '​$s/​$/,'​$username'/'​ /​etc/​postfix/​aliases
 +newaliases
 +cat /etc/passwd | tail -1 | iconv -f cp1251 -t koi8-r >> /​etc/​passwd.koi8-r
 +echo "​$username:​$upasswd"​ > user_pass
 +</​code>​
 +
 +==== Playbook для создания пользователя ====
 +/​etc/​ansible/​playbook/​pb_add_user.yml
 +
 +<code yaml>
 +- hosts: pismis
 +  gather_facts:​ no
 +  tasks:
 +  - name: create user on proxy
 +    script: /​etc/​ansible/​scripts/​squid/​squid_pass {{ username }}
 +    become: yes
 +  - name: fetch file whis passwd from remote hosts
 +    fetch: src=/​home/​{{ adminuser }}/​user_pass dest=/​home/​{{ adminuser }}/
 +
 +- hosts: mail
 +  gather_facts:​ no
 +  tasks:
 +  - name: create user on mail
 +    script: /​etc/​ansible/​scripts/​mail/​create_user_mail {{ username }} \"{{ fullname }}\"
 +    become: yes
 +  - name: fetch file whis passwd from remote hosts
 +    fetch: src=/​home/​{{ adminuser }}/​user_pass dest=/​home/​{{ adminuser }}/
 +</​code>​
 +
 +==== Playbook для отправки письма ====
 +/​etc/​ansible/​playbook/​pb_send_mail_add_user.yml
 +
 +<code yaml>
 +- hosts: localhost
 +  tasks:
 +  - name: send mail
 +    mail:
 +      host='​10.1.0.77'​
 +      port=25
 +      headers="​Content-type=text/​html"​
 +      to="​Technical support <​tp@vzljot.ru>,​ System administrators <​st@vzljot.ru>"​
 +      subject='​Passwords for {{ username ​ }} .Created by {{ adminuser }}.'
 +      body='​Domain {{username}}:​123456 ​   Mail {{ mailpass }}    Proxy {{ squidpass }}'
 +      from="​zabbix@vzljot.ru>"​
 +</​code>​
 +
 +==== Итоговый скрипт объединяющий все это ====
 +/​etc/​ansible/​scripts/​create_user
 +
 +<code bash>
 +#!/bin/bash
 +#Титов А.В. 10.11.2015
 +#​Скрипт создает пользователя на сервере mail и в squid.
 +#В качестве входных параметров принимается имя пользователя в транслите и ФИО в кавычках.
 +#После удачного создания пользователя его пароли отправляются на почту техподдержки.
 +
 +if [ $# -eq 2 ]; then
 +    cruser=$( echo $1 | tr [A-Z] [a-z] )
 +    fullname=\"​`echo $2`\"
 +    echo "​Create user: $cruser $fullname"​
 +    ansible-playbook /​etc/​ansible/​playbook/​pb_add_user.yml -u${USER} --ask-become-pass --extra-vars="​username=${cruser} adminuser=${USER} fullname=${fullname}"​
 +    if [ $? -eq 0 ]; then
 +        mailpass=`cat ~/​mail/​home/​$USER/​user_pass`
 +        squidpass=`cat ~/​pismis/​home/​$USER/​user_pass`
 +        ansible-playbook /​etc/​ansible/​playbook/​pb_send_mail_add_user.yml -u${USER} --extra-vars="​mailpass=${mailpass} squidpass=${squidpass} username=${cruser} adminuser=${USER}"​
 +    fi
 +else
 +    echo "Use: $0 username \"​fullname\""​
 +fi
 +</​code>​
 +
 +===== Заметки по ansible =====
 +
 +
 +<code bash>
 +1. ansible
 +
 +ansible all -i [inventory file] -u [user] -m [модуль команды] или ​ -a ['​команда'​]
 + 
 +Создайте пустой файл /​tmp/​hello_world,​ запустив ansible в ad-hoc режиме.
 +Используйте модуль file, передав к нему аргумент path=/​tmp/​hello_world state=touch.
 +Впишите получившуюся команду в файл solution.sh чтобы проверить решение.
 +
 +ansible all -i inventory.ini -m file -a '​path=/​tmp/​hello_world state=touch'​
 +
 +2. Файл инвенторизации infentory file
 +docs.ansaible.com
 +
 +[webservers]
 +123.123.123.1
 +133.111.213.2:​2222
 +[appservers]
 +yuppi ansible_ssh_host=123.22.32.41 ansible_ssh_port=3422 ansible_ssh_user=toor (для вызыва ansible all --limit yuppi )
 +[servers:​children] # объеденение груп серверов в одну ​
 +webservers
 +appservers
 +localhost ansible_connection=local # команды применяются к той машине с которой делаем запуск
 +
 +inventory.ini
 +Добавьте сервер job2.hexlet.io в группу jobservers.
 +Создайте метагруппу appservers, включите в нее webservers и jobservers.
 +
 +Плейбук - файл который указывает каке задачи будут выполнятся на каких серверах
 +начале сценария обязательно должна присутствовать последовательность символов «–––» (так в YAML обозначается начало документа). Перед каждым новым разделом списка ставится дефис ( — ):
 +---
 +-hosts: webserver
 +task: #​задача
 + name: install redis server # описание
 + apt: name=redis-server state=present update_cache=yes
 + #apt-get update && apt-get install redis-server
 + become: yes # запускается из под рута
 + или
 + become_user:​ yes # запускается из под другого пользователя
 +
 + name: remove redis server
 + apt: name=redis-server state=absent
 + #apt-get remove redis-server
 +
 +ansible-playbook playbook.yum -i production.ini
 +
 +playbook.yml
 +Выставьте права на файл /tmp/hosts в 0777 используя модуль file. Документация http://​docs.ansible.com/​file_module.html.
 +
 +hosts: webservers
 +  gather_facts:​ no
 +
 +  tasks:
 +      copy: src=files/​hosts dest=/​tmp/​hosts
 +
 +      name: Set file mode for `/​tmp/​hosts` to 777
 +
 +      file: path=/​tmp/​hosts mode=0777
 +
 +Основными параметрами/​группами простого сценария являются:​
 +
 +hosts — в нем указываются управляемые узлы или группы узлов, к которым нужно применить изменения;​
 +tasks — здесь описывается состояние,​ в которое необходимо привести управляемый узел, альтернативой этому могут служить роли   ​
 +
 +Также в сценарии перед непосредственным описанием задач могут быть указаны следующие параметры или группы параметров:​
 +
 +gather_facts — собирать или нет информацию о хостах перед выполнением задач, по умолчанию — да;
 +vars — в нем указываются различные переменные,​ которые будут использованы при выполнении сценария;​
 +connection — можно указать метод соединения с хостами:​ pure ssh, paramiko, fireball, chroot, jail, local, accelerate (применимо также для выполнения отдельного модуля);​
 +sudo — после установления соединения выполнять задачу с привилегиями другого пользователя,​ по умолчанию другой пользователь — root;
 +sudo_user — в сочетании с предыдущим параметром можно указать с привилегиями какого именно пользователя будет выполнена задача;​
 +vars_prompt — перед выполением плэйбука Ansible в интерактивном режиме может уточнить указанные в этом разделе параметры;​
 +remote_user (в предыдущих версиях — просто user) — имя пользователя для авторизации на удалённом хосте.
 +
 +
 +sudo:
 +В playbook в таске become: yes
 +В команде с опцией --ask-become-pass
 +
 +В playbook в заголовке sudo: true
 +В команде с опцией -K или --ask-sudo-pass
 +
 + ​ansible-playbook playbook_user_add.yml -u titov --ask-become-pass --extra-vars="​username=aleksandr"​
 + 
 + ​ansible-playbook playbook_user_del.yml -u titov --ask-become-pass --extra-vars="​username=aleksandr"​
 +
 +
 +rmuser=$(echo $1 | tr [A-Z] [a-z]) ​
 +ansible-playbook /​etc/​ansible/​playbook/​pb_squid_rm_user.yml -u$USER --ask-become-pass --extra-vars="​username=$rmuser"​
 +   ​
 +ansible-playbook pb_logon.yml -utitov --ask-become-pass  ​
 +</​code>​
ansible.txt · Последние изменения: 2016/01/28 07:08 — sander