Обновить roles/docker/tasks/main.yml

This commit is contained in:
zailon 2026-05-27 11:51:44 +05:00
parent 395bfd643e
commit 6352ecfa30

View File

@ -1,222 +1,288 @@
--- ---
- name: Install Docker dependencies - name: Install Docker dependencies
apt: apt:
name: name:
- apt-transport-https - apt-transport-https
- ca-certificates - ca-certificates
- curl - curl
- gnupg - gnupg
- lsb-release - lsb-release
state: present state: present
update_cache: yes update_cache: yes
- name: Add Docker GPG key - name: Add Docker GPG key
apt_key: apt_key:
url: https://download.docker.com/linux/ubuntu/gpg url: https://download.docker.com/linux/ubuntu/gpg
state: present state: present
- name: Add Docker repository - name: Add Docker repository
apt_repository: apt_repository:
repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable" repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
state: present state: present
- name: Install Docker - name: Install Docker
apt: apt:
name: name:
- docker-ce - docker-ce
- docker-ce-cli - docker-ce-cli
- containerd.io - containerd.io
state: present state: present
update_cache: yes update_cache: yes
- name: Install Docker Compose - name: Install Docker Compose
apt: apt:
name: docker-compose-plugin name: docker-compose-plugin
state: present state: present
- name: Start and enable Docker service - name: Start and enable Docker service
systemd: systemd:
name: docker name: docker
state: started state: started
enabled: yes enabled: yes
- name: Wait for Docker to start - name: Wait for Docker to start
pause: pause:
seconds: 5 seconds: 5
- name: Verify Docker installation - name: Verify Docker installation
command: docker --version command: docker --version
register: docker_version register: docker_version
changed_when: false changed_when: false
- name: Show Docker version - name: Show Docker version
debug: debug:
msg: "Docker version: {{ docker_version.stdout }}" msg: "Docker version: {{ docker_version.stdout }}"
- name: Verify Docker Compose installation - name: Verify Docker Compose installation
command: docker compose version command: docker compose version
register: docker_compose_version register: docker_compose_version
changed_when: false changed_when: false
- name: Show Docker Compose version - name: Show Docker Compose version
debug: debug:
msg: "Docker Compose version: {{ docker_compose_version.stdout }}" msg: "Docker Compose version: {{ docker_compose_version.stdout }}"
- name: Setup Docker monitoring - name: Setup Docker monitoring
block: block:
- name: Create scripts directory - name: Create scripts directory
file: file:
path: /opt/scripts path: /opt/scripts
state: directory state: directory
mode: '0755' mode: '0755'
become: yes become: yes
- name: Deploy Docker metrics script - name: Deploy Docker metrics script
copy: copy:
content: | content: |
#!/bin/bash #!/bin/bash
# Docker metrics script for Node Exporter textfile collector # Docker metrics script for Node Exporter textfile collector
OUTFILE="/var/lib/node_exporter/textfile_collector/docker_metrics.prom" OUTFILE="/var/lib/node_exporter/textfile_collector/docker_metrics.prom"
# Get container counts # Get container counts
TOTAL_CONTAINERS=$(docker ps -a -q 2>/dev/null | wc -l) TOTAL_CONTAINERS=$(docker ps -a -q 2>/dev/null | wc -l)
RUNNING_CONTAINERS=$(docker ps -q 2>/dev/null | wc -l) RUNNING_CONTAINERS=$(docker ps -q 2>/dev/null | wc -l)
EXITED_CONTAINERS=$((TOTAL_CONTAINERS - RUNNING_CONTAINERS)) EXITED_CONTAINERS=$((TOTAL_CONTAINERS - RUNNING_CONTAINERS))
# Write metrics in Prometheus format # Write metrics in Prometheus format
cat << EOF > $OUTFILE cat << EOF > $OUTFILE
# HELP docker_containers_total Total number of Docker containers # HELP docker_containers_total Total number of Docker containers
# TYPE docker_containers_total gauge # TYPE docker_containers_total gauge
docker_containers_total $TOTAL_CONTAINERS docker_containers_total $TOTAL_CONTAINERS
# HELP docker_containers_running Number of running Docker containers # HELP docker_containers_running Number of running Docker containers
# TYPE docker_containers_running gauge # TYPE docker_containers_running gauge
docker_containers_running $RUNNING_CONTAINERS docker_containers_running $RUNNING_CONTAINERS
# HELP docker_containers_exited Number of exited Docker containers # HELP docker_containers_exited Number of exited Docker containers
# TYPE docker_containers_exited gauge # TYPE docker_containers_exited gauge
docker_containers_exited $EXITED_CONTAINERS docker_containers_exited $EXITED_CONTAINERS
EOF EOF
dest: /opt/scripts/docker_metrics.sh dest: /opt/scripts/docker_metrics.sh
mode: '0755' mode: '0755'
become: yes become: yes
- name: Create systemd service for Docker metrics - name: Create systemd service for Docker metrics
copy: copy:
content: | content: |
[Unit] [Unit]
Description=Docker metrics script Description=Docker metrics script
After=docker.service After=docker.service
[Service] [Service]
User=root User=root
ExecStart=/opt/scripts/docker_metrics.sh ExecStart=/opt/scripts/docker_metrics.sh
dest: /etc/systemd/system/docker-metrics.service dest: /etc/systemd/system/docker-metrics.service
mode: '0644' mode: '0644'
become: yes become: yes
- name: Create systemd timer for Docker metrics - name: Create systemd timer for Docker metrics
copy: copy:
content: | content: |
[Unit] [Unit]
Description=Run Docker metrics every 30 seconds Description=Run Docker metrics every 30 seconds
[Timer] [Timer]
OnBootSec=1min OnBootSec=1min
OnUnitActiveSec=30s OnUnitActiveSec=30s
[Install] [Install]
WantedBy=timers.target WantedBy=timers.target
dest: /etc/systemd/system/docker-metrics.timer dest: /etc/systemd/system/docker-metrics.timer
mode: '0644' mode: '0644'
become: yes become: yes
- name: Ensure Node Exporter textfile directory exists - name: Ensure Node Exporter textfile directory exists
file: file:
path: /var/lib/node_exporter/textfile_collector path: /var/lib/node_exporter/textfile_collector
state: directory state: directory
owner: node_exporter owner: node_exporter
group: node_exporter group: node_exporter
mode: '0755' mode: '0755'
become: yes become: yes
- name: Enable and start Docker metrics timer - name: Enable and start Docker metrics timer
systemd: systemd:
name: docker-metrics.timer name: docker-metrics.timer
enabled: yes enabled: yes
state: started state: started
daemon_reload: yes daemon_reload: yes
become: yes become: yes
- name: Test Docker metrics script - name: Test Docker metrics script
command: /opt/scripts/docker_metrics.sh command: /opt/scripts/docker_metrics.sh
register: metrics_test register: metrics_test
changed_when: false changed_when: false
- name: Show Docker metrics test result - name: Show Docker metrics test result
debug: debug:
var: metrics_test.stdout var: metrics_test.stdout
# ========== Fix Docker runc version ========== # ========== Fix Docker runc version ==========
- name: Check current runc version - name: Check current runc version
command: runc --version command: runc --version
register: runc_version_check register: runc_version_check
ignore_errors: yes ignore_errors: yes
changed_when: false changed_when: false
become: yes become: yes
- name: Download and update runc to v1.2.4 if needed - name: Download and update runc to v1.2.4 if needed
block: block:
- name: Download runc v1.2.4 - name: Download runc v1.2.4
get_url: get_url:
url: https://github.com/opencontainers/runc/releases/download/v1.2.4/runc.amd64 url: https://github.com/opencontainers/runc/releases/download/v1.2.4/runc.amd64
dest: /tmp/runc.amd64 dest: /tmp/runc.amd64
mode: '0755' mode: '0755'
become: yes become: yes
- name: Stop docker service - name: Stop docker service
systemd: systemd:
name: docker name: docker
state: stopped state: stopped
become: yes become: yes
- name: Backup existing runc - name: Backup existing runc
command: mv /usr/bin/runc /usr/bin/runc.bak command: mv /usr/bin/runc /usr/bin/runc.bak
args: args:
creates: /usr/bin/runc.bak creates: /usr/bin/runc.bak
become: yes become: yes
- name: Install new runc - name: Install new runc
copy: copy:
src: /tmp/runc.amd64 src: /tmp/runc.amd64
dest: /usr/bin/runc dest: /usr/bin/runc
remote_src: yes remote_src: yes
mode: '0755' mode: '0755'
become: yes become: yes
- name: Start docker service - name: Start docker service
systemd: systemd:
name: docker name: docker
state: started state: started
become: yes become: yes
- name: Clean up temporary runc file - name: Clean up temporary runc file
file: file:
path: /tmp/runc.amd64 path: /tmp/runc.amd64
state: absent state: absent
become: yes become: yes
- name: Verify new runc version - name: Verify new runc version
command: runc --version command: runc --version
register: new_runc_version register: new_runc_version
become: yes become: yes
- name: Show runc update result - name: Show runc update result
debug: debug:
msg: "runc updated to version: {{ new_runc_version.stdout }}" msg: "runc updated to version: {{ new_runc_version.stdout }}"
become: yes become: yes
when: when:
- runc_version_check is failed or - runc_version_check is failed or
"'1.2.4' not in runc_version_check.stdout" "'1.2.4' not in runc_version_check.stdout"
- ansible_architecture == "x86_64" - ansible_architecture == "x86_64"
become: yes become: yes
# ========== Portainer Agent Deployment ==========
- name: Deploy Portainer Agent
block:
- name: Create Portainer Agent directory
file:
path: /mnt/portainer-agent
state: directory
mode: '0755'
become: yes
- name: Deploy docker-compose.yml for Portainer Agent
copy:
content: |
services:
portainer_agent:
image: portainer/agent:latest
container_name: portainer_agent
restart: unless-stopped
ports:
- "9001:9001"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
networks:
- portainer_agent_net
networks:
portainer_agent_net:
driver: bridge
name: portainer_agent_net
dest: /mnt/portainer-agent/docker-compose.yml
mode: '0644'
become: yes
notify: Restart Portainer Agent
- name: Ensure Portainer Agent is running
community.docker.docker_compose_v2:
project_src: /mnt/portainer-agent
state: present
detached: yes
become: yes
- name: Verify Portainer Agent is running
command: docker ps --filter name=portainer_agent --format "{{ '{{' }}.Status{{ '}}' }}"
register: agent_status
changed_when: false
- name: Show Portainer Agent status
debug:
msg: "Portainer Agent on {{ inventory_hostname }}: {{ agent_status.stdout }}"
when: deploy_portainer_agent | default(false)
tags:
- portainer
- agent
# ========== Handlers ==========
handlers:
- name: Restart Portainer Agent
community.docker.docker_compose_v2:
project_src: /mnt/portainer-agent
state: present
restarted: yes
detached: yes
become: yes