Ansible как скачать файл с сайта
Перейти к содержимому

Ansible как скачать файл с сайта

  • автор:

Запрет копирования файлов в Ansible, если не существует директории назначения

Мне нужно скопировать файл в несколько директорий по списку, но только в те директории, которые реально существуют на диске.

Я пытаюсь сделать через when:

 - name: Копирование индексной страницы во все каталоги документации copy: src: ">/doxygen_documentation/idk2/html/rootindex.html" dest: ">/doxygen_documentation/>/html/rootindex.html" remote_src: yes when: ">/doxygen_documentation/>/html/" | is_dir with_items: - ">" 

Но когда добавляю строку с when, то появляется ошибка:

ERROR! Syntax Error while loading YAML. did not find expected comment or line break The error appears to be in '/home/xi/work/develop/cpp/surfProjects/iksProjects/iks_ansible_script/level0002-iksCdBuild/step0180-generateDoc.plb.yml': line 51, column 97, but may be elsewhere in the file depending on the exact syntax problem. The offending line appears to be: remote_src: yes when: ">/doxygen_documentation/>/html/" | is_dir ^ here We could be wrong, but this one looks like it might be an issue with missing quotes. Always quote template expression brackets when they start a value. For instance: with_items: - > Should be written as: with_items: - ">" 

Как еще можно сделать копирование? Да, я знаю что можно отключить ошибку failed_when: false, но так делать не хотелось бы.

Руководство по Ansible: управление файлами с помощью Ansible

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

Что мы будем делать?

  • Копировать файл с помощью модуля копирования и шаблонов
  • Загрузить файл с помощью модуля выборки
  • Редактировать файл с помощью модулей blockinfile, lineinfile и replace.
  • Управление атрибутами файла

Скопируйте файл с помощью модуля копирования и шаблонов в Ansible

Ansible предоставляет несколько модулей для копирования файла из локального каталога на удаленные целевые машины, это модуль копирования и шаблона.

Разница между модулем копирования и шаблона заключается в том, что модуль копирования скопирует файл из каталога файлов, а шаблон скопирует шаблон Jinja2 из каталога шаблонов в плейбуках Ansible.

Модуль копирования хорош для копирования постоянных файлов, таких как сертификаты, в то время как шаблон более полезен для многократно используемых конфигураций, таких как конфигурация виртуального хоста и т. д.

1. Скопируйте файл с локальной на удаленную целевую машину.

Скопируйте конфигурацию sources.list из каталога локальных файлов на удаленный компьютер /etc/apt/sources.list. Когда есть конфигурация, она будет заменена и сделана резервная копия на основе меток времени.

- name: Copy from Local to Remote Target Machine with 'copy' copy: src: sources.list dest: /etc/apt/sources.list backup: yes

2. Скопируйте файл на удаленном компьютере в другой каталог.

Скопируйте конфигурацию sudoers /etc/sudoers.d/hakase на удаленном компьютере в другой каталог /home/hakase/hakase-suoers.txt. Это можно сделать с помощью опции remote_src.

- name: Copy file from one directory to other on the Remote Machine copy: src: /etc/sudoers.d/hakase dest: /home/hakase/hakase-sudoers.txt remote_src: yes

3. Скопируйте файл и измените разрешение и владельца файла.

Скопируйте файл bash из каталога файлов на удаленный сервер и установите разрешение файла по умолчанию 0755, а владельцем файла является hakase.

- name: Copy file and set up the permission and owner of the file copy: src: simple.sh dest: /home/hakase/simple.sh owner: hakase group: hakase mode: 0755

4. Скопируйте файл с модулем шаблона

Скопируйте конфигурацию шаблона Jinja2 для виртуального хоста nginx из каталога templates в каталог /etc/sites-enabled/ на удаленном компьютере. С помощью шаблона Jinja2 мы можем создавать переменные для нашей конфигурации и делать ее более пригодной для повторного использования.

- name: Copy file using 'template' module template: src: default.j2 dest: /etc/nginx/sites-enabled/ backup: yes owner: root group: root mode: 0644

Загрузите файл с помощью модуля Fetch в Ansible

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

1. Загрузка с удаленного компьютера на локальный

Загрузите файл конфигурации nginx nginx.conf с удаленного сервера в локальную директорию ansible-node /home/hakase/backup для создания резервной копии. И модуль выборки по умолчанию будет включать структуры каталогов.

- name: Download file from Remote Machine to Local ansible-node directory become: yes fetch: src: /etc/nginx/nginx.conf dest: /home/hakase/backup/

