ansible-playbooks -从文件中安装apt包列表



我正在尝试创建一个Ansible playbook,它将读取文件的内容并使用这些内容在目标机器上安装软件包。

简单来说,我想运行这个命令转换成一个可见的剧本

cat ./meta/install-list/apt | xargs apt install -y


。/元/安装列表/apt

neofetch
tmux
git

。/ansible/剧本/apt.yaml

- hosts: all
become: true
tasks:
- name: Extract APT packages to install
command: cat ../../meta/install-list/apt
register: _pkgs
delegate_to: localhost
run_once: true
- name: Install APT packages
apt:
name: "{{ _pkgs.stdout_lines }}"
state: latest

。/ansible.cfg

[defaults]
inventory = ./ansible/inventory/hosts.yaml

。/ansible/库存/hosts.yaml

---
all:
children:
group-machines:
hosts:
target-machine.local

命令运行playbook

ansible-playbook --ask-become-pass ./ansible/playbooks/apt.yaml --limit group-machine

运行命令时卡在Extract APT packages to install

注意:上面提到的这些文件只能在运行该命令的机器上。如果可能的话,我希望防止将文件复制到目标计算机,然后运行playbooks任务

PS: new to sible

我在你的" Extract APT packages to install "中没有看到任何内容。应该导致它卡住的任务……但无论如何你都不需要这个任务;您可以像这样将两个任务合并为一个任务:

- hosts: all
become: true
tasks:
- name: Install APT packages
apt:
name: "{{ packages }}"
state: latest
vars:
packages: "{{ lookup('file', '../../meta/install-list/apt').splitlines() }}"

这里我们使用file查找来读取文件的内容。查找总是在本地(控制)主机上运行。

注意,你也可以这样写上面的代码…

- hosts: all
become: true
tasks:
- name: Install APT packages
apt:
name: "{{ lookup('file', '../../meta/install-list/apt').splitlines() }}"
state: latest

…但我喜欢在vars中保留较长的jinja表达式,以保持其余参数的可读性。

@Zeitounator给出的答案绰绰有余。但是如果你对包列表的原始文件做一些格式化,如下所示

packages:
- neofetch
- tmux
- git

之后,您可以简单地运行剧本如下

- hosts: all
become: true
vars_files: ../../meta/install-list/apt
tasks:
- name: Install APT packages
apt:
name: "{{ packages }}"
state: latest

现在假设你很懒,不想做格式化,那么下面的playbook也可以做到这一点。在我看来,它更干净,可扩展。

---
- name: SHow the packages list
hosts: localhost
become: true
tasks:
- name: View the packages list file
shell: cat ../../meta/install-list/apt
register: output

- name: Install the package
apt:
name: "{{ output.stdout_lines }}"
state: latest

最新更新