我在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
答案 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)
有些人提到了允许传递列表的语法,但您不需要对 apt
或 yum
的代码进行特殊处理。这是使用通用包管理器模块的命令:
- name: Install packages
become: yes
package:
name:
- tmux
- rsync
- zsh
- rsync
- wget
state: present
(或 state: latest
。)此功能仅适用于 Ansible 2.9 的 documented,因此它可能是新的。