Для Ansible имеется плагин, позволяющий выполнить установку плагинов для Jenkins jenkins_plugin_module
.
Достаточно интересный модуль, ниже пример его использования и решение ошибки “Connection refused“.
При попытке установить плагин с его помощью:
... - name: Start Jenkins service service: name=jenkins state=restarted enabled=yes - name: Install Jenkins plugins jenkins_plugin: name: "{{ item }}" url_username: "{{ jenkins_ui_admin_user }}" url_password: "{{ jenkins_ui_admin_pass }}" state: present with_items: - locale
Возникает ошибка:
[simterm]
... TASK [jenkins : Install Jenkins plugins] **** failed: [dev.ci.domain.world] (item=locale) => {"changed": false, "details": "Request failed: <urlopen error [Errno 111] Connection refused>", "item": "locale", "msg": "Cannot get CSRF"} ...
[/simterm]
Причина – после выполнения systemctl restart jenkins.service
в предыдущей задаче – Jenkins не успевает запуститься до того, как начинается выполнение задачи по установке плагинов, которая использует Jenkins API.
Для исправления – добавим вызов модуля uri
, который в цикле будет ждать ответа с кодом 200:
... - name: Start Jenkins service service: name=jenkins state=restarted enabled=yes - name: Wait for Jenkins to start up uri: url: http://localhost:8080 status_code: 200 user: "{{ jenkins_ui_admin_user }}" password: "{{ jenkins_ui_admin_pass }}" timeout: 5 force_basic_auth: yes register: jenkins_service_status retries: 10 delay: 5 until: > 'status' in jenkins_service_status and jenkins_service_status['status'] == 200 - name: Check Jenkins status debug: msg: "Jenkins status: {{ jenkins_service_status['status'] }}" - name: Install Jenkins plugins jenkins_plugin: name: "{{ item }}" url_username: "{{ jenkins_ui_admin_user }}" url_password: "{{ jenkins_ui_admin_pass }}" state: present with_items: - locale when: jenkins_service_status['status'] == 200
Проверяем:
[simterm]
... TASK [jenkins : Start Jenkins service] **** changed: [dev.ci.domain.world] TASK [jenkins : Wait for Jenkins to start up] **** FAILED - RETRYING: Wait for Jenkins to start up (10 retries left). FAILED - RETRYING: Wait for Jenkins to start up (9 retries left). FAILED - RETRYING: Wait for Jenkins to start up (8 retries left). ok: [dev.ci.domain.world] TASK [jenkins : Check Jenkins status] **** ok: [dev.ci.domain.world] => { "msg": "Jenkins status: 200" } TASK [jenkins : Install Jenkins plugins] **** changed: [dev.ci.domain.world] => (item=locale) PLAY RECAP **** dev.ci.domain.world : ok=12 changed=2 unreachable=0 failed=0 Provisioning done.
[/simterm]
Готово.
P.S. Но jenkins_plugin
имеет ещё одну проблему – падает с ошибкой “Jenkins home directory doesn’t exist” при повторном запуске, т.е. при попытке установить уже имеющиеся плагины. И вообще он в preview.