Ansible: как работать с кавычками и пробелами, используя shell - PullRequest
1 голос
/ 04 октября 2019

Я создаю книгу воспроизведения, чтобы вывести список пользователей в каталоге "/ home", используя следующую книгу воспроизведения на ansible 2.8.2:

---
- name: Check users in /home directory
  hosts: REDHAT
  tasks:
  - name: List users
      shell: cat /etc/passwd | grep "/home" |cut -d ":" -f1| tr '\n' ' '
      register: output
      ignore_errors: yes

Проблема, с которой я столкнулся, заключается в конце командыс кавычками и пробелами: '\n' ' '

я пытался использовать двойные кавычки ", {} and [], но у меня все еще есть синтаксические ошибки

Результаты при использовании ---syntax-check:

> The offending line appears to be:

  - name: List users
      shell: cat /etc/passwd | grep "/home" |cut -d ":" -f1| tr "'\n' ' '"
           ^ here
We could be wrong, but this one looks like it might be an issue with
unbalanced quotes. If starting a value with a quote, make sure the
line ends with the same set of quotes. For instance this arbitrary
example:

    foo: "bad" "wolf"

Could be written as:

    foo: '"bad" "wolf"'

Когда я в точности должен использовать кавычки в этом случае

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Найдите Y минут, чтобы прочитать Изучите yaml за Y минут , где вы узнаете, что:

[Yaml] является строгим надмножеством JSON с добавлением синтаксически значимогопереводы строки и отступы, такие как Python. Однако, в отличие от Python, YAML не допускает буквенных символов табуляции для отступа.

Ваша проблема вовсе не в кавычках, а в отступе кода в задаче оболочки:

---
- name: Check users in /home directory
  hosts: REDHAT
  tasks:
    - name: List users
      shell: cat /etc/passwd | grep "/home" |cut -d ":" -f1| tr '\n' ' '
      register: output
      ignore_errors: yes

Обратите внимание, что использование yamllint в указанном выше файле дает чуть более точную ошибку:

$ yamllint playbook_test.yml 
playbook_test.yml
  6:12      error    syntax error: mapping values are not allowed here
0 голосов
/ 05 октября 2019

В дополнение к ответу Zeitounator используйте модули, поставляемые с Ansible. Таким образом, вы можете использовать эту функцию позже и с не-RHEL OS. Кроме того, если произойдет изменение выходных данных, скрипт не начнет отказывать.

В этом случае я бы порекомендовал модуль getent:

https://docs.ansible.com/ansible/latest/modules/getent_module.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...