2. Загрузка с удаленного на локальный без структур каталогов

Загрузите с удаленного компьютера на локальный ansible-node без структуры каталогов, добавив опцию flat.

- name: Download file from Remote Machine to Local ansible node without directory structures become: yes fetch: src: /etc/nginx/nginx.conf dest: /home/hakase/backup/ flat: yes

Редактировать файлы с помощью Ansible

Теперь собирались редактировать файлы с помощью модулей Ansible. Есть некоторые модули, которые вы должны знать для редактирования файлов с помощью Ansible, такие как blockinfile, lineinfile и replace.

Blockinfile будет вставлять/удалять несколько строк в файл. Lineinfile предназначен для одной строки, а модуль replace можно использовать для замены строки.

1. Вставьте несколько строк в файл, используя blockinfile

Добавьте многострочную конфигурацию в конфигурацию ssh sshd_config с помощью модуля blockinfile. И настройка по умолчанию вставит новую конфигурацию в конец строк.

- name: Insert multiple lines and Backup 
blockinfile:
path: /etc/ssh/sshd_config
backup: yes
block: |
ClientAliveInterval 360
ClientAliveCountMax 0

2. Вставьте несколько строк, используя параметры маркера.

Или, если вы хотите вставить в определенную строку, вы можете использовать опцию маркера и следовать вставить после или вставить до и регулярное выражение, или вы можете использовать оба.

Приведенный ниже плейбук добавит новую дополнительную конфигурацию в файл sshd_config. Дополнительная конфигурация будет добавлена перед строкой UserPAM, окруженной маркером по умолчанию # BEGIN ANSIBLE MANAGED BLOCK.

- name: Insert after regex, backup, and validate 
blockinfile:
path: /etc/ssh/sshd_config
backup: yes
marker: "# ANSIBLE MANAGED BLOCK "
insertbefore: '^UsePAM '
block: |
AllowUsers hakase vagrant
PermitEmptyPasswords no
PermitRootLogin no
validate: '/usr/sbin/sshd -T -f %s'

3. Удалить/удалить окружение блока нескольких линий внутри маркеров.

Удалите блок строк окружения маркером ansible # BEGIN ANSIBLE MANAGED BLOCK.

- name: Remote text block surrounding by markers 
blockinfile:
path: /etc/ssh/sshd_config
marker: "# ANSIBLE MANAGED BLOCK"
content: ""
backup: yes

4. Вставьте новую строку в файл

Вставьте новую строку конфигурации PasswordAuthentication no под строкой регулярного выражения #PermitEmptyPasswords в конфигурацию ssh /etc/ssh/sshd_config.

- name: Insert New Line under the Regex configuration 
lineinfile:
path: /etc/ssh/sshd_config
backup: yes
regexp: '^PasswordAuthentication '
insertafter: '^#PermitEmptyPasswords '
line: 'PasswordAuthentication no'
validate: '/usr/sbin/sshd -T -f %s'

5. Удалить строку из файла с помощью модуля lineinfile

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

- name: Remove a line from the file 
lineinfile:
path: /etc/ssh/sshd_config
state: absent
regexp: '^PasswordAuthentication'

6. Замените строки шаблона регулярным выражением и замените модуль

Теперь собирались заменить строку с помощью модуля replace. Модулю замены требовалось регулярное выражение в качестве бэкэнд-ссылки для замены вида строк.

Измените имя хоста в файле /etc/hosts, используя модуль replace.

- name: Replace the default 
replace:
path: /etc/hosts
regexp: '(\s+)node\.provision\.labs(\s+.*)?$'
replace: '\1box.hakase.labs\2'
backup: yes

7. Раскомментируйте конфигурации

Модуль замены можно использовать для раскомментирования конфигурации в системе Linux. Просто мы можем удалить строку комментария # в начале строки, используя модуль замены.

Раскомментируйте конфигурацию строки server_tokens в файле /etc/nginx/nginx.conf.

- name: Uncomment configuration 
replace:
path: /etc/nginx/nginx.conf
regexp: '#(\s+)server_tokens'
replace: 'server_tokens'
backup: yes

8. Комментарий к строке конфигурации

Ниже следует прокомментировать конфигурацию строки, добавив # в начало строки.

- name: Comment Line configuration replace: path: /etc/nginx/nginx.conf regexp: '(\s+)gzip on' replace: '\n\t#gzip on' backup: yes

