Урок за начинаещи по Ansible: Наръчник и команди

⚡ Умно обобщение

Ansible е автоматизиран енджин с отворен код, без агенти, който конфигурира сървъри през SSH, изпълнява ad-hoc команди и оркестрира сложни внедрявания чрез YAML плейбукове, роли и шаблони за многократна употреба в Linux и... Windows инфраструктура.

  • 🧩 Без агент Archiтекстура: Ansible се свързва с клиенти през SSH и качва модули, така че не е необходимо да се инсталира агентски софтуер на управляваните възли.
  • 📥 Монтаж: Настройте Ansible на контролния възел с yum и EPEL на CentOS или RHEL, или с apt и PPA на Ubuntu или Дебиан.
  • Специални команди: Изпълнявайте еднократни задачи, като например ping, копиране или yum в рамките на инвентар, използвайки синтаксиса на модула ansible -m.
  • 📜 Книги-игри: Опишете желаното състояние в YAML плейбукове, които групират плейове, задачи и модули, за да конфигурират много сървъри последователно.
  • 🧱 Роли и шаблони: Разделяйте големи плейбукове на роли за многократна употреба, създадени с ansible-galaxy, и рендирайте конфигурационни файлове с шаблони Jinja2.
  • 🔁 Управляващи и факти: Задействайте обработчици чрез известители при промяна и използвайте променливи gather_facts за условна, повтаряема автоматизация.
  • 🎯 Казус: Един единствен плейбук p4.yml може да изпълнява ролите selinux, httpd и resolver на всички хостове, като всеки от тях се контролира от таг.

Урок за начинаещи по Ansible, обхващащ инсталация, ad-hoc команди, плейбукове, роли и шаблони

Ansible е един от най-широко използваните инструменти за автоматизация с отворен код в съвременния... DevOps, ценен заради дизайна си без агенти и простите, четливи конфигурационни файлове. Това ръководство за начинаещи на Ansible обяснява какво представлява Ansible, как да го инсталирате и как да използвате ad-hoc команди, плейбукове, роли и шаблони чрез практически примери.

Какво е Ansible?

Ansible е инструмент с отворен код за автоматизация и оркестрация за осигуряване на софтуер, управление на конфигурации и внедряване на софтуер. Той конфигурира Unix-подобни системи и Windows системи, предоставяйки инфраструктура като код чрез собствен декларативен език. Ansible често се сравнява с инструменти, базирани на агенти, като например Кукла на конци.

Ansible е популярен заради лесната си инсталация, лесното свързване на клиенти и дизайна си без агенти. Той се свързва с клиенти през SSH, така че не е необходим специален агент от страна на клиента. Ansible изпраща модули към всеки клиент, модулите се изпълняват локално и техният изход се връща на Ansible сървъра.

Тъй като разчита на SSH, Ansible се свързва лесно с клиенти, използвайки SSH ключове, което опростява целия процес. Данните за клиента, като имена на хостове или IP адреси и SSH портове, се съхраняват във файлове, наречени инвентарни файлове. След като създадете и попълните инвентарен файл, Ansible може да го използва.

Защо да използвате Ansible?

Ето някои важни предимства от използването на Ansible:

  • Едно от най-значимите предимства на Ansible е, че е безплатен за ползване от всички.
  • Не изисква специални умения на системния администратор за инсталиране и използване, а официалната документация е много изчерпателна.
  • Модулността му в плъгини, модули, инвентаризации и плейбукове прави Ansible отличен спътник за оркестриране на големи среди.
  • Ansible е лек и последователен, без ограничения върху операционната система или основния хардуер.
  • Много е сигурен благодарение на дизайна си без агенти и използването на функции за сигурност на OpenSSH.
  • Ansible има плавна крива на обучение, подкрепена от подробна документация и лесна за научаване структура и конфигурация.

Тези силни страни, особено когато се преценяват спрямо други алтернативи на Ansible, обясняват бързото му приемане. Преди инсталирането му е полезно да се разбере как се е развил проектът.

История на Ansible

