Інтеграція інструментів автоматизації, таких як Ansible, з системами неперервної інтеграції/неперервного розгортання (CI/CD), на кшталт Jenkins, відкриває нові можливості для автоматизації рутинних задач розробників і системних адміністраторів. Одним із таких завдань є динамічне отримання імен хостів з файлу інвентаризації Ansible для використання у параметрах Jenkins job за допомогою плагіна Active Choices.
Для вирішення цієї задачі можна використовувати Groovy скрипт в рамках плагіна Active Choices, який дозволяє динамічно змінювати параметри вибору в залежності від інших параметрів. Цей метод вимагає певного рівня розуміння як Groovy, так і функціоналу Jenkins і Ansible.
Проте, можуть виникнути труднощі при інтеграції, особливо коли скрипт, який працює окремо, не виконується, як очікується, в контексті Jenkins job. Це може бути пов’язано з обмеженнями безпеки Jenkins, особливостями виконання скриптів у плагінах або неправильним використанням API Jenkins.
Однією з поширених проблем є обмеження безпеки Jenkins, які можуть запобігати виконанню скриптів. У такому випадку, може допомогти включення підтримки Groovy sandbox або явне дозволення виконання певних методів через налаштування Jenkins.
Також, важливо переконатись, що всі необхідні залежності (наприклад, бібліотека jq для обробки JSON) доступні в середовищі, де виконується Jenkins job.
1 2 3 4 5 6 7 8 |
def getHostList(String inventoryFilePath, String groupName) { def command = "ansible-inventory -i ${inventoryFilePath} --list | jq -r '.${groupName} | .hosts[]'" def process = command.execute() process.waitFor() return process.in.text.readLines() } def hostList = getHostList('/path/to/inventory.yml', 'your_group_name') println "Hosts: ${hostList.join(', ')}" |
У прикладі вище, ми використовуємо Groovy скрипт для виконання команди shell, яка отримує список хостів з Ansible інвентаризації і виводить його. Зверніть увагу, що для використання jq бібліотека повинна бути встановлена в середовищі виконання.
Для інтеграції отриманого списку хостів в Jenkins job за допомогою Active Choices Plugin, необхідно використовувати підхід, подібний до описаного вище, але з деякими адаптаціями для API плагіна.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
properties([ parameters([ activeChoice( choiceType: 'PT_SINGLE_SELECT', filterLength: 1, filterable: false, name: 'hostname', randomName: 'choice-parameter-291132897896439385', script: groovyScript( script: ''' def getHostList(String inventoryFilePath, String groupName) { def command = "ansible-inventory -i ${inventoryFilePath} --list | jq -r '.${groupName} | .hosts[]'" def process = command.execute() process.waitFor() return process.in.text.readLines() } return getHostList('/path/to/inventory.yml', 'your_group_name') ''', fallbackScript: 'return ["Error: script execution failed"]' ) ) ]) ]) |
У цьому прикладі ми використовуємо Active Choices параметр для створення випадаючого списку хостів, який динамічно заповнюється на основі результатів виконання Groovy скрипта. При необхідності, fallbackScript може використовуватися для обробки помилок.
Інтеграція Ansible з Jenkins через Active Choices Plugin дозволяє динамічно управляти параметрами Jenkins job, зокрема, швидко адаптувати список хостів на основі актуального файлу інвентаризації. Це значно спрощує процес налаштування деплойментів і інших автоматизованих задач. Важливо ретельно протестувати скрипти та звернути увагу на потенційні обмеження середовища виконання та безпеки.