Ссылки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#Применить локально 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
1 2 3 4 5 6 7 8 9 10 11 |
test.yaml --- - name: My TEST Playbook hosts: all become: yes tasks: - name: Ping test ping: ... |
Пример обновления пакетов :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
--- - 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# 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
1 2 |
#--# zxc administrators %zxc ALL=(ALL) NOPASSWD: ALL |
Пример установки apache2, использование handlers и notify
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# говорит что сделать # где сделать --- - 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, списки и циклы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# Существует несколько видов записи # Пример первый: #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
1 2 3 4 5 6 7 8 9 10 |
Пример в таске: - 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# 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
1 2 3 4 5 |
!!! Отличие import от include заключается в следующем !!! Include читает из файлов значения, ansible подставляет значения при выполнении (дошел до строчки с include тогда и подставил) !!! Import читает и подставляет значения, ansible подставляет сразу все значения !!! рекомендуют использовать include !!! Также можно сократить запись |