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

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


ansible

Ansible

Ansible является системой управления конфигурациями, установлен на сервере rastaban.

Установка.

Добавляем в репозитории следующий источник:

deb http://mirror.yandex.ru/debian/ testing main contrib non-free

Устанавливаем.

apt-get install ansible

Так же для работы ansible необходим python 2.7 или выше.

Конфигурационный файл находится в /etc/ansible/ansible.cfg
Инвентаризационный файл(в нем описаны хосты и группы хостов) /etc/ansible/hosts

Подготовка к работе

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

Работаем под своим пользователем.

ssh-keygen
ssh-copy-id username@server

Проверка работы

ssh user@server

Должно произойти подключение без запроса пароля.

<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, который отправляет письмо о том, что пользователь заблокирован.

Пример вызова скрипта

cd /etc/ansible/scripts
./rm_user username

Скрипт блокировки пользователя в squid

/etc/ansible/scripts/squid/squid_rm_user

#!/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

Скрипт блокировки пользователя в mail

/etc/ansible/scripts/mail/rm_user_mail

#!/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

Playbook удаления пользователя

/etc/ansible/playbook/cat pb_rm_user.yml

- 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

Playbook отправки письма

/etc/ansible/playbook/pb_send_mail_rm_user.yml

- 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"

Итоговый скрипт объединяющий все это и выполняющий проверку

/etc/ansible/scripts/rm_user

#!/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

Создание пользователей на 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, в теме письма указывается пользователь для которого сгенерированы пароли и администратор, который их создал.

Пример вызова скрипта

cd /etc/ansible/scripts
./create_user username "ФИО"

Скрипт создания пользователя squd

/etc/ansible/scripts/squid/squid_pass

#!/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

Скрипт создания пользователя на mail

/etc/ansible/scripts/mail/create_user_mail

#!/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

Playbook для создания пользователя

/etc/ansible/playbook/pb_add_user.yml

- 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 }}/

Playbook для отправки письма

/etc/ansible/playbook/pb_send_mail_add_user.yml

- 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>"

Итоговый скрипт объединяющий все это

/etc/ansible/scripts/create_user

#!/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

Заметки по ansible

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	 
ansible.txt · Последние изменения: 2016/01/28 07:08 — sander