AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1075252
Accepted
bignose
bignose
Asked: 2021-08-22 01:42:33 +0800 CST2021-08-22 01:42:33 +0800 CST 2021-08-22 01:42:33 +0800 CST

任务文件,带有共享指令

  • 772

如何在仅包含任务的 Ansible 剧本片段文件中设置文件中所有任务之间共享的指令?

# 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_facts,become等——应该在该文件中声明一次。但是在哪里,因为(目前?)没有代表角色或扮演的文件?

# 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

该文件只需包含一系列任务;“角色”级别或“播放”级别似乎在这个推荐的目录结构中没有合适的位置。

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

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

ansible
  • 3 3 个回答
  • 87 Views

3 个回答

  • Voted
  1. Mikael H
    2021-08-22T02:11:19+08:002021-08-22T02:11:19+08:00

    我的典型目录结构:

    ├── 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
        │   ├── ...
        ...
    

    在这种情况下,我将这些指令放在顶层 play 中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
    
    • 0
  2. Best Answer
    flowerysong
    2021-08-22T21:55:36+08:002021-08-22T21:55:36+08:00

    gather_facts对除了游戏之外的任何东西进行设置是没有意义的(或可能的),因为它只会影响游戏级别的决定是否收集事实。

    become并且become_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
    
    • 0
  3. Vladimir Botka
    2021-08-22T03:50:20+08:002021-08-22T03:50:20+08:00

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

    A:简短的回答是:在角色之外。

    你应该把关键字放在哪里取决于你如何使用这个角色。还有更多选择

    • 角色:
    • 进口角色:
    • 包括角色:

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

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

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

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

    在上一个答案中,我所说的级别是指缩进级别,例如在上面的代码中,适用于戏剧,gather_facts同时适用于角色。becomebecome_user

    • -1

相关问题

  • 重复的 Ansible 任务

  • 无法形成站点中的文件的链接,该链接可用于使用 ansible 在远程服务器中启用的目录站点?

  • 如何执行 ansible 的特定角色?

  • Ansible 和 rbash

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve