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

Одна із задач DevOps інженера — автоматизація всього, що можна. Автоматизувати доставлення, настройку та розгортання застосунків можна з Ansible. Це ПЗ, що дозволяє управляти конфігурацією, оркеструвати, централізовано встановлювати застосунки та паралельно виконувати типові завдання на групі систем.  

Щоб використовувати його на повну потужність, варто ознайомитися з модулями та їх використанням. Знайшли та переклали корисний матеріал, що допоможе розібратися у темі.

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

Є кілька найважливіших модулів Ansible, які часто використовують для автоматизації різних завдань. Їх досить багато, тож цю тему ми розділимо на три частини. 

Зараз ми розглянемо модулі для:

  • перевірки підключення хосту та цільового вузла, 
  • отримання інформації з ноди, 
  • встановлення та керування пакетами,
  • запуску на вузлах базових команд та сценаріїв.

Нумо досліджувати!

ping

Цей модуль використовують для перевірки підключення до віддаленого хосту та часто, щоби перевірити python на ньому. Також підходить для перегляду входів у систему та прав користувача.

---
- name: ping module 
  hosts: all
  become: false
  tasks:
    - name: test connection
      ping:

В результаті отримаєте:

host-1 | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: false,
“ping”: “pong”
}

Що важливо знати про модуль ping:

  • Він не підходить для ICMP, проте працює за замовчуванням на SSH або будь-якому іншому визначеному методі підключення.
  • Ping приймає дані та видає значення pong, crash або інший рядок.
  • Значення за замовчуванням — pong. Це означає, що все добре.
  • У випадку невдачі, дані отримають значення crash, а модуль видасть виняток.

setup

Setup допомагає зібрати дані про ноди — ім’я хосту, ip-адресу, інформацію про операційну систему та інші.

Цей модуль автоматично викликає плейбук, щоб зібрати корисні змінні про віддалений хост. Користувач отримує інформацію у зручному форматі JSON, де всі значення починаються з «ansible_».

ansible host-1 -m setup -u ec2-user

Команда приведе до такого результату: 

Ви також можете фільтрувати результат за допомогою параметра filter:

ansible all -m setup -u ec2-user -a 'filter=ansible_os_family'

yum

Цей модуль знадобиться, щоб встановлювати різні пакунки або ПЗ на версіях Linux, заснованих на Red Hat. 

---
- name: Update Package on linux system
  hosts: all
  become: yes
  tasks:
  - name: Uninstall Apache
    yum:
      name: nginx
      state: absent
  - name: Install a list of packages with a list variable
    yum:
      name: "{{ packages }}"
    vars:
      packages:
      - httpd
      - httpd-tools

apt

Модуль для керування програмним забезпеченням в Linux на основі Debian.

---
- name: Update Package on debian system
  hosts: all
  become: yes
  tasks:
  - name: Run the equivalent of "apt-get update" as a separate step
    apt:
      update_cache: yes
  - name: Install latest version of "openjdk-6-jdk" 
    apt:
      name: openjdk-6-jdk
      state: latest
      install_recommends: no

package

Модуль package керує пакетами на цільовій ноді. При цьому він не вказує модуль менеджера пакунків — lyum, apt або інший. Його зручно використовувати у різнорідному середовищі машин, адже вам не треба створювати конкретне завдання для кожного менеджера пакетів. Він діє як проксі базового модуля менеджера пакетів.

---
- name: Update Packages on target system
  hosts: all
  become: yes
  tasks:
  - name: Install ntpdate
    ansible.builtin.package:
      name: ntpdate
      state: present
   
  - name: Install the latest version of Apache and MariaDB
    ansible.builtin.package:
      name:
        - httpd
        - mariadb-server
      state: latest

pip

Використовують для керування пакунками python у цільовій системі. 

---
- name: Update python packages
  hosts: all
  become: yes
  tasks:
  - name: Install multi python packages with version specifiers
    pip:
      name:
        - django>1.11.0,<1.12.0
        - bottle>0.10,<0.20,!=0.11
  - name: Install specified python requirements
    pip:
      requirements: /my_app/requirements.txt

