ansible: объединить цикл (до) с условным (когда) - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь установить и настроить сервер приложений в локальном vagrant vm.Для обеспечения используется Ansible.Конфигурация может быть выполнена после первого запуска.В настоящее время он прослушивает localhost: 8000.После этого я могу скопировать файл конфигурации и перезапустить сервис.После этого порт меняется на 8081.

Дело в том, что мне нужно дождаться завершения первого запуска, прежде чем переопределить файл конфигурации.Чтобы проверить, сделан ли первый запуск, я использовал модуль url в цикле, который работает хорошо.Таким образом, vm инициализируется при первом vagrant up --provision .

Но, если есть другое vagrant предоставление и Playsbook Ansible выполняет модуль url сЦикл это сбой из-за измененного порта.Итак, я попробовал это:

- name: configure / check for default server.conf


- command: grep "url.httpport=8081" "/{{ base_dir }}/conf/server.conf"
  ignore_errors: yes
  register: output

- name: configure / Check that app-server is installed successfully (8000)
  block:
    - get_url:
        url: http://localhost:8000/version.txt
        dest: /tmp
      register: result
      until: result is succeeded
      retries: 10
      delay: 30
      register: started
  when: output.rc == 1

- name: configure / Check that app-server is installed successfully (8081)
  block:
    - get_url:
        url: http://localhost:8081/version.txt
        dest: /tmp
      register: result
      until: result is succeeded
      retries: 10
      delay: 30
      register: started
  when: output.rc == 0

Моя идея заключается в том, что в отношении кода возврата выбран правильный блок, а другой пропущен.Но результат таков:

TASK [glue-tomcat8 : configure / check for default server.conf] ***
fatal: [devaws]: FAILED! => {"changed": true, "cmd": ["grep", ".url.httpport=8081", "/opt5/conf/server.conf"], "delta": "0:00:00.003016", "end": "2018-05-22 07:11:51.382776", "msg": "non-zero return code", "rc": 1, "start": "2018-05-22 07:11:51.379760", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring

TASK [glue-tomcat8 : Check that app server is installed successfully (8000)] ***
fatal: [devaws]: FAILED! => {"msg": "The conditional check 'result is succeeded' failed. The error was: The failed test expects a dictionary"}

Итак, похоже, что есть проблема с условной проверкой модуля get_url.Когда используется один, без условного (когда), а не внутри блока, он работает.Я думаю, что у Ansible есть проблемы с объединением до и когда.Я не могу найти ничего относительно этого в документации.Так что любая помощь приветствуется и спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Я получил это работает.Это была проблема 8-го уровня (меня) :) Запущенная переменная является остатком и не нужна.Похоже, Ansible был раздражен этой переменной.Вот мой рабочий код:

- command: grep "url.httpport=8081" "/{{ base_dir }}/conf/server.conf"
  ignore_errors: yes
  register: output

- get_url:
    url: http://localhost:8000/version.txt
    dest: /tmp
  register: result
  until: result is succeeded
  retries: 10
  delay: 30
  when: output.rc == 1

- get_url:
    url: http://localhost:8081/version.txt
    dest: /tmp
  register: result
  until: result is succeeded
  retries: 10
  delay: 30
  when: output.rc == 0
0 голосов
/ 22 мая 2018

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

Во-вторых, я рекомендую проверить ваши порты с помощью модуля wait_for.Поэтому, если вы хотите проверить порт 8000 или 8001, сделайте что-то вроде:

---
  - name: Wait_For Example
    hosts: localhost
    gather_facts: False


    tasks:

      - name: Wait for port 443
        wait_for:
          port: 443
          delay: 0
          timeout: 3
          state: started
        register: _port443
        ignore_errors: True


      - name: Wait for port 8001
        wait_for:
          port: 8001
          delay: 0
          timeout: 3
          state: started
        register: _port8001
        ignore_errors: True


      - name: Debug
        debug:
          var: _port443
        when: 
          - _port443.state is defined
          - _port443.state == "started"
          - _port443.port == 443


      - name: Debug
        debug:
          var: _port8001
        when: 
          - _port8001.state is defined
          - _port8001.state == "started"
          - _port8001.port == 443

Будьте осторожны, потому что вы используете одну и ту же переменную started в обоих случаях.

...