ansible的 script 模块 可以用来远程批量执行脚本, 但是ansible-playbook可以做得更精细。
这是inventory文件,名称为host 每一条IP都有各自的env变量
[all]
10.111.1.23 env=SIT
10.111.1.24 env=SIT
10.111.8.24 env=UAT
10.111.5.14 env=Prod
10.111.5.16 env=Prod
这是deploy.yml文件
---
- hosts: all #主机组名称 这里包含所有
remote_user: mtest #要执行脚本主机的用户名
become_user: root
become_method: su
gather_facts: false
tasks:
- name: execute script #执行脚本
script: script.sh #要执行的脚本
register: result #脚本执行结果
when: env=='Prod' #执行条件 env必须是Prod
- name: print
debug: var=result['stdout_lines'] #打印结果 result是字典 注意var=...必须紧凑无空格 除非另起一行
when: env=='Prod' and result['stdout_lines']!=[] #有结果才打印
这里 debug注意有var,msg两种输出,var输出为变量,msg输出为字符串,所以后者变量带{{}},而前者不带
这是范例 script.sh
#!/bin/bash
uptime
date
执行
ansible-playbook -i host deploy.yml
结果 就是这样
而整个result字典其实是这样的 可以看到stdout 和 stdout_lines的区别 ,前者是字符串内置换行符 ,后者是列表,每一行都是一个元素,而后者更美观。
还有很多内置变量,很不错 比如
with_items: "{{ group_names }}" #打印执行主机所在的所有主机组的列表 可以循环遍历
debug: var=inventory_hostname #打印执行主机的IP
debug: var=groups #inventory包含的所有组的字典,key为组名,value就是组的主机列表
debug: var=hostvars #inventory包含的全部变量信息 慎用
debug: var=play_hosts #执行组包含的主机列表