npm

Цей модуль використовують для керування пакетами node.js. Він не входить до базових модулів Ansible. Щоб використати його у плейбуці, вкажіть community.general.npm.

---
- name: npm module
  hosts: all
  tasks:
  - name: Install "coffee-script" node.js package.
    community.general.npm:
      name: coffee-script
      path: /app/location
  - name: Install packages based on package.json.
    community.general.npm:
      path: /app/location

raw

Цей модуль дозволяє виконати команду SSH із низьким рівнем доступу. Це корисно у декількох випадках. Найпопулярніший варіант — для встановлення python у системі, у якій його немає. Інший варіант використання: для спілкування з пристроями, наприклад, маршрутизаторами, на яких не встановлено python.

В інших випадках краще використовувати модулі shell або command. Аргументи, які отримує raw, запускаються безпосередньо через налаштовану віддалену оболонку.

---
- name: raw module usage
  hosts: all
  become: yes
  tasks:
  - name: Bootstrap a host without python2 installed
    raw: dnf install -y python2 python2-dnf libselinux-python
  
  - name: Run a command that uses non-posix shell-isms (in this example /bin/sh doesn't handle redirection and wildcards together but bash does)
    raw: cat < /tmp/*txt
    args:
      executable: /bin/bash

command

Використовуйте цей модуль для того, щоб виконати команди на віддаленому вузлі. Здебільшого мова про прості команди Linux. Тут вони не обробляються через оболонку, тож змінні, як $HOSTNAME, та операції  «*», «<», «>», «|», «;» і «&» не працюватимуть. 

Для таких цілей у Windows підійде модуль win_command.

---
- name: command module
  hosts: all
  tasks:
  - name: Run command if /path/to/database does not exist (without 'args')
    command: /usr/bin/make_database.sh db_user db_name creates=/path/to/database
  - name: Run command if /path/to/database does not exist (with 'args' keyword)
    ansible.builtin.command: /usr/bin/make_database.sh db_user db_name
    args:
      creates: /path/to/database

shell

Модуль задуманий, щоб виконувати команди оболонки на цільових хостах на основі Unix. На противагу модулю command, shell приймає дуже складні команди з каналами та редиректами. 

Цей модуль підходить лише для машин на базі Linux. Для Windows є win_powershell.

---
- name: shell module
  hosts: all
  tasks:
  - name: This command will change the working directory to somedir/ and will only run when somedir/somelog.txt doesn't exist
    shell: somescript.sh >> somelog.txt
    args:
      chdir: somedir/
      creates: somelog.txt
  
  - name: This command will change the working directory to somedir/
    shell:
      cmd: ls -l | grep log
      chdir: somedir/
  
  - name: Run a command that uses non-posix shell-isms (in this example /bin/sh doesn't handle redirection and wildcards together but bash does)
    shell: cat < /tmp/*txt
    args:
      executable: /bin/bash

script

Script використовують, щоб запустити локальний сценарій на віддаленій ноді. Коли ми викликаємо модуль shell і надаємо йому локальний сценарій оболонки, спершу він передає його ноді, а потім виконує. Модулю script не потрібен python на віддаленому вузлі, а сценарій виконується через оболонку. 

Вузли на основі Windows теж підтримують цей модуль.

---
- name: script module
  hosts: all
  tasks:
  -  name: Run a script with arguments (free form)
     ansible.builtin.script: /some/local/script.sh --some-argument 1234
   
  -  name: Run a script with arguments (using 'cmd' parameter)
     ansible.builtin.script:
       cmd: /some/local/script.sh --some-argument 1234

Висновок

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

За три тижні навчимо встановлювати та налаштовувати оточення Ansible, створювати плейбуки з нуля та застосовувати їх на практиці, працювати з модулями й Ansible Galaxy, писати ролі, налаштовувати їх змінні, а також застосовувати в роботі Ansible AWX.

Мерщій до нових навичок! 😎

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

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