Рубрики
ansible

ansible примеры конфигов

Ссылки

https://docs.ansible.com/ - документация
https://docs.ansible.com/ansible/latest/reference_appendices/config.html - параметры конфига
https://jinja.palletsprojects.com/en/3.0.x/ - язык jinga, используется в шаблонах ansible
https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html - пример с тегами

https://galaxy.ansible.com/ - роли
https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html - роли

https://ansible-for-network-engineers.readthedocs.io/ru/latest/ - для сетевых инженеров
https://github.com/natenka/Ansible-for-network-engineers - для сетевых инженеров

https://molecule.readthedocs.io/en/latest/ - молекула, автоматизация проверок playbook
https://habr.com/ru/post/437216/ - молекула, автоматизация проверок playbook


https://github.com/ansible/awx - автоматизация ansible, планировщик
https://github.com/ansible/awx/blob/devel/INSTALL.md - автоматизация ansible, планировщик

ansible.cfg

[defaults]
host_key_checking = False ### не проверять ключи
pipelining = True
deprecation_warnings = False
retry_files_enabled = False # не будут создаваться файлы при не удачном подключение
inventory      = ./hosts.txt ### файл с описанием хостов 
roles_path = ./roles ### каталог ролей
forks          = 10 ### количество одновременных выполнений
timeout = 10 
log_path = ./ansible.log ### файл с логами
interpreter_python = python3
#ansible_user = vagrant # пользователь по умолчанию
#auto_silent=auto
#transport = ssh
#allow_world_readable_tmpfiles = true # Решает баг с py mysql 

[diff]
always = True # 
context = 3

hosts.txt

#Применить локально
localhost ansible_connection=local

[all_servers:vars] #переменные для группы all_servers
ansible_user = root
ansible_connection=ssh

[all_servers] #группа all_servers
192.168.1.31


[CentOS7:vars] #переменные для группы CentOS7
ansible_python_interpreter=/usr/bin/python2
ansible_user = root
ansible_connection=ssh
#ansible_user=vagrant
#ansible_ssh_pass=vagrant

[CentOS7] №группа  CentOS7
192.168.1.244
superserver 

[prod_servers:vars]  #переменные для группы prod_servers
ansible_user=USERNAME1
ansible_ssh_private_key_file=/home/USERNAME1/.ssh/nameSSHKey1.pem 

[prod_servers] #групп prod_servers
linux1 ansible_host=192.168.1.14
linux2 ansible_host=192.168.1.15
 

#Пример с группировкой хостов
[staging_DB]
192.168.0.10
192.168.0.11
 
[staging_WEB]
192.168.0.20
192.168.0.21
 
[staging_APP]
192.168.0.30
192.168.0.31
 
#Все хосты выше (staging_DB, staging_WEB, staging_APP) сгруппировали в одну группу staging_ALL
[staging_ALL:children]
staging_DB
staging_WEB
staging_APP

#Хосты из группы (staging_APP, prod_APP) сгруппировали в группу  APP_ALL
[APP_ALL:children]
staging_APP
prod_APP
 
[APP_ALL:vars] #для группы APP_ALL задали переменную
message=Hello
 
[staging_servers] # Также переменные можно задавать для хоста
linuXXX ansible_host=192.168.1.16 ansible_user=USERNAME7  ansible_ssh_private_key_file=/home/USERNAME7/.ssh/id_rsa

test.yaml

 test.yaml
---
- name: My TEST Playbook
  hosts: all
  become: yes

  tasks:
  - name: Ping test
    ping:

...

Пример обновления пакетов :

---
- hosts: all
  become: yes
  tasks:
  - name: Cheack and Print Linux Version
    debug: var=ansible_os_family

  - name: Debian update apt-get repo and cache
    apt: update_cache=yes force_apt_get=yes cache_valid_time=3600
    when: ansible_os_family == "Debian"

  - name: Debian upgrade all apt packages
    apt: upgrade=dist force_apt_get=yes
    when: ansible_os_family == "Debian"

  - name: CentOS upgrade all packages
    yum:
      name: '*'
      state: latest
    when: ansible_os_family == "RedHat"

...

Пример создание пользователя, создания файлов и условия(when), debug

# when - выполнить если

