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 变量是否被定义
相关推荐
http阿拉丁神猫1 天前
ansible脚本解读
服务器·ansible·apache
汪汪大队u3 天前
基于 K8s 的物联网平台运维体系:Ansible+Zabbix 自动化监控与故障自愈(一)—— 环境准备与 Zabbix Server 部署
运维·kubernetes·自动化·ansible·zabbix
IT大白鼠6 天前
Ansible vs 运维智能体:自动化工具的优劣对比与适用场景分析
运维·自动化·ansible
悠悠121388 天前
从0到1掌握Ansible:让自动化运维不再是梦想
运维·自动化·ansible
卧室小白10 天前
ansible自动化
ansible
yuezhilangniao11 天前
Ansible基础 ansible入门 针对不同python3版本 - 含 Terraform 入门联动
运维·自动化·ansible
Koma_zhe13 天前
【Ansible开源自动化运维工具】别再手动装监控了,Ansible能让上百台机器同时搞定Node Exporter(1)
运维·开源·ansible
.柒宇.15 天前
RedHat10-Ansible部署Docker操作
docker·eureka·ansible
道清茗23 天前
【RH294知识点汇总】第 7 章 《 使用角色和 Ansible 内容集合简化 Playbook 》常见问题
ansible
何中应24 天前
Ansible安装&使用
运维·自动化·ansible·运维开发·自动化运维