Ето важните забележителности в историята на Ansible:

  • Проектът Ansible започна през февруари 2012 г. Той е разработен за първи път от Майкъл ДеХаан, създателят на Cobbler и Func (Fedora Unified Network Controller).
  • Първоначално наречена AnsibleWorks Inc, компанията, финансираща Ansible, е придобита от RedHat през 2015 г. и по-късно, заедно с RedHat, е преместена под... IBM чадър.
  • Днес Ansible е включен в дистрибуции като Fedora Linux, RHEL, CentOS и... Oracle Linux.

Важни термини, използвани в Ansible

Следните термини се появяват в този урок за Ansible и е добре да ги знаете, преди да започнете:

Ansible сървър

Машината, на която е инсталиран Ansible и от която се изпълняват всички задачи и плейбуци.

Модули

Модулът е команда или набор от подобни Ansible команди, предназначени за изпълнение от страна на клиента.

Task

Задачата е раздел, който се състои от една процедура, която трябва да бъде изпълнена.

Роля

Начин за организиране на задачи и свързани файлове, така че да могат да бъдат извикани по-късно в плейбук.

факт

Информация, извлечена от глобалните променливи на клиентската система чрез операцията gather_facts.

Опис

Файл, съдържащ данни за клиентските сървъри на Ansible. В по-късните примери е дефиниран като файл hosts.

Пусни видео

Изпълнението на наръчник с пиеси.

треньор

Задача, която се извиква само когато е наличен нотификатор.

Известител

Секция, приписвана на задача, която извиква манипулатор, ако изходът се промени.

Tag

Име, зададено на задача, което може да се използва по-късно за изпълнение само на тази конкретна задача или група от задачи.

Ansible инсталация в Linux

След като сте претеглили възможностите си и сте решили да използвате Ansible, следващата стъпка е да го инсталирате на вашата система. Следващото кратко ръководство обхваща инсталирането на най-популярните... Linux разпределения.

Инсталирайте Ansible на Centos/RedHat системи

Стъпка 1) Инсталирайте EPEL хранилището.

[root@ansible-server ~]# sudo yum install epel-release

Стъпка 2) Инсталирайте пакета ansible.

[root@ansible-server ~]# sudo  yum install -y ansible

Инсталирайте Ansible на Centos/RedHat системи

Инсталирайте ansible на Ubuntu/Debian системи

Стъпка 1) Извършете актуализация на пакетите.

$ sudo apt update

Стъпка 2) Инсталирайте пакета software-properties-common.

$ sudo apt install software-properties-common

Стъпка 3) Инсталирайте архива с лични пакети Ansible.

$ sudo apt-add-repository ppa:ansible/ansible

Стъпка 4) Инсталирайте ansible.

$ sudo apt update
$ sudo apt install ansible

Ansible ad-hoc команди

Един от най-лесните начини за използване на Ansible е чрез ad-hoc команди. Те са полезни, когато искате да подадете команда на един сървър или на група сървъри. Ad-hoc командите не се съхраняват за бъдеща употреба, но са бърз начин за взаимодействие със сървърите, които сте избрали.

За този урок за Ansible е конфигуриран прост файл с два сървъра, съдържащ host1 и host2.

Можете да потвърдите, че хостовете са достъпни от Ansible сървъра, като издадете команда ping команда на всички хостове.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping
host1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Ansible ad-hoc команди

Обяснение:

  1. Статус на командата, в този случай УСПЕХ
  2. Хост, на който е изпълнена командата
  3. Командата, издадена чрез параметъра -m, в този случай, ping
  4. С параметъра -i можете да посочите файла hosts.

Можете също да издадете същата команда на един хост, когато е необходимо.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Ansible ad-hoc команди

Обяснение:

  1. Параметърът Limit може да се използва за издаване на команди само на определени хостове във файла на хоста
  2. Име на хоста, както е дефинирано във файла с инвентара

Ако трябва бързо да копирате файл до множество дестинации, използвайте модула за копиране, който разчита на SCP. Командата и нейният резултат изглеждат по следния начин:

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
host1 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.43-256741011164877/source",
    "state": "file",
    "uid": 0
}
host2 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.6-280302911361278/source",
    "state": "file",
    "uid": 0
}

Ansible ad-hoc команди

Обяснение:

  1. Дефиниран модул за копиране
  2. Аргументите на модула в този случай са абсолютен път на източника и абсолютен път на местоназначение.
  3. Анзибилен команден изход, отразяващ успеха на командата за копиране и други подробности като sha1 или md5 контролни суми за проверка на целостта на файла и метаданни като собственик, размер или разрешения. Лесно е да имате пакет инсталиран на куп сървъри. Ansible има няколко модула, които взаимодействат с използвани инсталатори, като yum, apt, dnf и др.

