Как стать автором
Обновить
71.1
Слёрм
Учебный центр для тех, кто работает в IT

Ansible: 30 самых важных модулей для DevOps-профессионалов (часть 2)

Время на прочтение7 мин
Количество просмотров15K
Автор оригинала: Priyam Chauhan

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

Посмотреть программу курса и записаться.

Теги:
Хабы:
Всего голосов 15: ↑14 и ↓1+13
Комментарии1

Публикации

Информация

Сайт
slurm.io
Дата регистрации
Дата основания
Численность
51–100 человек
Местоположение
Россия
Представитель
Антон Скобин