Как добавить условие когда или если в переменную Ansible

Можно ли добавить условие 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"}

Спасибо.

Я хочу применить разные версии плагинов к разным серверам.

Привет @Yami, добро пожаловать в Stackoverflow. Ответ на вопрос Можно ли добавить условие when или if на переменную Ansible? да, вы можете выполнить поиск по ключевым словам ansible и conditionals. Кроме того, вам может быть полезна эта статья о ожиданиях от вопросов на этой платформе

Carlos Monroy Nieblas 25.11.2022 06:19

Пример stackoverflow.com/a/74440195/6309601

P.... 25.11.2022 06:28
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
В этой статье блога мы проведем вас через процесс установки Gradle на Ubuntu 22.04, интеграции его с Jenkins и создания задания Gradle. Мы...
0
2
147
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Создать словарь

    jenkins_plugins:
      A:
        - name: plugin-x
          version: 1.1
      B:
        - name: plugin-x
          version: 1.5

Используй это

    - debug:
        var: jenkins_plugins[inventory_hostname]

Notes

  1. Given the inventory
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
  1. Elegant and clean option is putting the variables into the group_vars. For example,
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

Другие вопросы по теме