Альтернатива для поиска ansible, поскольку он всегда ищет файлы на localhost

#file #ubuntu #ansible #terraform #lookup

#файл #ubuntu #ansible #terraform #поиск

Вопрос:

Я запускаю ansible playbook внутри terraform local-exec provisioner со встроенной инвентаризацией IP-адреса удаленного экземпляра.

 - name: Install git
  apt:
    name: git
    state: present
    update_cache: yes

- name: Clone the git repository
  become_user: "{{ SSH_USER }}"
  git:
    repo: "{{ REPO_URL }}"
    dest: "{{ SRC_DIR }}"

- name : Find files with .pub extension
  become_user: "{{ SSH_USER }}"
  find:
    paths: "{{ SRC_DIR }}"
    patterns: '*.pub'
  register: pub_files

- name: Append the content of all public key files to authorized_keys file.
  become_user: "{{ SSH_USER }}"
  lineinfile:
    path: "{{ DEST_FILE }}"
    line: "{{ lookup('file', '{{ item.path }}') }}"
    insertafter: EOF
    create: "yes"
    state: present
# loop: "{{ lookup('fileglob', "{{ SRC_DIR }}/*.pub", wantlist=True) }}"
# with_fileglob: "{{ SRC_DIR }}/*.pub"
  with_items: "{{ pub_files.files }}"      
    
- name: Display destinationFile contents
  become_user: "{{ SSH_USER }}"
  command: cat "{{ DEST_FILE }}"
  register: command_output

- name: Print to console
  become_user: "{{ SSH_USER }}"
  debug:
    msg: "{{command_output.stdout}}"  
 

Ansible playbook должен клонировать репозиторий git и копировать содержимое его файлов в другой файл.
Но при использовании поиска ansible для чтения содержимого файлов (которые клонируются на удаленном хосте), он всегда ищет файл на локальном хосте.

Как и все шаблоны, поиск выполняется и оценивается на управляющей машине Ansible.

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

 No such file or directory found
 

Аналогичная проблема возникала при использовании with_fileglob и loop с поиском по файлу для перебора файлов, поскольку они также выполняют поиск внутри. Я заменил это find модулем для перечисления имен файлов, register его в переменной, а затем повторите его на следующем шаге, используя with_items .

Есть ли такая альтернатива для чтения содержимого файлов?

Комментарии:

1. Похоже, в вашем playbook уже есть задача прочитать содержимое удаленного файла («Отобразить содержимое файла назначения»). Вы получаете содержимое удаленного файла и помещаете его в переменную ( command_output.stdout ) . Разве это не то, о чем вы спрашиваете?

2. @larsks Да, я пробовал именно так. Но доступ к выводам cat из зарегистрированной переменной не работал для меня должным образом.

3. Ваш ответ («Он работал так, как я делал это с помощью cat»), похоже, противоречит этому комментарию…

4. @larsks Извините, на самом деле это не было проблемой с cat. Я неправильно отфильтровывал содержимое открытого ключа из переменной file_content . Когда я это исправил, метод cat сработал.

Ответ №1:

Сначала выполняется их возврат на управляющий узел ansible. И обратите внимание, что ansible имеет модуль authorized_keys, который упрощает задачу добавления ключей.

   tasks:
  - name: find all the .pub files
    find: 
      paths: "/path/remote"
      recurse: no
      patterns: "*.pub"
    register: files_to_fetch
  - debug:
      var: files_to_fetch.files

  - name: "fetch .pub files from remote host"
    fetch: 
      flat: yes
      src:  "{{ item.path }}"
      dest: ./local/
    with_items: "{{ files_to_fetch.files }}"

  - name: update SSH keys
    authorized_key:
     user: user1
     key: "{{ lookup('file', item) }}"
     state: present
     #exclusive: yes
    with_fileglob:
      - local/*.pub

 

Ответ №2:

Это сработало так, как я это делал cat .

 - name: Install git
  become_user: root
  apt:
    name: git
    state: present
    update_cache: yes   

- name: Clone the git repository
  git:
    repo: "{{ REPO_URL }}"
    dest: "{{ SRC_DIR }}"

- name : Find file names with .pub extension
  find:
    paths: "{{ SRC_DIR }}"
    patterns: '*.pub'
  register: pub_files 
 
- name: Get contents of all those .pub files
  shell: cat {{ item.path }}
  register: file_content
  with_items: "{{ pub_files.files }}" 

- name: Print file_content to console
  debug:
    var: item.stdout
  with_items:
    - "{{ file_content.results }}"

- name: Append the content of all public key files to authorized_keys file.
  lineinfile:
    path: "{{ DEST_FILE }}"
    line: "{{ item.stdout }}"
    insertafter: EOF
    create: "yes"
    state: present
  with_items:
    - "{{ file_content.results }}"   
    
- name: Display destinationFile contents
  command: cat "{{ DEST_FILE }}"
  register: command_output

- name: Print to console
  debug:
    msg: "{{command_output.stdout}}"