Playbook Ansible для Selenium Server
Готовим плейбук
Для работы Selenium Server понадобится Java, драйверы и браузеры. Мы будем устанавливать драйверы и браузеры Firefox и Chrome как наиболее популярные. Для тестирования основных функций этого более чем достаточно. Основы работы в Ansible можно найти на сайте проекта. В плейбуке оставлены основные функции, достаточные для работы. При необходимости можно расширить.
Для удобства последующего обновления задаем переменные. Пока будем запускать две копии Selenium Server на портах, указанных в selenium.ports. При желании можно расширить на любое количество, просто добавив нужные номера.
1 2 3 4 5 6 7 8 |
$ nano group_vars/selenium/vars.yml chromedriver: 2.31 geckodriver: v0.18.0 selenium: ports: - '4444' - '4445' version: 3.5.3 |
Указываем роли.
1 2 3 4 5 6 7 |
selenium.yml - hosts: selenium become: True become_method: sudo roles: - java - selenium |
Для работы будем использовать официальную версию Java от Oracle, для установки которой необходимо подключить репозиторий.
1 2 3 4 |
roles/java/tasks/main.yml - name: add repo for java 8 apt_repository: repo: 'ppa:webupd8team/java' |
При установке пакета задаются вопросы, поэтому нужно сконфигурировать ответ.
1 2 3 4 5 6 |
- name: configure java 8 installation debconf: name: oracle-java8-installer question: shared/accepted-oracle-license-v1-1 value: 'true' vtype: select |
Ставим пакеты. name:
1 2 3 4 5 6 7 8 |
name: install java 8 apt: name: '{{item}}' update_cache: True cache_valid_time: 3600 with_items: - oracle-java8-installer - oracle-java8-set-default |
Роль простая. При необходимости ее можно использовать для развертывания Java на других серверах.
Теперь Selenium. Для работы понадобятся веб-браузеры (можно поставить один из них), драйверы и собственно Selenium. Версию самого Selenium, драйвера и веб-браузера не обязательно брать последнюю. Проекты развиваются, и постоянно происходят разные нестыковки. Хотя в последнем релизе селениума обычно устраняют все известные проблемы.
1 |
$ nano roles/selenium/tasks/main.yml |
Добавляем ключ и репозиторий Google Chrome.
1 2 3 4 5 6 7 8 |
- name: Add Google signing key apt_key: url: 'https://dl-ssl.google.com/linux/linux_signing_key.pub' state: present - name: Add Chrome repo apt_repository: repo: 'deb http://dl.google.com/linux/chrome/deb/ stable main' filename: 'google-chrome' |
Все остальные зависимости уже есть в репозитории. Запуск Selenium Server на сервере без графической оболочки требует framebuffer сервера – xvfb.
1 2 3 4 5 6 7 8 9 10 |
- name: Install browser apt: pkg: "{{ item }}" state: present update_cache: yes cache_valid_time: 3600 with_items: - xvfb - firefox - google-chrome-stable |
Создадим каталог для файлов Selenium. Я предпочитаю все класть в /opt. name:
1 2 3 4 |
- name: Create selenium directory file: path: /opt/selenium state: directory |
Скачиваем сервер selenium-server-standalone и копируем на свое место.
1 2 3 4 5 6 7 |
- name: Download Selenium get_url: url: "http://selenium-release.storage.googleapis.com/ ↵ {{ selenium.version | regex_replace('\\.[0-9]+$', ↵ '') }}/selenium-server-standalone-{{ ↵ selenium.version }}.jar" dest: "/opt/selenium/selenium-server-standalone.jar" |
Драйверы должны быть видны в переменой PATH. Поэтому каталог для них другой. Можно положить в тот же каталог, что и selenium-server, и изменить настройки, но так более универсально.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
- name: Download and untar geckodriver tarball unarchive: src: "https://github.com/mozilla/geckodriver/releases/ ↵ download/{{ geckodriver }}/ ↵ geckodriver-{{ geckodriver }}-linux64.tar.gz" dest: "/usr/bin" copy: no creates: "/usr/bin/geckodriver" - name: download and unzip chromedriver tarball unarchive: src: "http://chromedriver.storage.googleapis.com/ ↵ {{ chromedriver }}/chromedriver_linux64.zip" dest: "/usr/bin" copy: no creates: "/usr/bin/chromedriver" |
Теперь осталось все это запустить. Так как планируется использовать несколько копий Selenium Server ,то для запуска используем шаблон.
1 2 3 4 5 |
- name: Create selenium systemd files template: src: selenium.service.j2 dest: "/etc/systemd/system/selenium-{{ item }}.service" with_items: '{{ selenium.ports }}' |
В результате работы этой части в каталоге /etc/systemd/ system будет создано несколько файлов с именем вроде selenium-4444.service. Включаем автозагрузку сервисов при перезагрузке ОС.
1 2 3 4 5 6 7 |
- name: Enable selenium. service systemd: name: "selenium-{{ item }}.service" enabled: true daemon_reload: yes state: restarted with_items: '{{ selenium.ports }}' |
Команда для запуска сервера Selenium такая:
1 2 3 |
xvfb-run -a -s "-screen 0 1920x1080x24" /usr/bin/java ↵ -jar /opt/selenium/selenium-server-standalone.jar ↵ -port 4444 |
По умолчанию используется порт 4444, остальным копиям можно задавать любые удобные. Осталось написать шаблон для запуска сервиса через systemd.
Сам шаблон с именем selenium.service.j2 копируем в каталог roles/selenium/templates.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[Unit] Description=Selenuim After=syslog.target [Service] User=root Environment=DBUS_SESSION_BUS_ADDRESS=/dev/null ExecStart=/usr/bin/xvfb-run -a -s "-screen 0 1920x1080x24" ↵ /usr/bin/java -jar /opt/selenium/ ↵ selenium-server-standalone.jar -port {{ item }} ↵ -log /var/log/selenium-{{ item }}.log SuccessExitStatus=0 Restart=always RestartSec=30 [Install] WantedBy=multi-user.target |
Два момента. Запуск здесь происходит от root, это не очень хорошо. Лучше создать отдельную учетную запись, дав права на доступ в рабочие каталоги. Журналы при большом количестве очень быстро разрастаются и забирают много места. Если они не нужны, то после отладки их лучше отключить и настроить ротацию.
После запуска плейбука netstat покажет, что слушаются нужные порты. Можем подключиться к ним в браузере http:// server_ip:4444/wd/hub (см. рис. 1) и попробовать создать сессию (см. рис. 2). Если все нормально, то задача, считаем, выполнена. Так как Selenium никак не авторизируются, то, если используется сервер, находящийся за пределами внутренней сети, порты лучше прикрыть при помощи iptables, разрешив доступ только с определенных IP. Правила можно сразу генерировать плейбуком.
Наша компания предоставляет услуги Devops администратора, обращайтесь [email protected] и мы поможем автоматизировать процессы.