Thank you for reading this post, don't forget to subscribe!
Создаем файлы для роли, которую назовем Prometheus:
ansible-galaxy init prometheus
mv prometheus/ /etc/ansible/roles/
cd /etc/ansible/roles/
Открываем на редактирование файл с заданиями:
vi prometheus/tasks/main.yml
Логически, мы поделим задачи на 3 файла:
1 2 3 4 5 6 7 8 9 10 |
--- #- name: Prepare For Install Prometheus # include_tasks: tasks/prepare.yml - name: Install Prometheus include_tasks: tasks/install_prometheus.yml - name: Install Alertmanager include_tasks: tasks/install_alertmanager.yml |
* в первом файле будут описаны задачи для подготовки системы к установке Prometheus; во втором файле мы выполним установку системы мониторинга; в третьем файле описание для установки alertmanager.
Если мы используем firewalld то оставляем как есть, я же использую iptables и настраиваю всё сам, поэтому этот таск мне не нужен и я его комментирую в prometheus/tasks/main.yml
Создаем первый файл с задачами:
vim prometheus/tasks/prepare.yml
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 |
--- - name: install python-firewall yum: name: "{{item}}" state: present with_items: - python-firewall when: ansible_os_family == "RedHat" - name: Security Settings For RedHat block: - name: Allow Ports firewalld: port: "{{ item }}" permanent: true state: enabled loop: [ '9090/tcp', '9093/tcp', '9094/tcp', '9100/tcp', '9094/udp' ] notify: - firewalld systemd restart - name: Disable SELinux selinux: state: disabled - name: Stop SELinux shell: setenforce 0 when: ansible_os_family == "RedHat" - name: Security Settings For Debian block: - name: Allow TCP Ports iptables: chain: INPUT rule_num: '1' action: insert protocol: tcp jump: ACCEPT destination_port: "{{ item }}" loop: [ '9090', '9093', '9094', '9100' ] - name: Allow UDP Ports iptables: chain: INPUT rule_num: '1' action: insert protocol: udp jump: ACCEPT destination_port: '9094' when: ansible_os_family == "Debian" |
* в данном примере будут открыты в брандмауэре порты для корректной работы prometheus и alertmanager, а также будет отключен SELinux. Мы используем условие when, чтобы применить нужные команды, разделенные блоками (block), к нужному типу дистрибутива Linux, однако, если в вашей среде не используется брандмауэр или на CentOS применяется iptables, необходимо внести коррекции.
Открываем файл с переменными:
vim prometheus/vars/main.yml
Создаем две:
1 2 3 4 |
--- prometheus_version : 2.23.0 alertmanager_version : 0.21.0 |
* данным переменным в качестве значения присваиваем версии prometheus и alertmanager, которые необходимо установить. В нашем примере взяты последние версии на момент обновления инструкции. Актуальные версии можно посмотреть на странице загрузки.
Создаем файл с описанием задач по установке Prometheus:
vim prometheus/tasks/install_prometheus.yml
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 |
--- - name: Create User prometheus user: name: prometheus create_home: no shell: /bin/false - name: Create directories for prometheus file: path: "{{ item }}" state: directory owner: prometheus group: prometheus loop: - '/tmp/prometheus' - '/etc/prometheus' - '/var/lib/prometheus' - name: Download And Unzipped Prometheus unarchive: src: https://github.com/prometheus/prometheus/releases/download/v{{ prometheus_version }}/prometheus-{{ prometheus_version }}.linux-amd64.tar.gz dest: /tmp/prometheus creates: /tmp/prometheus/prometheus-{{ prometheus_version }}.linux-amd64 remote_src: yes - name: Copy Bin Files From Unzipped to Prometheus copy: src: /tmp/prometheus/prometheus-{{ prometheus_version }}.linux-amd64/{{ item }} dest: /usr/local/bin/ remote_src: yes mode: preserve owner: prometheus group: prometheus loop: [ 'prometheus', 'promtool' ] - name: Copy Conf Files From Unzipped to Prometheus copy: src: /tmp/prometheus/prometheus-{{ prometheus_version }}.linux-amd64/{{ item }} dest: /etc/prometheus/ remote_src: yes mode: preserve owner: prometheus group: prometheus loop: [ 'console_libraries', 'consoles', 'prometheus.yml' ] - name: Create File for Prometheus Systemd template: src=templates/prometheus.service dest=/etc/systemd/system/ notify: - systemd reload - name: Systemctl Prometheus Start systemd: name: prometheus state: started enabled: yes |
* в данном примере мы:
- Создаем пользователя prometheus.
- Создаем каталоги, в которые будут помещены файлы сервиса.
- Скачиваем и распаковываем архив прометея с официального сайта.
- Копируем бинарники.
- Копируем конфигурационные файлы.
- Создаем юнит в systemd.
- Стартуем сервис.
Создаем yml-файл с задачами по установке и запуску alertmanager:
vim prometheus/tasks/install_alertmanager.yml
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 |
--- - name: Create User Alertmanager user: name: alertmanager create_home: no shell: /bin/false - name: Create Directories For Alertmanager file: path: "{{ item }}" state: directory owner: alertmanager group: alertmanager loop: - '/tmp/alertmanager' - '/etc/alertmanager' - '/var/lib/prometheus/alertmanager' - name: Download And Unzipped Alertmanager unarchive: src: https://github.com/prometheus/alertmanager/releases/download/v{{ alertmanager_version }}/alertmanager-{{ alertmanager_version }}.linux-amd64.tar.gz dest: /tmp/alertmanager creates: /tmp/alertmanager/alertmanager-{{ alertmanager_version }}.linux-amd64 remote_src: yes - name: Copy Bin Files From Unzipped to Alertmanager copy: src: /tmp/alertmanager/alertmanager-{{ alertmanager_version }}.linux-amd64/{{ item }} dest: /usr/local/bin/ remote_src: yes mode: preserve owner: alertmanager group: alertmanager loop: [ 'alertmanager', 'amtool' ] - name: Copy Conf File From Unzipped to Alertmanager copy: src: /tmp/alertmanager/alertmanager-{{ alertmanager_version }}.linux-amd64/alertmanager.yml dest: /etc/alertmanager/ remote_src: yes mode: preserve owner: alertmanager group: alertmanager - name: Create File for Alertmanager Systemd template: src=templates/alertmanager.service dest=/etc/systemd/system/ notify: - systemd reload - name: Systemctl Alertmanager Start systemd: name: alertmanager state: started enabled: yes |
* в данном примере мы:
- Создаем пользователя alertmanager.
- Создаем каталоги, в которые будут помещены файлы сервиса.
- Скачиваем и распаковываем архив alertmanager с официального сайта.
- Копируем бинарники.
- Копируем конфигурационные файлы.
- Создаем юнит в systemd.
- Стартуем сервис.
Создаем файл в шаблонах с юнитом systemd для prometheus:
vim prometheus/templates/prometheus.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[Unit] Description=Prometheus Service After=network.target [Service] User=prometheus Group=prometheus Type=simple ExecStart=/usr/local/bin/prometheus \ --config.file /etc/prometheus/prometheus.yml \ --storage.tsdb.path /var/lib/prometheus/ \ --web.console.templates=/etc/prometheus/consoles \ --web.console.libraries=/etc/prometheus/console_libraries ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure [Install] WantedBy=multi-user.target |
Создаем файл в шаблонах с юнитом systemd для alertmanager:
vim prometheus/templates/alertmanager.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[Unit] Description=Alertmanager Service After=network.target [Service] EnvironmentFile=-/etc/default/alertmanager User=alertmanager Group=alertmanager Type=simple ExecStart=/usr/local/bin/alertmanager \ --config.file=/etc/alertmanager/alertmanager.yml \ --storage.path=/var/lib/prometheus/alertmanager \ $ALERTMANAGER_OPTS ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure [Install] WantedBy=multi-user.target |
Открываем на редактирование файл с обработчиками:
vim prometheus/handlers/main.yml
Приводим его к виду:
1 2 3 4 5 6 7 8 9 10 |
--- - name: firewalld systemd restart systemd: name: firewalld state: reloaded - name: systemd reload systemd: daemon_reload: yes |
* в данном примере мы будем перезапускать firewalld и перечитывать юниты в systemd.
Создаем плейбук:
vim /etc/ansible/playbooks/roles_play/prometheus.yml
1 2 3 4 5 6 7 8 9 10 |
--- - hosts: 192.168.1.170 user: ansible become: true become_method: sudo become_user: root roles: - role: prometheus tags: prom |
* данный файл описывает плейбук для запуска роли Prometheus. Обратите внимание, что для примера мы добавили тег prom.
Запускаем наш плейбук для установки Prometheus + Alertmanager:
ansible-playbook --tags prom start_role.yml -kK
* в данном примере запуск вложенной роли запускается с тегом prom. Это ни на что не влияет, но, если бы у нас в плейбуке будет много ролей, с помощью тега мы можем запускать конкретную в debian делаем так.
-k : ask pass -K : ask pass for become.
т.е. первый k для того чтобы указать пароль подключения а второе K для того чтобы указать пароль пользователя от чьего имени будет работать sudo.
у меня человеческий centos потому можем либо от рута либо от пользователя ansible (c ssh ключом)
[root@ansible prometheus]# ansible-playbook --tags prom -u ansible /etc/ansible/playbooks/roles_play/prometheus.yml
ну и удаляем лишнее:
[root@ansible prometheus]# pwd
/etc/ansible/roles/prometheus
[root@ansible prometheus]# rm -rf defaults files meta README.md tests
после установки проверяем:
http://192.168.1.170:9090/
http://192.168.1.170:9093/
если влом копипастить можно скачать с моего гита:
https://github.com/midnight47/ansible-playbook.git