在大多数情况下,我们使用Ansible来管理和配置来自单一控制节点的远程主机。因此,在创建playbook时,我们的理解是,它们应在我们在playbook的主机块中指定的远程机器上执行。
然而,在有些情况下,你可能需要在本地机器上而不是在远程主机上执行一个特定的动作。在这种情况下,像local_action这样的功能就很有用了。
本指南将告诉你如何使用Ansible local_action模块在本地执行任务。
Ansible local_action模块如何工作
如前所述,在创建游戏手册时,目标通常是远程主机。如果你需要对远程主机以外的主机执行任务,你可以使用Ansible模块,如local_action和delegate_to。
当你需要设置一个任务在特定的主机上执行时,delegate_to很有用。你可以通过指定主机名或IP地址将delegate_to模块指向目标主机。
另一方面,Local_action将只在本地机器上执行设定的任务。它类似于将 delegate_to 的值设置为 localhost 或 127.0.0.1
delegate_to: localhost
当你首先需要在本地机器上执行一个任务,然后再将其发送到远程系统时,local_action模块就很方便。这些主要是本地系统内的自定义或shell命令。
了解如何使用local_action模块的最好方法是使用示例播放簿。
Ansible local_action示例使用情况
为了简单起见,我们将尽量使游戏手册简短,不要太复杂。
在关注游戏手册之前,让我们描述一下我们的Ansible设置,这将使我们能够理解local_action模块是如何工作的。
在我们的例子中,我们有一台安装了Ansible的Ubuntu 20.04服务器。这将作为Ansible的控制节点。
接下来,我们有三台远程机器:一台Ubuntu 21.04服务器、一台Debian 11服务器和一台CentOS 8服务器。
在控制节点中,我们有Ansible清单文件,其中包含了所有这三台主机的IP地址。
一旦我们运行一个playbook,它就会在所有三个主机上执行。
注意:我们将把输出限制在一台主机上,以避免复杂和混乱。
使用模块的Local_action
考虑一下下面的游戏手册。
---
- hosts: all
gather_facts: no
become: true
tasks:
- name: Archivethelocallogfiles
local_action:
module: community.general.archive
path: /var/log
dest: /var/log/log.tar.gz
format: gz
force_archive: true
- name: Copylogarchivetoremotehost
ansible.builtin.copy:
src: /var/log/log.tar.gz
dest: /home/ubuntu
在第一个区块中,我们指定了运行任务的目标主机,除非另有规定。
该游戏手册继续通过将gather_facts块设置为no来禁用关于远程主机的事实收集。
为了拥有读写权限,我们将become块设置为true。
在随后的块中,我们定义了两个任务。
第一个任务从本地系统创建一个日志文件的存档。我们通过使用local_actiob块来委托该任务在本地系统中运行。在我们的例子中,我们使用一个社区模块,我们可以用命令来安装。
ansible-galaxy collection install community.general
下一个任务是将日志档案从本地系统复制到远程主机上的指定路径。
保存playbook并使用命令运行它。
ansible-playbook local_action.yml
成功完成后,你应该看到类似于下图的输出。

使用shell命令的local_action
下面的例子告诉你如何使用local_action模块来运行shell命令。
---
- hosts: all
gather_facts: no
become: true
tasks:
- name: countfilesanddirectoriesonthe remotehost
shell: ls-la~| wc -l
register: remote_files
- name: printremotefiles
debug:
msg: '{{remote_files.stdout}}'
- name: countfilesanddirectoriesonthe localmachine
local_action: shellls-la~| wc -l
register: local_files
- name: printlocalfiles
debug:
msg: '{{local_files.stdout}}'
在上面的示例游戏手册中,我们使用local_action模块来运行一个shell命令。该shell命令统计了保存在一个变量中的文件和目录的数量。
然后我们使用debug模块来打印远程和本地主机上的文件数量。
运行该文件为
ansible-playbook filecount.yml

使用run_once的local_action
你可以在使用run_once参数的同时使用local_action模块。
---
- hosts: all
gather_facts: no
become: true
tasks:
- name: Stoptheapacheserver
local_action:
module: ansible.builtin.service
name: httpd
state: stopped
run_once: True
上面的playbook将在本地系统上运行一次local_action块。
总结
当你想委托一个任务在本地机器上运行时,local_action模块很有用。你可以用Ansible模块或者shell命令来使用它。