Ansible - использование или условие, когда: - PullRequest
0 голосов
/ 02 июня 2018

У меня есть следующий код в tasks / main.yml

---
- name: Check if service exists.
  shell: "systemctl status {{ service }}"
  ignore_errors: yes
  register: service_exists

- name: Enable service and start if it exists.
  systemd:
    name: "{{ service }}"
    state: started
    enabled: true
  when: "could not be found" not in service_exists.stderr' or '"Failed to get properties" not in service_exists.stderr' or '"not-found" not in service_exists.stderr'

У меня есть следующий код в configure-services.yml

---
- hosts: localhost
  become: true
  gather_facts: yes
  tasks:
    - include: tasks/main.yml
      with_items: "{{ services }}"
      loop_control:
        loop_var: service

Однако я получаю приведенную ниже ошибку при запуске playbook.

fatal: [localhost]: FAILED! => {"reason": "Syntax Error while loading YAML.\n  did not find expected key\n\nThe error appears to have been in '/home/adambirds/Development/ansible-playbooks/system-services/tasks/main.yml': line 12, column 11, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n    enabled: true\n  when:''\"could not be found\" not in service_exists.stderr' or '\"Failed to get properties\" not in service_exists.stderr' or '\"not-found\" not in service_exists.stderr''\n          ^ here\nWe could be wrong, but this one looks like it might be an issue with\nunbalanced quotes.  If starting a value with a quote, make sure the\nline ends with the same set of quotes.  For instance this arbitrary\nexample:\n\n    foo: \"bad\" \"wolf\"\n\nCould be written as:\n\n    foo: '\"bad\" \"wolf\"'\n"}

Я полагаю, что проблема связана с моим оператором when: , моя цель - выполнить задачу, еслини один из приведенных ниже не появляется в service_exists.stderr :

could not be found
Failed to get properties
not-found

После использования предложения @tinita ниже и изменения tasks / main.yml к следующему:

---
- name: Check if service exists.
  shell: "systemctl status {{ service }}"
  ignore_errors: yes
  register: service_exists

- name: Enable service and start if it exists.
  systemd:
    name: "{{ service }}"
    state: started
    enabled: true
  when: >
    "could not be found" not in service_exists.stderr
    or "Failed to get properties" not in service_exists.stderr
    or "not-found" not in service_exists.stderr

Я получаю следующие ошибки при запуске playbook:

TASK [Check if service exists.] ***************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "systemctl status mariadb.service", "delta": "0:00:00.004881", "end": "2018-06-02 16:28:18.849473", "msg": "non-zero return code", "rc": 4, "start": "2018-06-02 16:28:18.844592", "stderr": "Unit mariadb.service could not be found.", "stderr_lines": ["Unit mariadb.service could not be found."], "stdout": "", "stdout_lines": []}
...ignoring

TASK [Enable service and start if it exists.] *************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Could not find the requested service mariadb.service: host"}
        to retry, use: --limit @/home/adambirds/Development/ansible-playbooks/system-services/configure-services.retry

PLAY RECAP ************************************************************************************************************************************************************************************
localhost                  : ok=20   changed=1    unreachable=0    failed=1

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Ниже на самом деле исправлена ​​ошибка путем замены оператора when: на следующий:

when: not ("could not be found" in service_exists.stderr or "not-found" in service_exists.stderr or "Failed to get properties" in service_exists.stderr)
0 голосов
/ 02 июня 2018

Если ваше значение начинается с кавычки, это кавычка YAML, но вы хотите, чтобы кавычка была частью выражения jinja:

when: "could not be found" not in service_exists.stderr' or '"Failed to get properties" not in service_exists.stderr' or '"not-found" not in service_exists.stderr'

Таким образом, строка недопустима YAML, так как вам придетсяпроцитировать всю стоимость.Если у вас есть значения со смешанными кавычками, рекомендуется использовать скалярные YAML-блоки.

Я думаю, что это должно делать то, что вы хотите:

when: >
  "could not be found" not in service_exists.stderr
  or "Failed to get properties" not in service_exists.stderr
  or "not-found" not in service_exists.stderr

Это так называемый "свернутый блок"Скалярное».Линии просто сложены в одну линию.Вы также можете использовать здесь Literal Block Scalar, который сохраняет разрывы строк, так как я считаю, что разрывы строк не имеют значения в выражениях Jinja.

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

when: '
  "could not be found" not in service_exists.stderr
  or "Failed to get properties" not in service_exists.stderr
  or "not-found" not in service_exists.stderr'

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

Возможно, вы захотитечтобы прочитать мою статью о цитировании YAML: http://blogs.perl.org/users/tinita/2018/03/strings-in-yaml---to-quote-or-not-to-quote.html

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

...