Как предоставить разные значения для нескольких серверов для одной и той же переменной

#ansible

#ansible

Вопрос:

У меня есть playbook, который устанавливает IIS, настраивает apppools, веб-сайты и развертывает приложение. Теперь у меня есть уникальное требование. Уникальный в том смысле, что я все еще не знаю, как это сделать :-). Требование состоит в том, чтобы распределить команду по переработке на 15 минут между кластером из 4 серверов. т. е. у 1-го сервера будет время переработки в 10: 00 вечера, у 2-го в 10: 15 вечера и так далее…

Любые указания на то, как этого достичь…

Я уже настроил пул приложений с приведенными ниже настройками

 - name: Setup TestWorkerApi Apppool in IIS
  win_iis_webapppool:
   name: TestWorkerApi
   state: started
   attributes:
     managedPipelineMode: Integrated
     startMode: AlwaysRunning
     processModel.identityType: SpecificUser
     processModel.userName: '{{ Domain }}{{ Test_In_User }}'
     processModel.password: "{{ Test_In_Pwd }}"
     managedRuntimeVersion: v4.0
     processModel.idleTimeout: 0
     processModel.idleTimeoutAction: Suspend
     recycling.periodicRestart.schedule: ["22:00:00"]
     autoStart: yes
   register: apppool_output-TestWorkerApi
  tags:
     - TestApp
  

Я ищу время переработки пула приложений как 10: 00 вечера на 1-м сервере, 10: 15 вечера на 2-м сервере, 10: 30 вечера на 3-м сервере и т.д…

Ответ №1:

Ansible позволяет устанавливать переменные, зависящие от хоста…

(а) в вашем инвентаре и (б) в файлах переменных внутри вашего host_vars каталога.

В любом случае, вы могли бы установить recycle_time переменную для каждого хоста с желаемым значением. Например, используя устаревший формат инвентаризации, это может выглядеть как:

 server1 recycle_time=22:00:00
server2 recycle_time=22:15:00
server3 recycle_time=22:30:00
server4 recycle_time=22:45:00
  

Или используя формат инвентаризации YAML:

 all:
  hosts:
    server1:
      recycle_time: "22:00:00"
    server2:
      recycle_time: "22:15:00"
    server3:
      recycle_time: "22:30:00"
    server4:
      recycle_time: "22:45:00"
  

Или используя host_vars каталог, который вы бы создали host_vars/server1.yml с содержимым:

 recycle_time: "22:00:00"
  

…и аналогично для других серверов.

В любом случае, вы бы затем ссылались на эту recycle_time переменную в своем playbook:

 - name: Setup TestWorkerApi Apppool in IIS
  win_iis_webapppool:
   name: TestWorkerApi
   state: started
   attributes:
     managedPipelineMode: Integrated
     startMode: AlwaysRunning
     processModel.identityType: SpecificUser
     processModel.userName: '{{ Domain }}{{ Test_In_User }}'
     processModel.password: "{{ Test_In_Pwd }}"
     managedRuntimeVersion: v4.0
     processModel.idleTimeout: 0
     processModel.idleTimeoutAction: Suspend
     recycling.periodicRestart.schedule: [{{ recycle_time }}]
     autoStart: yes
   register: apppool_output-TestWorkerApi
  tags:
     - TestApp
  

Вы можете прочитать больше в разделе «Переменные» документации Ansible.

Комментарии:

1. Спасибо, Ларски, спасибо за информацию. я бы выбрал все, что содержится в playbook, поэтому 2-й вариант выглядит положительным для меня. У меня были другие сценарии, для которых ваше 2-е решение дало мне несколько указаний и выглядит подходящим. Еще раз спасибо.