如何使用Ansible local_action模块在本地执行任务

2,565 阅读4分钟

在大多数情况下,我们使用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命令来使用它。