添加Loop功能后Ansible Playbook任务执行中断问题
问题描述
我在编写集成用户名变量的Ansible Playbook时遇到问题:原本使用绝对路径时两个任务可正常依次执行,但添加Loop功能后,第一个「复制Firefox配置文件夹」任务在处理paul用户时失败,后续第二个「读取profiles.ini文件内容」任务直接未执行,不清楚原因。
相关Playbook代码
- name: Copy the Firefox profile folder ansible.builtin.copy: src: "/home/me/ansible/ansible_clients/role-firefox/templates/profiles/mozilla/.mozilla/firefox/xxgeosl7.test" dest: "/home/{{ item.id }}/.mozilla/firefox/xxgeosl7.test" owner: "{{ item.id }}" group: "{{ item.id }}" mode: 0755 loop: "{{ users }}" register: copy_folder tags: add-profil - name: Read the contents of the profiles.ini file ansible.builtin.shell: cmd: cat "/home/{{ item.id }}/.mozilla/firefox/profiles.ini" loop: "{{ users }}" register: content_profiles_ini tags: add-profil
变量文件内容
users: - id: paul - id: jack
错误日志
TASK [role-firefox : Copy the Firefox profile folder] ************************************************************************************************************************************ failed: [192.168.100.49] (item=paul) => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"}, "ansible_loop_var": "item", "changed": false, "checksum": "d3b188859881814a9e9647e180adee84d3ab57ba", "gid": 0, "group": "root", "item": {"id": "paul"}, "mode": "0755", "msg": "chown failed: failed to look up user paul", "owner": "root", "path": "/home/paul", "size": 4096, "state": "directory", "uid": 0} ok: [192.168.100.49] => (item=jack) PLAY RECAP
问题原因与解决方法
核心原因
- paul用户不存在:日志明确提示
chown failed: failed to look up user paul,说明目标主机192.168.100.49上没有paul这个系统用户,导致copy任务在修改文件所有者时失败。 - 任务失败终止Play:Ansible默认规则是单个任务失败后终止整个Play的执行,因此第二个读取文件的任务没有运行机会。
解决步骤
1. 确保目标主机存在对应系统用户
先在目标主机上创建paul用户,或者修改变量文件移除不存在的用户。如果要通过Ansible自动创建用户,可以添加前置任务:
- name: 创建系统用户(若不存在) ansible.builtin.user: name: "{{ item.id }}" state: present home: "/home/{{ item.id }}" loop: "{{ users }}" tags: add-profil
2. 可选:允许任务失败不终止Play(按需使用)
如果希望即使部分用户处理失败,后续任务仍能执行其他用户的操作,可以给第一个任务添加ignore_errors: true(仅跳过错误,不解决根本问题):
- name: Copy the Firefox profile folder ansible.builtin.copy: src: "/home/me/ansible/ansible_clients/role-firefox/templates/profiles/mozilla/.mozilla/firefox/xxgeosl7.test" dest: "/home/{{ item.id }}/.mozilla/firefox/xxgeosl7.test" owner: "{{ item.id }}" group: "{{ item.id }}" mode: 0755 loop: "{{ users }}" register: copy_folder ignore_errors: true tags: add-profil
3. 优化第二个任务的执行条件
让第二个任务仅在对应copy任务成功时执行,避免无效操作:
- name: Read the contents of the profiles.ini file ansible.builtin.shell: cmd: cat "/home/{{ item.item.id }}/.mozilla/firefox/profiles.ini" loop: "{{ copy_folder.results }}" when: item is succeeded register: content_profiles_ini tags: add-profil
内容的提问来源于stack exchange,提问作者Paulpatou
相关产品推荐
相关产品推荐

