
В прошлой части мы обсудили модули 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Р на курсы Слёрма.
