带有共享指令的任务文件

带有共享指令的任务文件

我该如何设置所有任务之间共享的指令在文件中,在 Ansible playbook 片段文件中仅包含任务

# ansible/inventory/roles/os_packages/tasks/main.yaml

- name: "APT: Update available packages from Debian repositories"
  gather_facts: false
  become: true
  become_user: root
  apt:
    update_cache: true
- name: "APT: Install required packages"
  gather_facts: false
  become: true
  become_user: root
  apt:
    name:
      - foo
      - bar

这些重复的指令 — gather_factsbecome、 等等 — — 应该在该文件中声明一次。但是,由于(目前?)没有代表该角色或剧本的文件,那么在哪里声明呢?

# ansible/inventory/roles/os_packages/tasks/main.yaml

# This doesn't work because Ansible is expecting only tasks.
gather_facts: false
become: true
become_user: root

- name: "APT: Update available packages from Debian repositories"
  apt:
    update_cache: true
- name: "APT: Install required packages"
  apt:
    name:
      - foo
      - bar

该文件只需要包含一系列任务;“角色”级别或“游戏”级别似乎没有合适的位置推荐的目录结构

如果整个剧本都在一个文件中,那么每个剧本都会有自己单独的名称,我会在剧本上设置指令。但是这些任务文件正在被收集和编译,而剧本没有地方供我编写这些指令。

应该在哪里执行适用于角色中的所有任务得到定义吗?

答案1

gather_facts对于除了剧本之外的任何事物来说,设置都是没有意义的(或者不可能的),因为它只会影响是否收集事实的剧本级别的决定。

becomebecome_user是有效的块或任务级关键字,因此您可以使用堵塞将它们应用到任务列表(在角色内或其他):

- become: true
  become_user: root
  block:
    - name: "APT: Update available packages from Debian repositories"
      apt:
        update_cache: true
    - name: "APT: Install required packages"
      apt:
        name:
          - foo
          - bar

调用角色时也可以应用许多关键字:

- hosts: all
  roles:
    - name: foo
      become: true
  tasks:
    - import_role:
        name: bar
      become: true

    - include_role:
        name: baz
        apply:
          become: true

答案2

我的典型目录结构:

├── deploy-something.yml
├── README.md
├── inventories
│   ├── prod
│   │   ├── group_vars
│   │   │   └── all
│   │   │       ├── vars.yml
│   │   │       └── vault.yml
│   │   ├── host_vars
│   │   │   ├── host1.yml
│   │   │   ├── host2.yml
│   │   │   └── localhost
│   │   │       ├── vars.yml
│   │   │       └── vault
│   │   └── inventory.yml
│   ...
└── roles
    ├── role1
    │   ├── ...
    ...

在这种情况下,我在顶层游戏中放置了这样的指令deploy-something.yml

- hosts: all
  remote_user: ansible
  become: yes
  become_method: sudo
  any_errors_fatal: true
  serial: true
  order: reverse_inventory
  roles:
  - role1
  - role2

答案3

问:适用于角色所有任务的指令应该在哪里定义?

答:简而言之,回答是:在角色之外。

关键字的具体位置取决于您如何使用该角色。还有更多选项

  • 角色:
  • 导入角色:
  • 包括角色:

解释所有事情超出了范围细节此处。通常,将此类关键字放在角色的(缩进)级别。在以下情况下包括角色你也可以申请关键字。请注意,并非所有关键字都可以在任何地方应用。请参阅剧本关键词适用于角色。例如,关键字gather_facts只能应用于剧本。解决问题的选项之一可能是以下剧本的结构

- hosts: all
  gather_facts: false
  roles:
    - role: os_packages
      become: true
      become_user: root

问:当没有代表角色的配置文件(只有角色目录)时,如何做到这一点(在角色级别应用此类关键字)?

答:如果只有角色目录,代表角色,则您只能将关键字应用于角色内的块和任务。您不能将关键字应用于此角色内的角色。角色没有配置文件之类的东西。

在前面的回答中,我所说的级别是指缩进级别,例如在上面的代码中,gather_facts适用于剧本,而和都become适用become_user于角色。

相关内容