В следващия пример ще инсталирате пакет с модула yum на два хоста на CentOS.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [


"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.xservers.ro\n * epel: fedora.mirrors.telekom.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: remi.schlundtech.de\n * remi-safe: remi.schlundtech.de\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version                Repository       Size\n========================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n========================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.leadhosts.com\n * epel: mirrors.nav.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: mirrors.uni-ruse.bg\n * remi-safe: mirrors.uni-ruse.bg\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version                Repository       Size\n========================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n========================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Ansible ad-hoc команди

Обяснение:

  1. В този пример се използва модул Yum
  2. Той дефинира аргументите на модула и в този случай ще изберете името на пакета и неговото състояние. Ако състоянието отсъства, например, пакетът ще бъде претърсен и ако бъде открит, премахнат
  3. Когато е оцветен в жълто, ще видите резултата от командата ansible с променено състояние, което в този случай означава, че пакетът е намерен и инсталиран.
  4. Състояние на командата за инсталиране на yum, издадена чрез ansible. В този случай беше инсталиран пакетът ncdu.x86_64 0:1.14-1.el7.

Разбира се, всички опции на инсталатора на yum могат да се използват чрез Ansible, включително актуализиране, инсталиране, най-нова версия и премахване.

В примера по-долу същата команда се издава за премахване на предварително инсталирания пакет ncdu.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version               Repository        Size\n========================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n========================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version               Repository        Size\n========================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n========================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Ansible ad-hoc команди

Обяснение:

  1. Резултатът от командата yum показва, че пакетът е премахнат.

Друга важна функция на Ansible е способността му да събира факти за системата. Той събира информация за хардуер, софтуер и версия и съхранява всяка стойност в променлива, която можете да използвате повторно по-късно.

Когато имате нужда от подробна информация за системите, които Ansible ще модифицира, модулът за настройка събира тези факти от системните променливи.

Ansible ad-hoc команди

Ansible Playbooks

Ansible Playbooks са начин за изпращане на команди до отдалечени системи чрез скриптове. Playbook-овете конфигурират сложни системни среди и увеличават гъвкавостта, като изпълняват един скрипт на една или повече системи. Те се държат по-скоро като език за конфигуриране, отколкото като език за програмиране.

Командите в плейбука използват YAML формат, така че е необходим малък синтаксис, но трябва да се спазва отстъпът. Както подсказва името, плейбукът е колекция от изпълнения. Чрез плейбука можете да присвоите специфични роли на някои хостове и различни роли на други, като по този начин организирате много сървъри в един файл.

Преди да продължим с примерите за плейбуци, е полезно да дефинираме задача. Задачите са интерфейсът към модулите на Ansible за роли и плейбуци.

Сега, помислете за Ansible playbook с една игра, която съдържа множество задачи, както е показано по-долу:

---

- hosts: group1
  tasks:
  - name: Install lldpad package
    yum:
      name: lldpad
      state: latest
  - name: check lldpad service status
    service:
      name: lldpad
      state: started

Ansible Playbooks

В горния пример, хостовете от група group1 във файла hosts са насочени за инсталиране на пакета lldpad, използвайки модула yum. Създадената след инсталирането услуга lldpad се стартира с помощта на сервизния модул, който взаимодейства предимно с ансамбъла systemd.

Обяснение:

  1. Група от хостове, на които ще се изпълнява книгата
  2. Модулът Yum се използва в тази задача за инсталиране на lldpad
  3. Сервизният модул се използва за проверка дали услугата работи и работи след инсталирането

Всеки Ansible playbook работи с файл с инвентаризация. Файлът с инвентаризация съдържа списък със сървъри, разделени на групи, което дава по-добър контрол върху детайли като IP адрес и SSH порт за всеки хост.

Файлът с инвентара за този примерен наръчник изглежда по следния начин. Има две групи, group1 и group2, всяка от които съдържа съответно host1 и host2.

[group1]
host1 ansible_host=192.168.100.2 ansible_ssh_port=22
[group2]
host2 ansible_host=192.168.100.3 ansible_ssh_port=22

Ansible Playbooks

Обяснение:

  1. Име на групата
  2. Име на хост, с IP адрес и ssh порт, в този случай, по подразбиране, 22.

Следващият пример за Ansible playbook съдържа две възпроизвеждания за две групи хостове. За първата група, group1, SELinux е активиран и когато е активиран, на екрана на хоста се появява съобщение.

За втората група, пакетът httpd се инсталира само ако ansible_os_family е RedHat и ansible_system_vendor е HP.

ansible_os_family и ansible_system_vendor са променливи, събрани с опцията gather_facts, и могат да се използват както в този условен пример.

---

- hosts: group1
  tasks:
  - name: Enable SELinux
    selinux:
      state: enabled
    when: ansible_os_family == 'Debian'
    register: enable_selinux

  - debug:
      Imsg: "Selinux Enabled. Please restart the server to apply changes."
    when: enable_selinux.changed == true

- hosts: group2
  tasks:
  - name: Install apache
    yum:
      name: httpd
      state: present
    when: ansible_system_vendor == 'HP' and ansible_os_family == 'RedHat'

Ansible Playbooks

Обяснение:

  1. Пример за клаузата when, В този случай, когато типът на OS е Debian. Променливата ansible_os_family се събира чрез функционалността gather_facts.
  2. Резултатът от задачата е регистриран за бъдеща употреба с името му enable_selinux
  3. Друг пример за клаузата when. В този случай ще се покаже съобщение за потребителя на хоста, ако SELinux наистина е бил активиран преди.
  4. Друг пример за клаузата when, състояща се от две правила

Освен задачи, има и специални задачи, наречени обработчици. Обработчикът трябва да има уникално име в целия плейбук. Обработчиците работят като обикновена задача, но могат да бъдат уведомявани чрез нотификатор.

Ако даден обработчик не бъде уведомен по време на изпълнение на плейбук, той не се изпълнява. Ако обаче повече от една задача уведоми обработчик, той се изпълнява само веднъж, след като всички задачи са завършени.

В примера по-долу, конкретна задача има секция за уведомяване, която извиква друга задача. Ако резултатът от първата задача се промени, се извиква задача за обработка. Често срещан пример е промяна на конфигурационен файл и след това рестартиране на засегнатата услуга.

---

- hosts: group2
  tasks:
  - name: sshd config file modify port
    lineinfile:
     path: /etc/ssh/sshd_config
     regexp: 'Port 28675'
     line: '#Port 22'
    notify:
       - restart sshd
handlers
    - name: restart sshd
      service: sshd
        name: sshd
        state: restarted

В този случай, ако първата задача „sshd config file modify port“ се промени, което означава, че портът вече не е 28675, портът се променя и задачата уведомява обработчика със същото име, което рестартира sshd услугата.

Ansible Playbooks

Обяснение:

  1. Пример за нотификатор
  2. Пример за манипулатор

Анзибилни роли

Когато работите с големи плейбукове, е по-лесно задачите да се разделят на роли. Ролите също така улесняват повторното използване на работа по-късно. Ролята е съвкупност от задачи, които могат да бъдат преместени от един плейбук в друг и да се изпълняват независимо, макар и само чрез файл на плейбук.

Ролите се съхраняват в отделни директории и следват специфична структура на директории.

[root@ansible-server test2]# tree
.
`-- role1
    |-- defaults
    |   `-- main.yml
    |-- handlers
    |   `-- main.yml
    |-- meta
    |   `-- main.yml
    |-- README.md
    |-- tasks
    |   `-- main.yml
    |-- tests
    |   |-- inventory
    |   `-- test.yml
    `-- vars
        `-- main.yml

7 directories, 8 files

YAML файлът в директорията defaults съдържа променливите по подразбиране, използвани с плейбука. Директорията handlers съхранява манипулатори, а директорията meta съдържа информация за зависимостите на автора и ролята. Директорията tasks съдържа основния YAML файл за ролята.

Директорията tests съдържа примерен YAML плейбук и примерен файл с инвентаризация и се използва най-вече за тестване преди създаването на действителната роля.

Директорията vars съдържа YAML файла, където са дефинирани всички променливи, използвани от ролята. Директориите templates и files съдържат шаблоните и файловете, използвани от задачите в ролята.

За да създадете дървото на директориите за роля, използвайте следната команда с името на ролята като последен параметър:

[root@ansible-server test2]# ansible-galaxy init role1

Ansible също работи добре с шаблони и използва Jinja2 като език за шаблони.

Следващият пример показва как изглежда основен шаблон на Jinja2 и как да го използвате в роля.

По време на изпълнение, в зависимост например от това в кой център за данни се намира вашият сървър, можете да избирате от няколко нейм сървъра, всеки от които съответства на център за данни, използвайки променливата resolver_ip_addresses.

{% for resolver in resolver_ip_addresses %}
nameserver {{ resolver }}
{% endfor %}

options timeout:1
options attempts:5
options rotate

В този пример, директорията на playbook дефинира няколко променливи, включително resolver_ip_addresses, с различни стойности в зависимост от центъра за данни.

- name: Set resolver for server
  template:
    src: dns.j2
    dest: /etc/resolv.conf
    group: root
    owner: root
    mode: "0644"
    tag: resolver

Анзибилни роли

Обяснение:

  1. Име на шаблона, който ще се използва. Шаблонът се намира в директорията шаблони в пътя на ролята
  2. Целевият път на името на файла, който ще бъде заменен с шаблона, от страна на клиента.
  3. Разрешения на целевия файл

Ролевите задачи могат да имат и поле за етикет с присвоено име. Повече от една задача могат да споделят един и същ етикет и когато изпълнявате плейбук, можете да укажете етикет, така че да се изпълняват само маркираните задачи.

Ansible Казус

В този раздел анализираме казус на основен Ansible playbook, който има три роли. Целта е да се даде практически пример за разгледаните досега концепции. Някои по-ранни примери от този урок са адаптирани и използвани повторно в този playbook.

По-долу е показана структурата на директориите на плейбука. Използваният YAML файл е p4.yml.

[root@ansible-server test_ansible]# ls -lrth
total 16K
-rw-r--r--. 1 root root   0 Jul  3 10:13 testfile
-rw-r--r--. 1 root root 203 Jul  3 13:30 p1.yml
-rw-r--r--. 1 root root 125 Jul  3 15:00 hosts
-rw-r--r--. 1 root root 488 Jul  3 16:40 p2.yml
-rw-r--r--. 1 root root 188 Jul  4 17:33 p4.yml
drwxr-xr-x. 5 root root  47 Jul  4 17:35 roles
[root@ansible-server test_ansible]# cd roles
[root@ansible-server roles]# ls -lrth
total 12K
drwxr-xr-x. 9 root root 4.0K Jul  4 12:52 httpd
drwxr-xr-x. 9 root root 4.0K Jul  4 13:55 selinux
drwxr-xr-x. 9 root root 4.0K Jul  4 16:54 resolver

Плейбукът има три роли. Ролята resolver задава специфичен нейм сървър на сървърите, като копира файл в дестинацията /etc/resolv.conf. Ролята httpd инсталира httpd пакета с yum модула, а третата роля активира SELinux и уведомява влезлия потребител да рестартира системата. Всяка роля е създадена с командата ansible-galaxy.

Роля на преобразувател, main.yml задача:

Ansible Казус

Httpd роля, main.yml задача:

Ansible Казус

Роля на Selinux, main.yml задача:

Ansible Казус

По-долу е даден сценарият за изпълнение p4.yml. Той се изпълнява на всички хостове, освен ако не е посочено друго в командния ред, изпълнява се от името на root потребителя на порт 22 (SSH), събира информация преди изпълнение на ролите и изпълнява и трите роли. Всяка роля може да се изпълнява независимо, като се укаже нейният таг в командния ред на ansible-playbook с параметъра -t.

---

- hosts: all
  user: root
  port: 22
  gather_facts: True
  roles:
    - { role: selinux, tags: selinux }
    - { role: httpd, tags: httpd }
    - { role: resolver, tags: resolver }

След това можете да стартирате p4.yml плейбука на двата хоста и да интерпретирате резултата. Същата команда може да се изпълни с параметъра –check за пробно изпълнение и с параметъра -k, когато искате да използвате удостоверяване с парола.

Ansible Казус

Обяснение:

  1. Команда Ansible-playbook, която изпълнява p4.yml
  2. Playbook пропуска ролята на SELinux, защото вече е активирана.
  3. Ansible установи, че пакетът httpd вече е инсталиран, така че се връща добре.
  4. Резолверът беше зададен и статусът на резолвера на ролите беше променен.

Ansible Commands Cheat Sheet

Инсталирайте EPEL repo на Centos/RHEL системи

[root@ansible-server ~]# sudo yum install epel-release

Инсталирайте ansible пакет на Centos/RHEL системи

[root@ansible-server ~]# sudo  yum install -y ansible

Извършете актуализация на пакетите на Debian/Ubuntu системи

$ sudo apt update

Инсталирайте пакета software-properties-common на Debian/Ubuntu системи

$ sudo apt install software-properties-common

Инсталирайте ansible личен архив на пакети на Debian/Ubuntu системи

$ sudo apt-add-repository ppa:ansible/ansible

Инсталирайте ansible на Debian/Ubuntu системи

$ sudo apt update
$ sudo apt install ansible

Брой a ping команда на всички сървъри, дефинирани във файла с инвентаризация, наречен hosts

[root@ansible-server test_ansible]# ansible -i hosts all -m ping

Брой a ping команда само на host2

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2

Копирайте файла „testfile“ на всички хостове във файла с инвентара

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"

Инсталирайте пакета ncdu на всички хостове

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'

Премахнете пакета ncdu на всички хостове

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'

Изградете структурата на директория за роля с име role1.

[root@ansible-server test2]# ansible-galaxy init role1

Игра на p4.yml на сухо

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml --check

Стартирайте p4.yml playbook с удостоверяване с парола за всички хостове

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml -k

Въпроси и Отговори

Да. Ansible е безагентен, така че никакъв софтуер не работи на управляваните възли. Свързва се през SSH или WinRM за... Windowsи изпраща малки модули, които се изпълняват на целта и след това се премахват. Само контролният възел се нуждае от Ansible и Python инсталирана.

Ansible плейбуковете са написани на YAML, който е четим от човек и зависи от отстъпи, а не от скоби. Шаблоните използват шаблонния език Jinja2, докато фактите и променливите позволяват на един плейбук да се адаптира към много хостове. Не се изискват познания по общо програмиране, за да започнете.

Ansible е безагентен и push-базиран, изпращайки промени през SSH, докато Кукла на конци намлява Chef обикновено са базирани на агенти и извличане. Ansible използва YAML, докато Chef използва Ruby, а Puppet използва собствен DSL. Много екипи избират Ansible заради по-ниската му крива на обучение.

Да. Ansible е безплатен и с отворен код под GNU GPL лиценз, поддържан от Red Hat и голяма общност. Основният енджин и хилядите модули не струват нищо. Red Hat продава и Ansible Automation Platform, платен продукт, който добавя графичен потребителски интерфейс, достъп, базиран на роли, и поддръжка.

Да. Освен Linux и Unix хостове, достъпни през SSH, Ansible управлява Windows възли чрез WinRM, използвайки специализирани Windows модули. Може да инсталира пакети, да редактира системния регистър, да управлява услуги и да изпълнява PowerShell, така че смесва Linux и Windows Автопарковете са автоматизирани от един контролен възел.

Ansible Galaxy е публичен център за споделяне и изтегляне на роли и колекции от общността. Командата ansible-galaxy изгражда структурата на директориите на ролите и инсталира публикувани роли, така че можете да използвате повторно тествана автоматизация, вместо да пишете всеки плейбук от нулата.

Асистентите с изкуствен интелект могат да създават YAML плейбукове от заявка на разбираем език, да обясняват непознати модули и да предлагат корекции за неуспешни задачи или синтактични грешки. Те могат също така да конвертират shell скриптове в идемпотентни задачи. Винаги преглеждайте генерираните плейбукове за правилни имена на модули и идемпотентност, преди да ги стартирате.

Да. Копилот на GitHub автоматично довършва задачи от плейбук, записи в инвентара и шаблони на Jinja2 от кратък коментар или име на файл. Третирайте резултата като отправна точка и проверете отстъпите, параметрите на модулите и имената на променливите, защото генерираният YAML може да препраща към остарял синтаксис или несъществуващи модули.

Обобщете тази публикация с: