Я хотел поставить playbook для ansible-playbook 2.4.2.0 из stdin на RHEL 7.5, я нашел этот пост, который показался мне очень многообещающим, но он не работает для меня:

$ cat  ~/simple-ansible-playbook.yaml | ansible-playbook -i ~/inventory.yaml /dev/stdin
ERROR! Unable to retrieve file contents
Could not find or access '/dev/stdin'
$

Я отследил сообщение до /usr/lib/python2.7/site-packages/ansible/parsing/dataloader.py:

    if not self.path_exists(b_file_name) or not self.is_file(b_file_name):
        raise AnsibleFileNotFound("Unable to retrieve file contents", file_name=file_name)

os.path.isfile() возвращает False для /dev/stdin который является символической ссылкой на специальный символьный файл:

$ ls -l /dev/stdin
lrwxrwxrwx. 1 root root 15 Nov 11 13:11 /dev/stdin -> /proc/self/fd/0
$ ls -Ll /dev/stdin
crw--w----. 1 stack tty 136, 3 Feb 15 07:45 /dev/stdin

У кого-нибудь есть идеи, как заставить это работать? Я не понимаю, почему это работает для цитируемого поста, но это не работает для меня.

Обновить

Я думаю, что понимаю это лучше. Оригинальный пост использовал здесь документ, который оболочка, очевидно, возвращает в обычный файл. В моем методе данные находятся в трубе. Я не осознавал, что оболочка ведет себя по-другому в этом отношении: я полагал, что приведенный здесь документ также приведет к созданию канала. Так что, по крайней мере, я узнал что-то новое об этой разнице, но, видимо, я не смогу делать то, что хочу, если не будет ansible-playbook .

2 ответа2

0

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

0

Оригинальный пост использовал здесь документ, который оболочка, по-видимому, возвращает в обычный файл

Версия pipe отлично работает на современной версии ansible (я просто использовал heredoc, чтобы сделать ответ более лаконичным):

$ printf -- '- hosts: all\n  tasks:\n    - debug: msg=hello\n' | \
      ansible-playbook -c local -i localhost, /dev/stdin

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] =>
  msg: hello

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0

$ ls -l /dev/stdin
lrwxrwxrwx 1 root root 15 Feb 15 16:44 /dev/stdin -> /proc/self/fd/0

$ ansible --version
ansible 2.7.7
  config file = None
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python2.7/dist-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 2.7.15rc1 (default, Nov 12 2018, 14:31:15) [GCC 7.3.0]

Таким образом, решение вашей проблемы заключается в обновлении до современной версии ansible.

Тем не менее, я не хотел быть мрачным и мрачным, поэтому вам есть обходной путь, если вы настаиваете на подаче данных в ANISIB через канал: cheat и сериализацию pipestream в файл с tee:

$ printf -- '- hosts: all\n  tasks:\n    - debug: msg=hello\n' | \
      tee being-on-old-software-is-dangerous.yml | \
      ansible-playbook -c local -i localhost, being-on-old-software-is-dangerous.yml

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .