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 для этого, тогда вы будете разрабатывать консольная программа.
Давайте используем то, что предложил 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]
Это не идеально: выглядит вы будете видеть, что пропускает статус для всех задач для пропущенных систем, но может сделать трюк.
В моем случае было полезно следующее: поскольку 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
В 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
была соответствующим образом пропущена, что предоставит пользователю дополнительную информацию о том, почему игра закончилась или нет.
Конечно , это приведет только к завершению текущего воспроизведения, а не все , оставшиеся в проигрывателе.
end_play
завершает работу всей пьесы, даже если она используется в вспомогательной пьесе, вызванной из основной пьесы с использованием, например, import_tasks
.
– ssc
21 January 2018 в 18:09
import_tasks
выполнение остается в той же игре, поэтому предполагается, что она будет завершена этой командой. Чтобы импортировать отдельные пьесы, используйте вместо этого инструкцию import_playbook
.
– Yaroslav Shabalin
25 January 2018 в 09:52
Лучшим и более логичным способом решения проблемы может быть обратное и вместо того, чтобы потерпеть неудачу, если нет ничего, чтобы обновить (это отдельный шаг, который делает только это), вы могли бы добавить все свои задачи обновления с условной зависимостью по переменной upgrade
. По сути, просто добавьте
when: upgrading.changed
к задачам, которые должны выполняться только во время обновления.
Это немного больше работы, но также дает ясность, а сам содержит логику, которая влияет на заданную задачу внутри себя, а не на что-то, что выше, что может или не может прекратить ее раньше.