В прошлой части мы обсудили модули Ansible и прочитали о некоторых важных модулях. Таких, как модуль проверки подключения хоста и целевого узла (модуль ping), модуль, способный извлекать информацию из целевого узла (модуль setup), модуль управления существующим пакетом и установки новых (модули yum, apt, package, pip и npm), а также модуль запуска базовых команд и сценариев на целевых узлах (модули raw, command, shell и script).
В этой части серии мы рассмотрим все модули, связанные с управлением различными файлами и их свойствами, такими как модуль копирования или загрузки файлов (модули copy, fetch и get_url), модуль сжатия и распаковки файлов (модули archive и unarchive), модуль создания/удаления (модуль file), модуль управления доступом к файлам (модуль acl), модуль управления файловой конфигурацией (модуль template), модуль поиска файлов (модуль find) и модуль для замены текста внутри содержимого файла (модули replace, lineinfile и blockinfile).
Поехали…
Модуль copy
Модуль copy может использоваться для копирования файла с локального/удаленного устройства и передаваться на другое устройство. Для компьютера с Windows можно использовать модуль win_copy.
---
- name: copy module
hosts: localhost
tasks:
- name: copy a file from local machine to local machine
copy:
src: files/src.txt
dest: files/dest.txt
---
- name: copy module
hosts: all
tasks:
- name: copy a file from remote machine to remote machine
copy:
src: /etc/src.txt
dest: /etc/dest.txt
- name: copy a file from local machine to remote machine with owner and permissions
copy:
src: files/src.txt
dest: /etc/dest.txt
owner: foo
group: foo
mode: '0644'
Модуль fetch
Модуль fetch можно использовать каждый раз, когда мы хотим передать файл с удаленного устройства на локальный. Файлы хранятся на локальном устройстве в озаглавленном каталоге, соответствующем имени хоста.
---
- name: fetch module
hosts: all
tasks:
- name: copy a file from remote machine to local machine
fetch:
src: /var/log/access.log
dest: /var/log/fetched
- name: copy a file from local machine to remote machine with owner and permissions
copy:
src: files/src.txt
dest: /etc/dest.txt
owner: foo
group: foo
mode: '0644'
Также можно удалить структуру родительских папок для файла, выставив в параметрах значение flat = true.
---
- name: fetch module
hosts: all
tasks:
- name: copy a file from remote machine to local machine without parent folder structure.
fetch:
src: /var/log/access.log
dest: /var/{{ inventory_hostname }}/
flat: true
Модуль get_url
Модуль get_url можно использовать для загрузки файлов с серверов HTTPS/HTTP/FTP. По умолчанию этот модуль использует прокси, с настройками для узла. Пользовательский прокси можно использовать, установив переменную среды или используя опцию use_proxy.
---
- name: get_url module
hosts: all
tasks:
- name: download tomcat from apache
get_url:
url: https://downloads.apache.org/tomcat/tomcat-8/v8.5.81/bin/apache-tomcat-8.5.81-deployer.tar.gz
dest: /tmp/download/tomcat
mode: 0755
owner: tomcat
group: tomcat
Модуль archive
Модуль archive используется для создания сжатого файлового пакета форматов zip, tar, gz, bz2 и xz. По умолчанию выдвигается гипотеза о том, что исходный файл, который вы пытаетесь сжать, действительно существует и он не копирует перед сжатием исходный файл на целевой узел. Важно также иметь в виду, что необходима предустановка типа пакета, используемого в качестве конечного сжатого файла, на целевом узле.
---
- name: archive module
hosts: all
tasks:
- name: Compress directory /path/to/foo/ into /path/to/foo.tgz
archive:
path: /path/to/foo
dest: /path/to/foo.tgz
- name: Compress regular file /path/to/foo into /path/to/foo.gz and remove it
archive:
path: /path/to/foo
remove: yes
- name: Create a bz2 archive of multiple files, rooted at /path
archive:
path:
- /path/to/foo
- /path/wong/foo
dest: /path/file.tar.bz2
format: bz2
- name: Create a gz archive of a globbed path, while excluding specific dirnames
archive:
path:
- /path/to/foo/*
dest: /path/file.tar.bz2
exclude_path:
- /path/to/foo/bar
- /path/to/foo/baz
format: gz
Модуль unarchive
Модуль unarchive используется для распаковки архивных файлов, таких как tar, gz, zip. Он также может скопировать файл на удаленный сервер перед его распаковкой. Модуль использует команды unzip и tar -xzf для распаковки сжатого файла, поэтому эти команды должны быть установлены на целевых узлах. Для Windows можно использовать узел win_unzip.
---
- name: unarchive module
hosts: all
tasks:
- name: Extract foo.tgz into /var/lib/foo
unarchive:
src: foo.tgz
dest: /var/lib/foo
- name: Unarchive a file that is already on the remote machine
unarchive:
src: /tmp/foo.zip
dest: /usr/local/bin
remote_src: yes
- name: Unarchive a file that needs to be downloaded
unarchive:
src: https://example.com/example.zip
dest: /usr/local/bin
remote_src: yes
Модуль file
Модуль file отвечает за выполнение таких задач, как создание файлов и каталогов, их удаление, создание мягких и жестких символических ссылок, добавление и изменение разрешений для файлов и каталогов и многое другое. Для компьютера с Windows можно использовать модуль win_file.
---
- name: file module
hosts: all
tasks:
- name: Create a file
file:
path: /etc/foo.conf
state: touch
mode: u=rw,g=r,o=r
- name: Create a directory if it does not exist
file:
path: /etc/some_directory
state: directory
mode: '0755'
- name: Remove file (delete file)
file:
path: /etc/foo.txt
state: absent
- name: Change file ownership, group and permissions
file:
path: /etc/foo.conf
owner: foo
group: foo
mode: '0644'
- name: Create a symbolic link
file:
src: /file/to/link/to
dest: /path/to/symlink
owner: foo
group: foo
state: link
Модуль acl
Модуль acl используется для создания и изменения записей списка контроля доступа, как и функции команд getfacl и setfacl. Этот модуль требует, чтобы списки управления доступом были включены в целевую файловую систему, а также установку двоичных файлов setfacl и getfacl. Для компьютера с Windows можно использовать модуль win_acl.
---
- name: acl module
hosts: all
tasks:
- name: Grant user Joe read access to a file
acl:
path: /etc/foo.conf
entity: joe
etype: user
permissions: r
state: present
- name: Removes the acl for Joe on a specific file
acl:
path: /etc/foo.conf
entity: joe
etype: user
state: absent
- name: Sets default acl for joe on foo.d
acl:
path: /etc/foo.d
entity: joe
etype: user
permissions: rw
default: yes
state: present
Модуль template
Модуль template представляет собой файл, который содержит все параметры конфигурации пользователя, но динамические значения задаются как переменные. Во время выполнения плейбука, в зависимости от условий, например, от того, какой кластер вы используете, переменные будут заменены на соответствующие значения с помощью механизма шаблонов Jinj2. Файлы шаблонов обычно имеют расширение .j2.
Модуль template выполняет две вещи: во-первых, заменяет интерполяционные переменные синтаксиса Jinja2, присутствующие в файле шаблона, фактическими значениями, во-вторых, копирует (scp) файл на удаленный сервер.
---
- name: template module
hosts: all
tasks:
- name: Template a file to /etc/file.conf
template:
src: /mytemplates/foo.j2
dest: /etc/file.conf
owner: bin
group: wheel
mode: '0644'
Модуль find
Модуль find функционирует так же, как и команда поиска Linux, помогая находить файлы и каталоги на основе различных критериев поиска. Для Windows вместо этого следует использовать модуль win_find.
---
- name: find module
hosts: all
tasks:
- name: Recursively find /tmp files older than 2 days
find:
paths: /tmp
age: 2d
recurse: yes
- name: Recursively find /tmp files older than 4 weeks and equal or greater than 1 megabyte
find:
paths: /tmp
age: 4w
size: 1m
recurse: yes
- name: Recursively find /var/tmp files with last access time greater than 3600 seconds
find:
paths: /var/tmp
age: 3600
age_stamp: atime
recurse: yes
Модуль replace
Модуль replace используется для замены всех вариаций соответствующей строки в файле. Он также поддерживает регулярное выражение и может создавать резервную копию файла перед заменой.
---
- name: replace module
hosts: all
tasks:
- name: Ansible replace Unix with Linux
replace:
path: /etc/ansible/sample.txt
regexp: 'Unix'
replace: 'Linux'
- name: Replace before the expression till the begin of the file
replace:
path: /etc/apache2/sites-available/default.conf
before: '# live site config'
regexp: 'Unix'
replace: 'Linux'
- name: Replace between the expressions and create a backup
replace:
path: /etc/hosts
after: '<VirtualHost [*]>'
before: '</VirtualHost>'
regexp: 'Unix'
replace: 'Linux'
backup: yes
Модуль lineinfile
Модуль lineinfile незаменим в тех случаях, когда вы хотите добавить, удалить или изменить одну строку в файле. Можно также использовать режим сопоставления строки перед изменением или удалением при помощи регулярных выражений. Вы можете повторно использовать и изменять строку, используя параметр обратной ссылки. Также можно использовать свойства insertafter и insertbefore для внесения изменений в указанную часть файла.
---
- name: lineinfile module
hosts: all
tasks:
- name: adding a line
lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: SELINUX=enforcing
- name: deleting a line
lineinfile:
path: /etc/sudoers
state: absent
regexp: '^%wheel'
- name: Replacing a line
lineinfile:
path: /etc/hosts
regexp: '^127\.0\.0\.1'
line: 127.0.0.1 localhost
- name: replace a line only after a specified string
lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen '
insertafter: '^#Listen '
line: Listen 8080
Модуль blockinfile
Модуль blockinfile вставит/обновит/удалит блок многострочного текста. Блок будет выделен метками, такими как begin и end, для того, чтобы сделать задачу идемпотентной. По умолчанию блок будет вставлен в конец файла.
---
- name: blockinfile module
hosts: all
tasks:
- name: insert a block into a file
blockinfile:
path: /etc/ssh/sshd_config
block: |
Match User ansible-agent
PasswordAuthentication no
- name: Insert/Update HTML surrounded by custom markers after <body> line
blockinfile:
path: /var/www/html/index.html
marker: "<!-- {mark} ANSIBLE MANAGED BLOCK -->"
insertafter: "<body>"
block: |
<h1>Welcome to {{ ansible_hostname }}</h1>
<p>Last updated on {{ ansible_date_time.iso8601 }}</p>
В третьей части серии мы поговорим о модуле, который используется при обработке сервиса (модуль service), модулях управления пользователями и группами (модуль user и модуль group), модуле управления cron (модуль cron), модуле печати сообщений во время выполнения плейбука (модуль debug) и модулях, включающих переменные и роли (модуль include_vars и модуль include_role).
Еще больше о работе с Ansible
Тех, кто хочет научиться управлять серверами и автоматизировать задачи с помощью Ansible, мы приглашаем на наш курс «Ansible: Infrastructure as Code», который пройдет с 23 января по 19 февраля.
Знания из курса особенно пригодятся администраторам, инженерам и желающим подняться вверх по карьерной лестнице в качестве девопса.
На курсе вы:
Узнаете как работать с переменными, как писать плейбуки и роли;
Развернете LEMP стек, PostgreSQL и Mongo кластеры,
Задеплоите Flask приложение;
Напишите свой модуль для Ansible;
Настроите IaC в Gitlab;
Разберетесь с работой с облаками и enterprise решениями.
После обучения вы сможете конфигурировать рутинные задачи с помощью удобного инструмента без страха правок конфигураций. Вы будете понимать, когда и как писать свои модули, а также смело залазить под капот Ansible.
Купите курс до 28 декабря и участвуйте в розыгрыше сертификата на 500 000Р на курсы Слёрма.