ansible playbook 使用 script 模块在远程主机上执行脚本

  1. 需求一: 要在所有的远程主机上执行一下收集脚本,并在控制台打印出来
    脚本如下:

    [root@192 Playbooks]# cat CollectServerInformation.sh
    #!/bin/bash

    Collect server information

    echo "Collecting server information..."

    OS Information

    echo "Operating System Information:"
    cat /etc/*release

    Kernel Version

    echo "Kernel Version:"
    uname -r

    echo "Network Configuration:"
    ip -4 a

编辑ansible-playbook

v1版本:

复制代码
[root@192 Playbooks]# cat AnsiblePlay-CollectServerInformation.yaml
---
  - name: Execute script
    gather_facts: no
    become: yes
    become_user: root
    hosts: all
    tasks:
    - name: Execute script
      script:
        cmd: /opt/Playbooks/CollectServerInformation.sh
  • gather_facts: no : 不搜集主机 facts 可以加快执行速度
  • become: yes : 是否使用sudo
  • become_user: root :切换的用户

执行效果:

复制代码
[root@192 Playbooks]# ansible-playbook AnsiblePlay-CollectServerInformation.yaml

可以看出虽然脚本执行成功了,但是并没有在控制台打印出来。

v2版本:

复制代码
[root@192 Playbooks]# cat AnsiblePlay-CollectServerInformation.yaml
---
  - name: Execute script
    gather_facts: no
    become: yes
    become_user: root
    hosts: all
    tasks:
    - name: Execute script
      script:
        cmd: /opt/Playbooks/CollectServerInformation.sh
      register: script_result

    - name: Output result
      debug:
        msg: "{{ script_result.stdout  }}"
  • register: script_result : 将脚本的值注册到 script_result 中
    debug: # 调用debug模块打印 script_result 变量中的内容
    msg: "{{ script_result.stdout }}"
  1. 需求二: 要求把脚本的输出结果写入到ansible主机,并以远程主机名命名

这里的远程主机名指定是 inventory 清单中的主机名

如下:

编写ansible-play:

复制代码
---
- name: Execute remote script and save output on Ansible control node
  hosts: all
  gather_facts: no
  become: yes
  become_user: root
  tasks:
    - name: Execute script on remote hosts and save output to a temporary file
      script:
        cmd: /opt/Playbooks/hardware_info.sh
      register: script_result

    - name: Save script output with hostname as filename
      copy:
        content: "{{ script_result.stdout }}"
        dest: "/root/{{ inventory_hostname }}_output.txt"
      when: script_result.stdout is defined

    - name: Fetch script output from remote hosts
      fetch:
        src: "/root/{{ inventory_hostname }}_output.txt"
        dest: "/opt/Playbooks/output/"
        flat: yes
      when: script_result.stdout is defined	

上述ansible-play中定义了3个 task

task1:

将脚本的输出结果注册到变量script_result中

task2:

将远程主机的script_result.stdout 中的内容复制到 /root/{{ inventory_hostname }}_output.txt 文件,inventory_hostname 指定是在ansible清单中,对应的主机名。

task3:

将远程主机上/root/{{ inventory_hostname }}_output.txt 文件拷贝到ansible主机 /opt/Playbooks/output/ 目录下这里最后面记得加上/

  • when: script_result.stdout is defined : 在执行task前先判断 script_result.stdout 变量是否被定义
相关推荐
广目软件15 小时前
HA分布式架构采集节点变更操作手册20261029
运维·服务器·ansible·zabbix·prometheus
Moshow郑锴1 天前
Ansible 批量部署 Node.js 服务:ZIP 直解与共享目录分发两种方案对比
node.js·ansible
垚垚学技术_聚焦云原生2 天前
Ansible Playbook 进阶:when 条件、loop 循环、handlers 触发器落地
linux·ansible·自动化运维·devops
Moshow郑锴2 天前
GCP MIG 重建后 Ansible 初始化实战:PowerShell + NSSM 挂载 Windows 服务
windows·ansible
承渊政道4 天前
新增一台服务器时还要重新装Nginx?Ansible只改hosts目标列表,同一份Playbook继续执行
运维·nginx·ansible·内网穿透·cpolar
Helix2505 天前
Ansible混合环境自动化:Windows与Linux统一配置管理实战
windows·自动化·ansible·playbook·配置管理·winrm·混合环境
垚垚学技术_聚焦云原生7 天前
Ansible 变量体系详解:主机变量、组变量、全局变量优先级实战
ansible·自动化运维·devops·变量优先级
I'mChloe16 天前
不再逐台装Docker:我用Ansible Playbook批量统一服务器环境
服务器·docker·ansible
筑梦之路16 天前
Alibaba Cloud Linux 4 制作 Ansible RPM包实践(离线可复用)——筑梦之路
linux·运维·ansible
张洛闻Eren16 天前
Ansible【第一课】:Ansible介绍
运维·数据库·云原生·kubernetes·github·ansible