Готовим плейбукnnДля работы Selenium Server понадобится Java, драйверы и браузеры. Мы будем устанавливать драйверы и браузеры Firefox и Chrome как наиболее популярные. Для тестирования основных функций этого более чем достаточно. Основы работы в Ansible можно найти на сайте проекта. В плейбуке оставлены основные функции, достаточные для работы. При необходимости можно расширить.nnДля удобства последующего обновления задаем переменные. Пока будем запускать две копии Selenium Server на портах, указанных в selenium.ports. При желании можно расширить на любое количество, просто добавив нужные номера.n
$ nano group_vars/selenium/vars.ymlnchromedriver: 2.31ngeckodriver: v0.18.0nselenium:nports:n- '4444'n- '4445'nversion: 3.5.3
Указываем роли.n
selenium.ymln- hosts: seleniumnbecome: Truenbecome_method: sudonroles:n- javan- selenium
Для работы будем использовать официальную версию Java от Oracle, для установки которой необходимо подключить репозиторий.n
roles/java/tasks/main.ymln- name: add repo for java 8napt_repository:nrepo: 'ppa:webupd8team/java'
При установке пакета задаются вопросы, поэтому нужно сконфигурировать ответ.n
- name: configure java 8 installationndebconf:ame: oracle-java8-installernquestion: shared/accepted-oracle-license-v1-1nvalue: 'true'nvtype: select
Ставим пакеты. name:n
name: install java 8napt:ame: '{{item}}'nupdate_cache: Truencache_valid_time: 3600nwith_items:n- oracle-java8-installern- oracle-java8-set-default
Роль простая. При необходимости ее можно использовать для развертывания Java на других серверах.nnТеперь Selenium. Для работы понадобятся веб-браузеры (можно поставить один из них), драйверы и собственно Selenium. Версию самого Selenium, драйвера и веб-браузера не обязательно брать последнюю. Проекты развиваются, и постоянно происходят разные нестыковки. Хотя в последнем релизе селениума обычно устраняют все известные проблемы.n
$ nano roles/selenium/tasks/main.yml
Добавляем ключ и репозиторий Google Chrome.n
- name: Add Google signing keynapt_key:nurl: 'https://dl-ssl.google.com/linux/linux_signing_key.pub'nstate: presentn- name: Add Chrome reponapt_repository:nrepo: 'deb http://dl.google.com/linux/chrome/deb/ stable main'nfilename: 'google-chrome'
Все остальные зависимости уже есть в репозитории. Запуск Selenium Server на сервере без графической оболочки требует framebuffer сервера – xvfb.n
- name: Install browsernapt:npkg: "{{ item }}"nstate: presentnupdate_cache: yesncache_valid_time: 3600nwith_items:n- xvfbn- firefoxn- google-chrome-stable
Создадим каталог для файлов Selenium. Я предпочитаю все класть в /opt. name:n
- name: Create selenium directorynfile:npath: /opt/seleniumnstate: directory
Скачиваем сервер selenium-server-standalone и копируем на свое место.n
- name: Download Seleniumnget_url:nurl: "http://selenium-release.storage.googleapis.com/ ↵n{{ selenium.version | regex_replace('\\.[0-9]+$', ↵n'') }}/selenium-server-standalone-{{ ↵nselenium.version }}.jar"ndest: "/opt/selenium/selenium-server-standalone.jar"
Драйверы должны быть видны в переменой PATH. Поэтому каталог для них другой. Можно положить в тот же каталог, что и selenium-server, и изменить настройки, но так более универсально.n
- name: Download and untar geckodriver tarballnunarchive:nsrc: "https://github.com/mozilla/geckodriver/releases/ ↵ndownload/{{ geckodriver }}/ ↵ngeckodriver-{{ geckodriver }}-linux64.tar.gz"ndest: "/usr/bin"ncopy: noncreates: "/usr/bin/geckodriver"n- name: download and unzip chromedriver tarballnunarchive:nsrc: "http://chromedriver.storage.googleapis.com/ ↵n{{ chromedriver }}/chromedriver_linux64.zip"ndest: "/usr/bin"ncopy: noncreates: "/usr/bin/chromedriver"
Теперь осталось все это запустить. Так как планируется использовать несколько копий Selenium Server ,то для запуска используем шаблон.n
- name: Create selenium systemd filesntemplate:nsrc: selenium.service.j2ndest: "/etc/systemd/system/selenium-{{ item }}.service"nwith_items: '{{ selenium.ports }}'
В результате работы этой части в каталоге /etc/systemd/ system будет создано несколько файлов с именем вроде selenium-4444.service. Включаем автозагрузку сервисов при перезагрузке ОС.n
- name: Enable selenium. servicensystemd:ame: "selenium-{{ item }}.service"nenabled: truendaemon_reload: yesnstate: restartednwith_items: '{{ selenium.ports }}'
Команда для запуска сервера Selenium такая:n
xvfb-run -a -s "-screen 0 1920x1080x24" /usr/bin/java ↵n-jar /opt/selenium/selenium-server-standalone.jar ↵n-port 4444
По умолчанию используется порт 4444, остальным копиям можно задавать любые удобные. Осталось написать шаблон для запуска сервиса через systemd.nnСам шаблон с именем selenium.service.j2 копируем в каталог roles/selenium/templates.n
[Unit]nDescription=SelenuimnAfter=syslog.targetn[Service]nUser=rootnEnvironment=DBUS_SESSION_BUS_ADDRESS=/dev/nullnExecStart=/usr/bin/xvfb-run -a -s "-screen 0 1920x1080x24" ↵n/usr/bin/java -jar /opt/selenium/ ↵nselenium-server-standalone.jar -port {{ item }} ↵n-log /var/log/selenium-{{ item }}.lognSuccessExitStatus=0nRestart=alwaysnRestartSec=30n[Install]nWantedBy=multi-user.target
Два момента. Запуск здесь происходит от root, это не очень хорошо. Лучше создать отдельную учетную запись, дав права на доступ в рабочие каталоги. Журналы при большом количестве очень быстро разрастаются и забирают много места. Если они не нужны, то после отладки их лучше отключить и настроить ротацию.nnПосле запуска плейбука netstat покажет, что слушаются нужные порты. Можем подключиться к ним в браузере http:// server_ip:4444/wd/hub (см. рис. 1) и попробовать создать сессию (см. рис. 2). Если все нормально, то задача, считаем, выполнена. Так как Selenium никак не авторизируются, то, если используется сервер, находящийся за пределами внутренней сети, порты лучше прикрыть при помощи iptables, разрешив доступ только с определенных IP. Правила можно сразу генерировать плейбуком.n
nНаша компания предоставляет услуги Devops администратора, обращайтесь [email protected] и мы поможем автоматизировать процессы.