Я хотел развернуть несколько виртуальных машин из ansible, исходя из значений, заданных конечным пользователем

#python-3.x #ansible #vmware

#python-3.x #ansible #vmware

Вопрос:

Я хотел развернуть несколько виртуальных машин из моего ansible-playbook, поэтому я использовал функцию разделения, и я получаю сообщение об ошибке dict does not have user_inout error. Пожалуйста, взгляните на мой код.

Код:

   - name: os system 
    pause:
      prompt: |
      Which os do you want to use?
         1- Windows Server
         2- CentOS_7
         3- CentOs_8
         4- Ubuntu
         5- Others
    register: os_system
  - set_fact:
       o_name: "{{ os_system.user_input.split(',') }}"  
  - name: Domain Decision
    pause:
     prompt: Do you want your PC in Domain
    register: decision
    when:  'item|string  == "1"'
    with_items:
     - "{{ o_name }}" 
  - set_fact:
     dec: "{{ decision.user_input.split(',') }}"
      
  

Теперь моя реальная проблема, если пользователь выберет вариант 1,2, то он будет разделен по set_fact для os_system и в соответствии с этим вводом он примет решение для решения домена. моя главная проблема заключается в том, что, пока задача находится в set_fact для решения, это выдаст мне ошибку, подобную этой:

Ошибка: фатальная: [x.x.x.x]: СБОЙ! => { «Сообщение»: «Задача включает параметр с неопределенной переменной. Ошибка заключалась в следующем: ‘dict object’ не имеет атрибута ‘user_input’ n n Ошибка, по-видимому, находится в ‘/home /x.x.x.x/sites/playbook.yml’: строка 82, столбец 6, но может быть и в другом месте файла в зависимости от конкретной синтаксической проблемы.nn Строка-нарушитель выглядит так:n n n — set_fact:n ^ here н» }

ЕСЛИ я удалю цикл из решения домена задачи, то set_fact будет работать очень идеально.

Ответ №1:

Когда вы хотите собирать пользовательский ввод, это может быть двумя способами:

  • Интерактивный (с запросом), используя vars_prompt .
  • Через переменные (без запроса). Например, вы могли бы попросить пользователей создать файл с переменными и загрузить с vars_file .

Я бы предпочел второй подход, если это возможно.

Однако, чтобы получать пользовательский ввод в интерактивном режиме с помощью подсказок:

 - hosts: my_hosts

  vars_prompt:
  - name: os_system
    prompt: |
      Which os do you want to use?
         1- Windows Server
         2- CentOS_7
         3- CentOs_8
         4- Ubuntu
         5- Others
    private: no      

  tasks:
  - set_fact:
      o_name: "{{ os_system.split(',') }}"
  

Вы должны отметить, что, разделив входные данные на 1,2, вы не получите название ОС. Вам снова придется установить факт на основе числа (1 = Windows Server). ИМХО, это ненужное усложнение.

Гораздо лучшим вариантом было бы, чтобы пользователи создавали файл переменных, как показано ниже:

my_vars.yml:

 os_choices:
  - { name: Windows Server, domain: yes }
  - { name: CentOS_7, domain: no }
  

И загрузить его в play с помощью:

 - hosts: my_hosts
  vars_file:
    - my_vars.yml