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 变量是否被定义
相关推荐
LCL_1813 小时前
ansible 自动化运维工具(三)playbook剧本
linux·运维·自动化·ansible
lifeng432113 小时前
Ansible自动化运维(三)playbook剧本详解
运维·自动化·ansible
无所不在的物质13 小时前
ansible运维实战
运维·ansible
Suckerbin13 小时前
linux部署ansible自动化运维
linux·运维·ansible
第八学期14 小时前
用Ansible Roles重构LNMP架构(Linux+Nginx+Mariadb+PHP)
linux·nginx·重构·架构·ansible·自动化运维
Karoku06615 小时前
【自动化部署】Ansible 基础命令行模块
运维·服务器·数据库·docker·容器·自动化·ansible
qhqh3101 天前
又一个ansible例子
linux·服务器·ansible
Karoku0661 天前
【自动化部署】Ansible基础以及部署安装指南
运维·服务器·数据库·docker·容器·自动化·ansible
小蘑菇的日记1 天前
Ansible常用操作-ansible模块
ansible
驰驰的老爸1 天前
windows 使用ansible
windows·ansible