Запрет копирования файлов в 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.