Для 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.