Ansible: 30 модулів для Senior DevOps інженерів (Частина 2)

А що як ми скажемо, що ваша DeLorean створювала б вам менше проблем, якби всі процеси були автоматизовані? Подорожі в часі стали б приємнішими та передбачуванішими 🤔

Продовжуємо серію статей про автоматизацію з Ansible. Переклали другу частину матеріалу з цієї теми, щоб ви могли покращити свої навички. 

Частину модулів ми розглянули у попередньому матеріалі. Тепер перейдемо до тих з них, що пов’язані з керуванням різними файлами та їх атрибутами.

Це модулі для:

  • копіювання або завантаження файлів, 
  • стиснення та розпакування файлів,
  • створення та видалення,
  • керування дозволами на файл або конфігурацією у них,
  • пошуку файлу та заміни тексту всередині.

Почнімо!

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

Цей модуль знадобиться, коли потрібно отримати файл з віддаленої машини на локальну. Знайдете ці файли на локальній машині у директорії з іменем хоста. 

---
- 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'

Ви також можете видалити структуру батьківського каталога для файлу. Для цього  встановіть значення true в аргументі flat.

---

- 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

Модуль для архівування: створює стиснені пакунки файлів у форматах 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 використовують, щоб розпакувати те, що ми запакували за допомогою попереднього модуля. Він також може скопіювати файл на віддалений сервер перед тим, як розпакувати його. 

Модуль використовує команди 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

Цей модуль відповідає за такі задачі, як створення або видалення файлів та директорій, створення символьних посилань, додавання та редагування дозволів на файли та каталоги та інше. 

Для машин на 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.

Для 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 або шаблон в Ansible — це файл з усіма параметрами конфігурації, що надає динамічні значення як змінні. Коли виконується плейбук, у залежності від умов, за допомогою механізму шаблонів Jinja2, змінні отримують відповідні значення.

Такою умовою може бути, наприклад, який кластер ви використовуєте. 

Файли шаблонів зазвичай мають розширення .j2.

Цей модуль робить дві речі: спершу замінює у файлі шаблону синтаксичні змінні інтерполяції 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

Працює так само як і команда Linux find — допомагає знайти файли та каталоги за різними критеріями пошуку. Для 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

Модуль використовують для заміни всіх екземплярів шаблону у файлі. Він підтримує регулярні вирази, а також перед заміною може створити резервну копію файлу.

---
- 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 встановлює, оновлює або вилучає блок у багаторядковому тексті. Блок матиме маркер, що позначає його початок та кінець, щоб зробити завдання ідемпотентним. Це таке завдання, яке можна виконати кілька разів без зміни кінцевого результату після першої ітерації.

За замовчуванням модуль додасть блок у кінці файлу. 

---
- 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>

Висновок

Вітаємо, ви щойно стали вправніше на 12 модулів Ansible! У наступному матеріалі розглянемо ще 7 модулів, щоб ви ще більше розумілися на автоматизації.

Якщо ж хочете сміливо додати навички роботи з Ansible до свого резюме — реєструйтесь на наш курс «Адміністрування та автоматизація за допомогою Ansible». Там ви отримаєте комплексні знання, які одразу зможете застосувати на своєму проєкті.

Залишити відповідь

Відповідь на коментар

Коментарі (1)

    Дякуємо, що поділились