Вопрос:

Как выполнить разные команды оболочки, зависящие от разных значений одного и того же параметра переменной на ansible?

bash shell ansible

16 просмотра

2 ответа

1 Репутация автора

Ansible новичок здесь:

В настоящее время я создаю ANSIBLE PlayBook, которая намеревается запустить, остановить и перезапустить виртуальную машину. Мне нужно выполнять различные команды оболочки в зависимости от конкретных значений из одной и той же переменной входного параметра. Когда я пытаюсь остановить виртуальную машину, я предполагаю, что книга воспроизведения останавливается, когда она запускается через задачу запуска виртуальной машины. Как бы я мог это исправить?

#Start the VM
- name: Start the VM
  shell: virsh start "{{ vmname }}"
  register: vmstate_start
  when: state == "start"

- debug:
    msg: "{{ vmstate_start.stdout  }}"

#Stop the VM
- name: Stop the VM
  shell: virsh shutdown "{{ vmname }}"
  register: vmstate_stop
  when: state == "stop"

- debug:
    msg: "{{ vmstate_stop.stdout }}"

#Restart the VM
- name: Restart the VM
  shell: virsh reboot "{{ vmname }}"
  register: vmstate_reboot
  when: state == "reboot"

- debug:
    msg: "{{ vmstate_reboot.stdout }}"

фатальный: [111.111.1.1]: СБОЙ! => {"msg": "Задача включает параметр с неопределенной переменной. Ошибка была: 'объект dict' не имеет атрибута 'stdout' \ n \ nОшибка, по-видимому, находится в '/ root // ansible / kvm- vm-start-stop / kvm-vm-start-top.yaml ': строка 65, столбец 7, но может \ n находиться в другом месте файла в зависимости от точной синтаксической проблемы. \ n \ nОстранная строка выглядит так: \ n \ n \ n - отладка: \ n ^ здесь \ n "}

Автор: Thomas Lee Источник Размещён: 11.08.2019 12:37

Ответы (2)


0 плюса

11464 Репутация автора

Когда задача пропускается, она не register:изменяет переменную -ed так же, как если бы она не пропускалась. К счастью, ansible всегда включает в себя, была ли задача пропущена или нет в skippedполе зарегистрированной задачи, или можно использовать is skippedфильтр. Таким образом, вы можете защитить выражение с помощью if, или использовать defaultфильтр, или просто пропустить debug:задачу, чтобы избежать ошибки:

- name: run the debug, but conditionally display the stdout
  debug:
    msg: '{{ "NO OUTPUT DUE TO SKIP" if vmstate_start.skipped else vmstate_start.stdout }}'

- name: or you can use the "default" filter
  debug:
    msg: '{{ (vmstate_start.stdout)|default("") }}'

- name: or, skip the debug task
  debug:
    msg: vmstate_start.stdout
  when: vmstate_start is not skipped
Автор: Matthew L Daniel Размещён: 11.08.2019 03:48

0 плюса

5908 Репутация автора

Можно включить переменную в команду

  - name: Manage the VM
    shell: "virsh {{ state }} {{ vmname }}"
    register: vmstate_result
  - debug:
      msg: "{{ vmstate_result.stdout }}"

Можно объявить таблицу перевода, если значения stateпеременной взяты из неизменяемого списка [start, stop, reboot]

vars:
  vm_command:
    start: start
    stop: shutdown
    reboot: reboot
tasks:
  - name: Manage the VM
    shell: "virsh {{ vm_command[state] }} {{ vmname }}"
    register: vmstate_result
  - debug:
      msg: "{{ vmstate_result.stdout }}"
Автор: Vladimir Botka Размещён: 11.08.2019 07:15
Вопросы из категории :
32x32