Можно ли добавить условие when или if на переменную Ansible? Например, у нас есть 2 сервера jenkins (сервер A и сервер B), мы хотим применить разные версии плагинов для них обоих.
Пример:
jenkins_plugins:
- name: plugin-x
version: "1.1" {"if server == A"}
- name: plugin-x
version: "1.5" {"if server == B"}
Спасибо.
Я хочу применить разные версии плагинов к разным серверам.
Пример stackoverflow.com/a/74440195/6309601
Создать словарь
jenkins_plugins:
A:
- name: plugin-x
version: 1.1
B:
- name: plugin-x
version: 1.5
Используй это
- debug:
var: jenkins_plugins[inventory_hostname]
Notes
shell> cat hosts
A
B
Example of a complete playbook for testing
- hosts: all
vars:
jenkins_plugins:
A:
- name: plugin-x
version: 1.1
B:
- name: plugin-x
version: 1.5
tasks:
- debug:
var: jenkins_plugins[inventory_hostname]
gives
PLAY [all] ***********************************************************************************
TASK [debug] *********************************************************************************
ok: [A] =>
jenkins_plugins[inventory_hostname]:
- name: plugin-x
version: 1.1
ok: [B] =>
jenkins_plugins[inventory_hostname]:
- name: plugin-x
version: 1.5
PLAY RECAP ***********************************************************************************
A: ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
B: ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
shell> cat group_vars/all/jenkins_plugins.yml
jenkins_plugins_dict:
default:
- name: plugin-x
version: 1.0
A:
- name: plugin-x
version: 1.1
B:
- name: plugin-x
version: 1.5
jenkins_plugins: "{{ jenkins_plugins_dict[inventory_hostname]|
default(jenkins_plugins_dict.default) }}"
Then, given the inventory
shell> cat hosts
A
B
X
The playbook
- hosts: all
tasks:
- debug:
var: jenkins_plugins
gives
PLAY [all] ***********************************************************************************
TASK [debug] *********************************************************************************
ok: [B] =>
jenkins_plugins:
- name: plugin-x
version: 1.5
ok: [A] =>
jenkins_plugins:
- name: plugin-x
version: 1.1
ok: [X] =>
jenkins_plugins:
- name: plugin-x
version: 1.0
PLAY RECAP ***********************************************************************************
A: ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
B: ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
X: ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Ansible может хранить разные переменные для каждого из ваших серверов/групп в вашем инвентаре из коробки, и на самом деле это может быть гораздо более мощным и удобным в сопровождении, чем ваше вышеуказанное условие.
В качестве иллюстрации Как создать свой инвентарь и немного выйти за рамки вашего реального примера, давайте представим, что у вас есть список плагинов по умолчанию для всех серверов jenkins, и вы хотите переопределить версию для некоторых из них или добавить дополнительные. на конкретном сервере.
(Примечание: в этом примере не рассматривается удаление определенных плагинов по умолчанию, но это тоже возможно...)
Вот мой пример глобальной файловой структуры:
.
├── check_plugins_versions.yml
└── inventories
└── demo
├── group_vars
│ └── jenkins
│ └── plugins.yml
├── hosts.yml
└── host_vars
└── server2.jenkins.local
└── specific_jenkins_plugins.yml
Хозяева объявлены в inventories/demo/hosts.yml
---
jenkins:
hosts:
server1.jenkins.local:
server2.jenkins.local:
Как видите, я объявил два хоста, как в вашем вопросе, и поместил их в группу jenkins
. Итак, теперь мы можем объявить переменные для этой группы внутри каталога inventories/demo/group_vars/jenkins
, куда я поместил файл plugins.yml
.
---
# List of plugins to install by default
_default_jenkins_plugins:
- name: plugin-a
version: "1.1"
- name: plugin-b
version: "2.2"
- name: plugin-x
version: "1.1"
# Customize plugin list with specific plugins for host if they exist. For this we
# transform the above default list and the specific one to dicts
# combine them and turn them back into a result list
_d_plug_dict: "{{ _default_jenkins_plugins
| items2dict(key_name='name', value_name='version') }}"
_s_plug_dict: "{{ _specific_jenkins_plugins | d([])
| items2dict(key_name='name', value_name='version') }}"
jenkins_plugins: "{{ _d_plug_dict | combine(_s_plug_dict)
| dict2items(key_name='name', value_name='version') }}"
Теперь мы можем дать список конкретных плагинов/версий для server2.jenkins.local
. Я поместил эти значения в inventories/demo/host_vars/server2.jenkins.local/specific_jenkins_plugins.yml
---
_specific_jenkins_plugins:
# Override version for plugin-x
- name: plugin-x
version: "1.5"
# Install an additional plugin-z
- name: plugin-z
version: "9.9"
Затем у нас есть простой check_plugins_versions.yml
тестовый плейбук, чтобы убедиться, что вышеприведенное работает так, как ожидалось:
---
- hosts: jenkins
gather_facts: false
tasks:
- name: show computed plugins for each server
debug:
var: jenkins_plugins
Что дает при вызове с соответствующим инвентарем
$ ansible-playbook -i inventories/demo/ check_plugins_versions.yml
PLAY [jenkins] *************************************************************************************************************************************************************************************************************************
TASK [show computed plugins for each server] *******************************************************************************************************************************************************************************************
ok: [server1.jenkins.local] => {
"jenkins_plugins": [
{
"name": "plugin-a",
"version": "1.1"
},
{
"name": "plugin-b",
"version": "2.2"
},
{
"name": "plugin-x",
"version": "1.1"
}
]
}
ok: [server2.jenkins.local] => {
"jenkins_plugins": [
{
"name": "plugin-a",
"version": "1.1"
},
{
"name": "plugin-b",
"version": "2.2"
},
{
"name": "plugin-x",
"version": "1.5"
},
{
"name": "plugin-z",
"version": "9.9"
}
]
}
PLAY RECAP *****************************************************************************************************************************************************************************************************************************
server1.jenkins.local : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
server2.jenkins.local : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Привет @Yami, добро пожаловать в Stackoverflow. Ответ на вопрос Можно ли добавить условие when или if на переменную Ansible? да, вы можете выполнить поиск по ключевым словам
ansible
иconditionals
. Кроме того, вам может быть полезна эта статья о ожиданиях от вопросов на этой платформе