在剧本中使用角色时 Ansible 剧本不起作用

Ansible playbook not working when using roles in playbook

所以,我的剧本在使用这种语法时工作正常:

---
- hosts: all
  become: true
  become_user: root
  gather_facts: false
  connection: local
  vars_files:
    - roles/docker_setup/vars/docker_vars.yml
    - roles/docker_setup/vars/aws_cred.yml
  vars:
    instance_ids:
      - "i-xxxxxxxxxxx"
  tasks:
    - include_role:
        name: docker_setup
        tasks_from: docker_tasks.yml

但我读到你可以使用这种语法,一旦我想向剧本添加新角色,它看起来更容易处理:

---
- hosts: all
  become: true
  become_user: root
  gather_facts: false
  connection: local
  vars_files:
    - roles/docker_setup/vars/docker_vars.yml
    - roles/docker_setup/vars/aws_cred.yml
  vars:
    instance_ids:
      - "i-xxxxxxxxxxx"
  roles:
  - docker_setup

区别是:

roles:
  - docker_setup

而不是

tasks:
  - include_role:
      name: docker_setup
      tasks_from: docker_tasks.yml

但是当我尝试 运行 剧本时没有任何反应:

sudo ansible-playbook docker_setup.yml --ask-vault-pass -i hosts --user devops --key-file /home/devops/.ssh/id_rsa
Vault password: 

PLAY [all] *************************************************************************************************************************************************

PLAY RECAP *************************************************************************************************************************************************

为什么会这样?这是我的角色树:

.
├── docker_setup
│   ├── handlers
│   │   └── main.yml
│   ├── tasks
│   │   └── docker_tasks.yml
│   └── vars
│       ├── aws_cred.yml
│       └── docker_vars.yml
└── user_host_create
    ├── handlers
    │   └── user_handlers.yml
    ├── tasks
    │   └── user_tasks.yml
    └── vars
        ├── user_password_vault.txt
        ├── user_password.yml
        └── user_vars.yml

和主机文件:

[webservers]
172.31.31.223

谢谢!

下面两个选项的区别在于执行任务的文件。

  tasks:
    - include_role:
        name: docker_setup
        tasks_from: docker_tasks.yml
  roles:
    - docker_setup

第一种情况,显式是roles/docker_setup/tasks/docker_tasks.yml(见tasks_from).

第二种情况是roles/docker_setup/tasks/main.yml(见Role directory structure)。角色中缺少此文件。结果,什么都没有执行。您可以修复它并创建文件,例如

shell> cat roles/docker_setup/tasks/main.yml
- ansible.builtin.import_tasks: docker_tasks.yml

这将使这两个选项在执行哪些任务方面是等价的。但是,还会有其他差异,例如变量的范围,或标签的继承。有关详细信息,请参阅 Using Roles