2016-10-25 4 views
3

У меня есть служебный вызов, который возвращает статус системы в формате json. Я хочу использовать анзибль URI модуль для посылки вызова, а затем проверить ответ, чтобы решить, является ли система вверх или внизКак проверить ответ json от вызова Ansible URI

{"id":"20161024140306","version":"5.6.1","status":"UP"} 

Это будет json, возвращаемый

Это анзибль задача что делает вызов:

- name: check sonar web is up 
    uri: 
    url: http://sonarhost:9000/sonar/api/system/status 
    method: GET 
    return_content: yes 
    status_code: 200 
    body_format: json 
    register: data 

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

+4

В качестве следующей задачи вы можете начать с простой 'debug: var = data', чтобы увидеть, что находится внутри зарегистрированной переменной. Это поможет вам двигаться дальше. –

+0

Спасибо, что помогло мне решить эту проблему. :) – Hafiz

+1

Обратите внимание на то, что «регистр» с отступом приводит к ошибке «data is undefined», чтобы исправить это, вам нужно будет отменить одно и то же расстояние, как 'uri' – Hafiz

ответ

8

Это работает для меня.

- name: check sonar web is up 
uri: 
    url: http://sonarhost:9000/sonar/api/system/status 
    method: GET 
    return_content: yes 
    status_code: 200 
    body_format: json 
register: result 
until: result.json.status == "UP" 
retries: 10 
delay: 30 

Обратите внимание, что result является анзибль словарь и при установке return_content=yes ответ добавляется в этот словарь и доступен с помощью json ключа

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

+0

Это приятно, факт, что результат приходит как словарь Ansible и есть JSHA-анализатор Jinja2 уже там, чтобы извлечь информацию из него. – ocean

2

Вы сделали первый первый шаг, сохранив вывод в переменной.

Следующий шаг - использовать либо when:, либо failed_when: в следующей задаче, которая затем переключается на основе содержимого переменной. В них используется целый набор операторов, Jinja2 builtin filters, но они не очень хорошо связаны с документацией Ansible или прекрасно представлены.

Я использую супер явно назвал выходные переменные, поэтому они имеют смысл для меня позже в сборник пьес :) я бы, наверное, написать Yours что-то вроде:

- name: check sonar web is up 
    uri: 
    url: http://sonarhost:9000/sonar/api/system/status 
    method: GET 
    return_content: yes 
    status_code: 200 
    body_format: json 
    register: sonar_web_api_status_output 

- name: do this thing if it is NOT up 
    shell: echo "OMG it's not working!" 
    when: sonar_web_api_status_output.stdout.find('UP') == -1 

То есть, текст «UP» не найден в выводе переменной.

Другое Jinja2 builtin filters Я использовал это:

  • changed_when: "'<some text>' not in your_variable_name.stderr"
  • when: some_number_of_files_changed.stdout|int > 0

Ansible "Conditionals" docs page имеет часть этой информации. This blog post был также очень информативным.

+0

опубликовано примерно в то же время, что и мой ответ :), так что теперь я не уверен, какой из них следует отметить как правильный ответ, так как оба, похоже, работают – Hafiz

+0

Хехе хорошо :) Извините, я взял немного, чтобы написать это. – ocean