2016-01-11 4 views
17

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

Я не могу найти модуль для чтения удаленных файлов с возможностью доступа (поиск выглядит только на локальном хосте).

Вы знаете какой-либо модуль?

Благодаря

EDIT:

Вот мой случай использования:

сгенерировать ключи SSH и добавить его в GitHub. Эти клавиши настройки объектом в вар файлов, так что я цикл, как это для его генерации:

tasks: 
    - name: Create ssh key 
    user: 
     name: "{{sshConfigFile.user}}" 
     generate_ssh_key: yes 
     ssh_key_file: ".ssh/{{item.value.file}}" 
     state: present 
    with_dict: "{{sshConfiguration}}" 

Это работает очень хорошо, но, как читать эти ключи, чтобы отправить его на GitHub через API?

+0

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

+0

Я редактирую вопрос в своем примере использования. – Kiva

ответ

9

Как вы сказали, все поисковые запросы находятся на локальном хосте. Но все они могут быть сделаны на удаленном компьютере, используя shell и register. Можете ли вы сказать, что именно вы пытаетесь сделать? просто пример.

- shell: cat "{{remote_file}}" 
    register: data 

    - shell: ...... 
    with_xxxx: 
+0

Я попытался это сделать, но не могу, потому что мне нужно зациклиться на другом объекте. – Kiva

+0

Неверный ответ, избегайте оболочки и командных модулей, где это возможно (они не являются естественно идемпотентными), вы должны использовать модуль slurp. Возможно, это потому, что это только чтение, если команда оболочки приемлема, но лучше всего привыкнуть к избегая команд оболочки, где существует естественное доступное решение. см. мой ответ ниже для лучшего подхода. – danday74

3

Вы можете попробовать 'fetch' модуль, который будет извлекать ключевой файл на пути назначения на localhost:

fetch: 
    src: ".ssh/{{item.value.file}}" 
    dest:"/tmp/ssh_keys/{{item.value.file}}" 
    flat: yes 
with_dict: "{{sshConfiguration}}" 
+0

Хороший ответ, но лучше slurp, который позволяет избежать создания файла tmp на localhost. Документы для извлечения говорят, что под капотом используется slurp – danday74

+0

@ danday74 Вы правы в том, что использование slurp позволит избежать временного файла. Однако, если вы перечитаете заметку для извлечения, в ней указано «* При запуске fetch с' стать', также будет использоваться модуль slurp [...] * "В этом примере он не используется, становится – Oberst

24

Либо работать с --diff флагом (выводит диф когда файл назначения изменения) ..

ansible-playbook --diff server.yaml 

или хлебать его ..

- name: Slurp hosts file 
    slurp: 
    src: /etc/hosts 
    register: slurpfile 

- debug: msg="{{ slurpfile['content'] | b64decode }}" 
+0

atow i rekon, это когда-нибудь будет лучшим ответом – danday74

+1

Это должен быть правильный ответ ... –

1

Вы можете зарегистрировать содержимое файла в переменной, используя команду register. Вот что я хотел бы предложить:

- name: get contents of file 
    command: cat /path/to/file 
    register: filename 
    become: true # use case specific option 

- name: viewing the contents 
    debug: 
    msg: "{{filename.stdout}}" 

Будет отображено содержимое файла.

0

С помощью командного модуля вы можете прочитать или использовать этот файл в другой задаче в удаленном узле.

как

-command: cp /tmp/xxx/example.sh /usr/local/yyy