Если файл существует, чем пропустить оставшиеся задачи в недоступном [дубликат]

CGI-скрипт - это консольная / оболочечная программа. В Windows, когда вы используете окно «Командная строка», вы запускаете консольные программы. Когда веб-сервер выполняет скрипт CGI, он предоставляет вход в программу console / shell с использованием переменных среды или «стандартного ввода». Стандартный ввод похож на ввод данных в программу console / shell; в случае скрипта CGI веб-сервер выполняет типизацию. Сценарий CGI записывает данные на «стандартный вывод», и этот вывод отправляется клиенту (веб-браузеру) в виде HTML-страницы. Стандартный вывод похож на вывод, который вы видите в программе console / shell, за исключением того, что веб-сервер читает его и отправляет.

CGI-скрипт может быть выполнен из браузера. URI обычно включает строку запроса, которая предоставляется сценарию CGI. Если метод «get», строка запроса предоставляется в CGI Script в переменной среды QUERY_STRING. Если метод «post», то строка запроса предоставляется в CGI Script с использованием стандартного ввода (CGI Script читает строку запроса из стандартного ввода).

Раннее использование скриптов CGI состояло в обработке форм , В начале HTML формы HTML обычно имели атрибут «действие» и кнопку, обозначенную как кнопка «отправить». Когда кнопка отправки нажата, URI, указанный в атрибуте «действие», будет отправлен на сервер с данными из формы, отправленной в виде строки запроса. Если «действие» указывает скрипт CGI, тогда будет выполнен сценарий CGI, а затем будет выведен HTML-страница.

RFC 3875 «Интерфейс общего шлюза (CGI)» частично определяет CGI с использованием C, как в говоря, что переменные среды "получают доступ к библиотечной подпрограмме C getenv () или переменной environ".

Если вы разрабатываете скрипт CGI с использованием C / C ++ и используете Microsoft Visual Studio для этого, тогда вы будете разрабатывать консольная программа.

14
задан jreisinger 6 April 2016 в 12:54
поделиться

4 ответа

Давайте используем то, что предложил Tymoteusz для ролей:

Разделите свою игру на две роли , где первая роль будет выполнять проверку (и задает результат проверки переменной удерживания), а вторая будет действовать по результатам проверки.

Я создал aaa.yaml с этим контентом:

---
- hosts: all
  remote_user: root
  roles:
    - check
    - { role: doit, when: "check.stdout == '0'" }
...

, затем роль check в roles/check/tasks/main.yaml:

---
- name: "Check if we should continue"
  shell:
    echo $(( $RANDOM % 2 ))
  register: check
- debug:
    var: check.stdout
...

, а затем роль doit в roles/doit/tasks/main.yaml:

---
- name: "Do it only on systems where check returned 0"
  command:
    date
...

И это был результат:

TASK [check : Check if we should continue] *************************************
Thursday 06 October 2016  21:49:49 +0200 (0:00:09.800)       0:00:09.832 ****** 
changed: [capsule.example.com]
changed: [monitoring.example.com]
changed: [satellite.example.com]
changed: [docker.example.com]

TASK [check : debug] ***********************************************************
Thursday 06 October 2016  21:49:55 +0200 (0:00:05.171)       0:00:15.004 ****** 
ok: [monitoring.example.com] => {
    "check.stdout": "0"
}
ok: [satellite.example.com] => {
    "check.stdout": "1"
}
ok: [capsule.example.com] => {
    "check.stdout": "0"
}
ok: [docker.example.com] => {
    "check.stdout": "0"
}

TASK [doit : Do it only on systems where check returned 0] *********************
Thursday 06 October 2016  21:49:55 +0200 (0:00:00.072)       0:00:15.076 ****** 
skipping: [satellite.example.com]
changed: [capsule.example.com]
changed: [docker.example.com]
changed: [monitoring.example.com]

Это не идеально: выглядит вы будете видеть, что пропускает статус для всех задач для пропущенных систем, но может сделать трюк.

2
ответ дан jhutar 17 August 2018 в 15:08
поделиться

В моем случае было полезно следующее: поскольку meta: end_play, похоже, останавливает выполнение для всех хостов, а не только тот, который соответствует.

Сначала установите факт:

- name: Determine current version
  become: yes
  slurp:
    src: /opt/app/CHECKSUM
  register: version_check
  ignore_errors: yes

- set_fact:
  is_update_needed: "{{ ( version_check['checksum'] | b64decode != installer_file.stat.checksum)  }}"

Теперь включите ту часть, которая должна выполняться только при этом условии:

# update-app.yml can be placed in the same role folder
- import_tasks: update-app.yml
  when: is_update_needed
0
ответ дан reto 17 August 2018 в 15:08
поделиться

В Ansible 2.2 вы можете использовать end_play с модулем meta :

- meta: end_play

Вы также можете указать when для условного окончания воспроизведения:

- meta: end_play
  when: upgrading.stdout == "no"

Обратите внимание, однако, что задача не указана в выводе загружаемого файла, независимо от того, заканчивается ли игра. Кроме того, задача не учитывается в резюме. Таким образом, вы можете сделать что-то вроде:

- block:
    - name: "end play if nothing to upgrade"
      debug:
        msg: "nothing to upgrade, ending play"

    - meta: end_play
  when: upgrading.stdout == "no"

, которое объявит конец воспроизведения прямо перед его завершением, только когда условие выполнено. Если условие не выполнено, вы увидите, что задача с именем end play if nothing to upgrade была соответствующим образом пропущена, что предоставит пользователю дополнительную информацию о том, почему игра закончилась или нет.

Конечно , это приведет только к завершению текущего воспроизведения, а не все , оставшиеся в проигрывателе.

24
ответ дан snapfla 17 August 2018 в 15:08
поделиться
  • 1
    Отличная находка! К сожалению, end_play завершает работу всей пьесы, даже если она используется в вспомогательной пьесе, вызванной из основной пьесы с использованием, например, import_tasks. – ssc 21 January 2018 в 18:09
  • 2
    @ssc. Вы смешиваете задачи и импортируете книги. При выполнении import_tasks выполнение остается в той же игре, поэтому предполагается, что она будет завершена этой командой. Чтобы импортировать отдельные пьесы, используйте вместо этого инструкцию import_playbook. – Yaroslav Shabalin 25 January 2018 в 09:52
  • 3
    Важно: end_play, похоже, останавливает выполнение на всех хостах, а не только на том, где выполняется условие! github.com/ansible/ansible/issues/27973 – reto 15 May 2018 в 16:51

Лучшим и более логичным способом решения проблемы может быть обратное и вместо того, чтобы потерпеть неудачу, если нет ничего, чтобы обновить (это отдельный шаг, который делает только это), вы могли бы добавить все свои задачи обновления с условной зависимостью по переменной upgrade. По сути, просто добавьте

when: upgrading.changed

к задачам, которые должны выполняться только во время обновления.

Это немного больше работы, но также дает ясность, а сам содержит логику, которая влияет на заданную задачу внутри себя, а не на что-то, что выше, что может или не может прекратить ее раньше.

1
ответ дан Tymoteusz Paul 17 August 2018 в 15:08
поделиться
  • 1
    Это неудобно, когда есть много задач после того, как решить, продолжать или нет: - / – jhutar 6 October 2016 в 19:39
Другие вопросы по тегам:

Похожие вопросы: