#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}}"