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 变量是否被定义
相关推荐
开源Linux6 天前
Ansible高频面试题详解:30个问题从入门到精通
ansible
我爱钱因此会努力8 天前
ansible实战-不同的用户登录不同的主机
linux·运维·服务器·ansible
我爱钱因此会努力8 天前
ansible实战- 关机
linux·运维·服务器·centos·自动化·ansible
运维李哥不背锅9 天前
Ansible 模块详解:高效管理你的 IT 基础设施
服务器·网络·ansible
K_i1349 天前
Ansible模块分类与实战应用指南
ansible
我爱钱因此会努力9 天前
ansible自动化运维入门篇
linux·运维·服务器·centos·自动化·ansible
zz-zjx9 天前
Ansible生产调优与故障排查全攻略
ansible
K_i1349 天前
Ansible自动化部署ECS与Nginx全流程
nginx·自动化·ansible
zz-zjx9 天前
生产级 Ansible 部署全流程-nginx示例
ansible
运维李哥不背锅9 天前
Ansible 的变量与模板:实现更灵活的自动化配置
java·自动化·ansible