我正在尝试创建一个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