You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible安装Docker Playbook的Handler出现语法错误求助

Ansible Playbook语法错误排查:启动Docker/Containerd服务失败

你遇到的语法错误核心原因是systemd模块的参数格式错误:在starting docker service handler中,你试图用YAML序列(带-的列表)同时配置docker和containerd两个服务,但Ansible的systemd模块不支持这种写法——它的参数是针对单个服务的键值对,不能直接传入多个服务的配置列表。

以下是两种可行的修正方案:


方法1:拆分为两个独立的Handler

把启动docker和containerd的操作分成两个单独的handler,每个handler对应一个服务:

- name: "Install docker on Xubuntu slave"
  hosts: "{{ variable_host | default('web') }}"
  become: True
  tasks:
        - name: "Update repository"
          apt:
              update_cache: "yes"
        - name: "Installing requirements"
          apt:
              name:
                   - "ca-certificates"
                   - "curl"
                   - "gnupg"
                   - "lsb-release"
              state: latest
        - name: "creating keyring dir if not existing"
          file:
               path: "/etc/apt/keyrings"
               state: directory
               recurse: yes
        - name: "Adding docker's GPG key"
          shell: 'curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg || /bin/true'
          async: 20
          poll: 2
        - name: "Setting up repo"
          shell:
                'echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null'
        - name: "Re-Update repository"
          apt:
              update_cache: "yes"
        - name: "Installing docker"
          apt:
              name:
                   - "docker-ce"
                   - "docker-ce-cli"
                   - "containerd.io"
                   - "docker-compose"
                   - "docker-compose-plugin"
              state: latest
          notify:
            - "start docker service"
            - "start containerd service"
            - "adding user to docker group"
            - "re-evaluating group membership"
  handlers:
    - name: "start docker service"
      systemd:
        name: docker
        state: started
        enabled: true

    - name: "start containerd service"
      systemd:
        name: containerd
        state: started
        enabled: true

    - name: "adding user to docker group"
      user:
        name: "{{ ansible_user_id }}"
        groups: docker
        append: "yes"

    - debug:
        msg: "checking out if something is wrong"

    - name: "re-evaluating group membership"
      shell: 'newgrp docker || /bin/true'

方法2:使用Loop批量处理服务

如果想在一个handler里处理多个服务,可以用loop遍历服务列表,写法更简洁:

- name: "Install docker on Xubuntu slave"
  hosts: "{{ variable_host | default('web') }}"
  become: True
  tasks:
        - name: "Update repository"
          apt:
              update_cache: "yes"
        - name: "Installing requirements"
          apt:
              name:
                   - "ca-certificates"
                   - "curl"
                   - "gnupg"
                   - "lsb-release"
              state: latest
        - name: "creating keyring dir if not existing"
          file:
               path: "/etc/apt/keyrings"
               state: directory
               recurse: yes
        - name: "Adding docker's GPG key"
          shell: 'curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg || /bin/true'
          async: 20
          poll: 2
        - name: "Setting up repo"
          shell:
                'echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null'
        - name: "Re-Update repository"
          apt:
              update_cache: "yes"
        - name: "Installing docker"
          apt:
              name:
                   - "docker-ce"
                   - "docker-ce-cli"
                   - "containerd.io"
                   - "docker-compose"
                   - "docker-compose-plugin"
              state: latest
          notify:
            - "start docker and containerd services"
            - "adding user to docker group"
            - "re-evaluating group membership"
  handlers:
    - name: "start docker and containerd services"
      systemd:
        name: "{{ item }}"
        state: started
        enabled: true
      loop:
        - docker
        - containerd

    - name: "adding user to docker group"
      user:
        name: "{{ ansible_user_id }}"
        groups: docker
        append: "yes"

    - debug:
        msg: "checking out if something is wrong"

    - name: "re-evaluating group membership"
      shell: 'newgrp docker || /bin/true'

额外小修正

原playbook里有一处笔误:Adding docker's GPHG key应为Adding docker's GPG key,虽然不影响运行,但建议修正以保持准确性。

内容的提问来源于stack exchange,提问作者Skegg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:35:26