Ansible: jenkins_plugin Connection refused и Cannot get CSRF

By | 06/30/2018
 

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

Возникает ошибка:

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

Причина – после выполнения 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

Проверяем:

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

Готово.

P.S. Но jenkins_plugin имеет ещё одну проблему – падает с ошибкой “Jenkins home directory doesn’t exist” при повторном запуске, т.е. при попытке установить уже имеющиеся плагины. И вообще он в preview.