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». Там ви отримаєте комплексні знання, які одразу зможете застосувати на своєму проєкті.