在 Ansible 中安装多个包

Fra*_*cis 17 ansible

我在 Ansible 中有这个任务:

- name: Install mongodb
  yum:
    name:
    - "mongodb-org-{{ mongodb_version }}"
    - "mongodb-org-server-{{ mongodb_version }}"
    - "mongodb-org-mongos-{{ mongodb_version }}"
    - "mongodb-org-shell-{{ mongodb_version }}"
    - "mongodb-org-tools-{{ mongodb_version }}"
    state: present
  notify: Restart mongodb
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以指示版本而不必使用这样的循环?什么是更“优雅”的写法?

- name: Install mongodb
  yum:
    name: "{{ item }}-{{ mongodb_version }}"
    state: present
    loop:
    - mongodb-org-server
    - mongodb-org-mongos
    - mongodb-org-shell
    - mongodb-org-tools
  notify: Restart mongodb
Run Code Online (Sandbox Code Playgroud)

jon*_*ckt 14

令我惊讶的是,我没有在所有答案中找到最简单的解决方案所以这里是. 参考问题标题Installing multiple packages in Ansible这是(使用yum 模块):

- name: Install MongoDB
  yum:
    name:
      - mongodb-org-server
      - mongodb-org-mongos
      - mongodb-org-shell
      - mongodb-org-tools 
    state: latest
    update_cache: true
Run Code Online (Sandbox Code Playgroud)

或者使用apt 模块

- name: Install MongoDB
  apt:
    pkg:
      - mongodb-org-server
      - mongodb-org-mongos
      - mongodb-org-shell
      - mongodb-org-tools 
    state: latest
    update_cache: true
Run Code Online (Sandbox Code Playgroud)

两个模块都支持内联列表!

您问题的第二部分如何将特定版本号集成到包列表中。没问题 - 只需删除state: latest(因为使用特定的版本号和state: latest会引发错误)并使用=像这样的前缀将版本号添加到包名称中:

- name: Install MongoDB
  yum:
    name:
      - mongodb-org-server=1:3.6.3-0centos1.1
      - mongodb-org-mongos=1:3.6.3-0centos1.1
      - mongodb-org-shell=1:3.6.3-0centos1.1
      - mongodb-org-tools=1:3.6.3-0centos1.1 
    update_cache: true
Run Code Online (Sandbox Code Playgroud)

您还可以进一步优化并模板化版本号。在这种情况下,不要忘记添加引号:)


pio*_*ojo 13

有些人提到了允许传递列表的语法,但您不需要对aptor的代码进行特殊处理yum。以下是使用通用包管理器模块的命令:

- name: Install packages
  become: yes
  package:
    name:
      - tmux
      - rsync
      - zsh
      - rsync
      - wget
    state: present
Run Code Online (Sandbox Code Playgroud)

(或state: latest。)此功能仅针对 Ansible 2.9进行记录,因此它可能是新功能。


Cha*_*lie 8

将其设为名为的Ansible 角色mongo,从而生成目录结构:

playbook.yml
roles
|-- mongo
|  |-- defaults
|  |    |-- main.yml
|  |
|  |-- tasks
|  |    |-- main.yml
|  |
|  |-- handlers
|  |    |-- main.yml
Run Code Online (Sandbox Code Playgroud)

将所需的 MongoDB 包和版本添加到默认变量文件中roles/mongo/defaults/main.yml

mongo_version: 4.0
mongo_packages:
- mongodb-org-server
- mongodb-org-mongos
- mongodb-org-shell
- mongodb-org-tools
Run Code Online (Sandbox Code Playgroud)

roles/mongo/tasks/main.yml文件中重新写入任务:

- name: Install mongodb
  yum:
    name: "{{ item }}-{{ mongo_version }}"
    state: present
  with_items: "{{ mongo_packages }}"
  notify: Restart mongodb
Run Code Online (Sandbox Code Playgroud)

添加处理程序逻辑以在文件中重新启动 MongoDB roles/mongo/handlers/main.yml

编写一个playbook.yml调用该角色的 Playbook 。

---
- hosts: all
  roles:
  - mongo
Run Code Online (Sandbox Code Playgroud)


小智 6

我认为这是最好的方法,但由于包名不应该是硬编码的,最好保留在 vars/main.yml 中,例如

mongodb_version: 5
packages:
  - "mongodb-org-shell-{{ mongodb_version }}"
  - "mongodb-org-server-{{ mongodb_version }}"
Run Code Online (Sandbox Code Playgroud)

在您的剧本中将其称为

- name: Install mongodb packages
  yum: name={{ item }}
       state=latest
  with_items: "{{ packages}}"
Run Code Online (Sandbox Code Playgroud)