Доступный вызов поиска по списку из одного элемента - PullRequest
0 голосов
/ 21 ноября 2019

Я хочу найти и заменить несколько строк с циклом в файле known_hosts для дальнейшего использования SSH. Итак, я проверяю файл с помощью этой задачи:

- name: Checking "known_hosts"
  loop: "{{ groups['nodes'] }}"
  lineinfile:
    dest: ~/.ssh/known_hosts
    state: present
    line: "{{ lookup('pipe', 'ssh-keyscan -trsa -p 22 ' + item) }}"
    create: yes

Это выдает ошибку:

Недопустимые данные переданы в «цикл», требуется список, вместо этого он получил этот список: [u'node.env1 ']'. Подсказка: если вы передали список / dict только одного элемента, попробуйте добавить wantlist = True к вашему вызову поиска или используйте q / query вместо lookup.

Это список из одного элемента,Хорошо, хорошо, давайте отредактируем ~

line: "{{ q('pipe', 'ssh-keyscan -trsa -p 22 ' + item) }}"

Недопустимые данные, переданные в «цикл», для этого требуется список, получивший вместо этого: [u'node.env1 ']'. Подсказка: если вы передали список / дикт только из одного элемента, попробуйте добавить wantlist = True к вашему вызову поиска или используйте q / query вместо lookup.

Спасибо за подсказку, Ansible-sama.

(На всякий случай, такое же поведение с query или с wantList=True.)

Что здесь происходит?

1 Ответ

0 голосов
/ 21 ноября 2019

Я не могу воспроизвести поведение, описанное вами в вашем вопросе. Я использую Ansible 2.9.0. Если я начну с этого инвентаря в hosts.yml:

---
all:
  children:
    nodes:
      hosts:
        node.env1:

И в этой пьесе:

- hosts: localhost
  gather_facts: false

  tasks:
    - name: checking "known_hosts"
      loop: "{{ groups['nodes'] }}"
      lineinfile:
        dest: ./known_hosts
        state: present
        line: "{{ lookup('pipe', 'echo ' + item) }}"
        create: true

я получу следующий вывод:


PLAY [localhost] *************************************************************************************************************************************************************

TASK [checking "known_hosts"] ************************************************************************************************************************************************
changed: [localhost] => (item=node.env1)

PLAY RECAP *******************************************************************************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Исгенерированный known_hosts файл выглядит следующим образом:

node.env1

Если вы используете устаревший формат инвентаря в стиле INI, а не формат инвентаря YAML, то следующий инвентарь будет работать так же, какинвентарь YAML вверху этого ответа:

[nodes]

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