我在 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
但是我在运行剧本时遇到以下错误。
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
答案 0 :(得分:2)
如果您的值以引号开头,那就是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 Block Scalars是个不错的主意。
我认为这应该做你想要的:
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
很长,但应该涵盖你需要知道的每一个案例。
答案 1 :(得分:0)
以下实际修正了错误,方法是将 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)