在Ansible中安装多个软件包

时间:2019-03-01 11:49:40

标签: 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

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

- 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

6 个答案:

答案 0 :(得分:2)

将其放入名为mongo的{​​{3}}中,得到目录结构:

playbook.yml
roles
|-- mongo
|  |-- defaults
|  |    |-- main.yml
|  |
|  |-- tasks
|  |    |-- main.yml
|  |
|  |-- handlers
|  |    |-- main.yml

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

mongo_version: 4.0
mongo_packages:
- mongodb-org-server
- mongodb-org-mongos
- mongodb-org-shell
- mongodb-org-tools

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

- name: Install mongodb
  yum:
    name: "{{ item }}-{{ mongo_version }}"
    state: present
  with_items: "{{ mongo_packages }}"
  notify: Restart mongodb

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

编写名为playbook.yml的Playbook来调用角色。

---
- hosts: all
  roles:
  - mongo

答案 1 :(得分:2)

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

- name: Install MongoDB
  yum:
    name:
      - mongodb-org-server
      - mongodb-org-mongos
      - mongodb-org-shell
      - mongodb-org-tools 
    state: latest
    update_cache: true

或使用apt module

- name: Install MongoDB
  apt:
    pkg:
      - mongodb-org-server
      - mongodb-org-mongos
      - mongodb-org-shell
      - mongodb-org-tools 
    state: latest
    update_cache: true

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

问题的第二部分如何将特定版本号集成到软件包列表中。没问题-只需删除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

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

答案 2 :(得分:1)

现在yum模块直接接受这样的软件包数组

  vars:
    pkgs:
      - screen
      - rubygems
      - ksh
      - strace

  tasks:
  - name: Install pre-requisite packages
    yum: name={{ pkgs }} state=installed

答案 3 :(得分:1)

一种更优雅的方法是,每次运行脚本时都不会重新检查每个软件包(如果已安装),

vars/main.yml或类似物中:

  packages_to_install:
    - mongodb-org-server
    - mongodb-org-mongos
    - mongodb-org-shell
    - mongodb-org-tools  

tasks/main.yml或类似物中:

  - name: "Get installed packages"
    yum:
      list: "installed"
    register: installed_packages

  - name: "Install missing packages"
    package: 
      state: "present"
      name: "{{ item }}"
    with_items: "{{ packages_to_install | difference(installed_packages | json_query('results[*].name')) }}"

本质上,这将检查已安装的内容,并且仅安装缺少的软件包。与直觉相反,这是更快的。您也可以使用dnf代替yum

答案 4 :(得分:0)

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

mongodb_version: 5
packages:
  - "mongodb-org-shell-{{ mongodb_version }}"
  - "mongodb-org-server-{{ mongodb_version }}"

在您的剧本中以

命名
- name: Install mongodb packages
  yum: name={{ item }}
       state=latest
  with_items: "{{ packages}}"

答案 5 :(得分:0)

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

- name: Install packages
  become: yes
  package:
    name:
      - tmux
      - rsync
      - zsh
      - rsync
      - wget
    state: present

(或 state: latest。)此功能仅适用于 Ansible 2.9 的 documented,因此它可能是新的。