Установите атрибуты файлов с помощью файлового модуля в Ansible

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

1. Создайте символическую ссылку на файл

Создайте файл символической ссылки на удаленном хосте для конфигурации виртуального хоста nginx с именем vhost в каталоге /etc/nginx/sites-enabled/.

- name: Create Symlink of file 
file:
src: /etc/nginx/sites-available/vhost
dest: /etc/nginx/sites-enabled/vhost
owner: root
group: root
state: link

2. Создайте новый каталог, используя файловый модуль

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

- name: Create a New Directory using file 
file:
path: /etc/nginx/ssl
state: directory
owner: root
group: root
mode: 0755

Как работает копирование файлов с помощью ansible?

В документации так написано, что со слешем копирует содержимое, без — саму папку.
У меня же не копирует. Висит минуты 3-4 а потом нагружает диск так, что на сервер по ssh не зайти.
Если заранее top запустить, то wa 96-97
Однажды не прервал по Ctrl-C, оставил на часок висеть — убила корневую ФС. В РО примонтировала и после перезагрузки не восстановилась. Даже fsck не помогла. Пришлось виртуалку из бэкапа восстанавливать.
Что это? Как исправить?

  • Вопрос задан более трёх лет назад
  • 4617 просмотров

3 комментария

Оценить 3 комментария

Копирование файлов посредством ansible

Что-то не смог понять из примеров в документации — как же скопировать файл с удалённого сервера на локальный и наоборот? Вот есть модули copy и fetch, например. Вот я пишу в плейбуке:

- name: Copy file from remote host to local machine fetch: src=/tmp/somefile dest=/tmp/fetched(взято из доки) 

Как указать ansible, с какого хоста я хочу скопировать файл? Ну и соответственно, при копировании на удалённый хост, где указывать этот удалённый хост? P.S. Немного разобрался: Чтобы скопировать файл с удалённого хоста на локальный:

- hosts: localhost vars_files: - config.yml tasks: - include: ../share/dev.yml - name: Get file from remote fetch: src="https://ru.stackoverflow.com/questions/506325/%3C%3C%20remote_sources_path%20%3E%3E/test.txt" dest="backup" delegate_to: '>' tags: fetch 

Файл test.txt будет лежать в каталоге ./backup/localhost/<< remote_sources_path >> Скопировать с локального на удалённый:

- name: Send file to remote copy: src="https://ru.stackoverflow.com/questions/506325/%3C%3C%20local_sources_path%20%3E%3E/to_remote_test.txt" dest=> delegate_to: '>' tags: fetch 

Подозреваю, что, если указать в начале — hosts: << remote_host >> вместо localhost, то delegate_to использовать не нужно.

Отслеживать
Sviderskiy Dmitriy
задан 24 мар 2016 в 15:11
Sviderskiy Dmitriy Sviderskiy Dmitriy
154 1 1 золотой знак 1 1 серебряный знак 11 11 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Ну зачем же так сложно? ))

Все эти задачи решаются и без мороки с Delegation и Local Actions, вам же самим потом сложнее будет разбираться в собственных плейбуках или читать чужие, написанные по-простому.

В каждом плейбуке вы указываете на каких хостах запускать задачи — пишете hosts: ‘>’ (если хотите из командной строки управлять списком через —extra-vars «target=10.0.100.123») или hosts: dbservers (если фиксировать плейбук на группу хостов):

--- # This playbook for quick tests. - name: quick tests hosts: '>' become: true become_user: root roles: - role1 - role2 tasks: - name: install mc yum: name=mc state=latest - name: install wget yum: name=wget state=latest 

Эти хосты — «удалённый» сервер, ну а «локальный» — это само собой хост, на котором находится ваш плейбук.

  • Для копирования файла с локального сервера на удалённый — используете модуль copy
  • Для копирования файла с удалённого сервера на локальный — используете модуль fetch

И в copy и в fetch src — это откуда брать файл, а dest — это куда положить файл. Для copy src=local а dest=remote, для fetch — наоборот src=remote, а dest=local.

Вот и всё. Вам кстати именно об этом говорили в комментарии к вашему последнему вопросу: «В целом Ansible подразумевает то, что ты уже на удаленном хосте», не надо нарезать лишние петли вокруг локалхоста.

PS Если нужно копировать с произвольного хоста на произвольный хост — то смотрите в сторону модуля syncronyze на основе rsync. Но вообще в 90% случаев вам понадобится копирование с локального хоста на удалённый и будете использовать copy или template.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *