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
相关产品推荐
相关产品推荐