---
- hosts: all
  become: yes
  gather_facts: false
  vars:
       source_file_group_sudo: ./FILE_SUDO
       destin_file_group_sudo: /etc/sudoers.d/FILE_SUDO
       user_name: USERNAME
       user_key_pub: USERKEY.pub  
       user_password: USER_HESH_PASSWORD
       user_groups_debian: sudo,ADD_GROUP
       user_groups_centos: wheel,ADD_GROUP
       add_group: ADD_NEW_GROUP

  tasks:
  
  - name: Add a group called 
    group:
       name: "{{ add_group }}"
       state: present

  - name: Cheack and Print Linux Version
    debug: var=ansible_os_family

  - name: Copy file zxc to Servers
    copy: src={{ source_file_group_sudo }} dest={{ destin_file_group_sudo }} mode=0555

  - name: Add user to remote hosts
    user: name={{ user_name }} groups={{ user_groups_debian }} shell=/bin/bash password={{ user_password }}
    when: ansible_os_family == "Debian"
 
  - name: Add user to remote hosts
    user: name={{ user_name }} groups={{ user_groups_centos }} shell=/bin/bash password={{ user_password }}
    when: ansible_os_family == "RedHat"
 
  - name: Add SSH keys to remote hosts
    authorized_key: user={{ user_name }} key="{{ lookup('file', "{{ user_key_pub }}") }}"

...

Пример файла FILE_SUDO

#--# zxc administrators
%zxc ALL=(ALL) NOPASSWD: ALL

Пример установки apache2, использование handlers и notify

# говорит что сделать
# где сделать

---
- name: Install Apache and Upload my Web Page
  hosts: all
  become: yes
 
  vars:
     source_file: ./website/index.html
     destin_file: /var/www/html
 
  tasks:
  - name: Install Apache Web Server
    yum: name=apache2 state=present
 
  - name: Copy index html to Servers
    copy: src={{ source_file }} dest={{ destin_file }} mode=0555
    notify: Restart Apache
 
  - name: Start Apache and Enable it on every boot
    service: name=apache2 state=started enabled=yes
 
  handlers:
  - name: Restart Apache
    service: name=apache2 state=restarted
...

Loop, списки и циклы

# Существует несколько видов записи

# Пример первый:
#tasks/main.yaml
- name: install packages
  yum:
   name: {{ item }}
   state: present
  loop:
   - htop
   - bind-utils
   - mtr

# Пример второй
#vars/main.yaml
packages:
  - htop
  - bind-utils
  - mtr
# tasks/main.yml
name: install packages
yum:
 name: {{ item }}
 state: present
 loop: {{ packages }}


# Пример третий
# tasks file for install_pkg
- name: Install a list of packages
  apt:
    pkg:
     - libreoffice
     - git
     - wget
     - curl



# Пример с пакетам  для вуишфт
  - name: Install a list of packages
    apt:
      pkg:
        - qemu-kvm 
        - libvirt-daemon-system
        - ovmf
        - virtinst
        - openvswitch-switch 
        - tcpdump
        - git 
        - dnsutils
        - mtr
        - iotop
        - virt-top
        - logwatch
        - postfix
        - python3-minimal  
        - python3-pip 
        - python3-setuptools   
        - python3-libvirt
        - python3-lxml
        - smartmontools  
      state: latest
      update_cache: True
    when: ansible_os_family == "Debian"    

TAG

Пример в таске:
- name: Install ntp
  ansible.builtin.yum:
    name: ntp
    state: present
  tags: ntp

Пример использования:
ansible-playbook --tags ntp name_playbook.yaml -  будут выполнены из плейбука  таски с тагом (ntp) 
ansible-playbook --skip-tags ntp name_playbook.yaml -  таски с тагом (ntp) будут проигнорированы , все остальные задачи будут выполнены 

Роли \ roles

# Roles - это структурированные palybook, с возможностью версионности.
# В ansible.cfg должна быть запись (roles_path = ./roles) - каталог ролей
# cd roles
# ansible-galaxy init adduser_groups - создали роль 

# структура роли  
.
├── defaults       # дефолтные переменные var
│   └── main.yml   # Сюда сыпем наши переменные
├── handlers       # обработчики (для notify)
│   └── main.yml 
├── meta           # мета данные
│   └── main.yml 
├── README.md      # описание ( например как создать paybook запуска)
├── tasks          # задачи \ таски
│   └── main.yml   # - include role.yaml
├── template       # шаблоны (файлы j2, jinja)
│   └── main.yml
├── files          # сюда складываем все статические файлы
│  
├── tests          # данные для тестов (используется очень редко)
│   ├── inventory
│   └── test.yml
└── vars           # переменные с более высоким приоритетом
    └── main.yml



Пример playbook для запуска роли: 
---
- hosts: all
  become: yes
  gather_facts: false

  roles:
      - adduser_groups
...

Include и Import

!!! Отличие import от include заключается в следующем
!!! Include читает из файлов значения, ansible подставляет значения при выполнении (дошел до строчки с include тогда и подставил)
!!! Import  читает и подставляет значения, ansible подставляет сразу все значения
!!! рекомендуют использовать include
!!! Также можно сократить запись