Ansible原理架构配置介绍及常用模块详解
近期发现许多大厂都在用ansible+k8s+jenkins+gitlib+EFK+Prometheus管理整个生命周期,决定梳理一下ansible的相关内容
Ansible简介
Ansible采用高度模块化,调用特定的模块,完成相应的任务,基于yaml来批量完成任务的模块化,支持playbook,基于python语言实现,主要是用paramiko、pyyaml和jinja2三个关键模块,部署简单,主从模式,支持自定义模块,幂等性:允许重复执行N次,没有变化时,只会执行第一次。
Ansible的主要目标是简单和易用,无客户端,使用Openssh来进行数据传输。
Ansible功能
- 配置管理 Configuration(cfengine,chef,puppet)
- 部署发布 Deployment(Capistrano,Fabric)
- 命令行批量执行 Ad-Host Task(func)
- 多层次任务编排 Multi-Ter Orchestration(Juju,sort of)
Ansible特点
- 部署简单,只需要在主控端部署Ansible环境,被控端无需作任何操作
- 默认使用SSH协议对设备进行管理
- 主从集中化管理
- 配置简单、功能强大、扩展性强
- 支持API及自定义模块、可以通过Python轻松扩展
- 通过Playbooks来定制强大的配置、状态管理
- 对云计算平台、大数据都有很好的支持
Ansible架构
- Core Modules:核心模块,Ansible自带的模块。
- Custom Modules:自定义模块,上途中错写成Costome,如果核心模块不足以完成某种功能,可以自行添加自定义模块(支持现在主流的大部分编程语言,甚至于shell)
- Plugins:插件,支持使用插件的方式对ansible本身的功能进行扩展,模块是用来实现任务的,增强ansible平台自己的功能就需要使用插件(loggin插件记录日志,email插件发送邮件),其中最常用的是:连接插件(Connectionr Plugins)ansible基于连接插件连接到各个主机上,虽然默认情况下ansible使用ssh连接到各个主机上,但它还支持其它的连接方法。
- Host Inventory:主机群,主机清单,定义ansible管理的主机,还可以存放一下针对不同主机的变量,也可以写入主机的用户名和密码
- Playbooks:ansible的任务配置文件,将多个任务定义在剧中本,由ansible自动执行
Ansible工作原理:把我们执行的命令翻译为shell命令,通过openssh拷贝到目标主机 /root/.ansible/tmp/
下,然后再执行,执行完成后删除tmp文件
Ansible部署及配置介绍
1.ansible安装
Ansible原来不在默认的yum仓库中的,我们需要先下载epel-release镜像源才能够安装ansible,但是后来ansible被红帽1.5亿美元收购后,ansible镜像源就融合进了默认的yum仓库,所以我们直接ansible即可。
sudo yum install ansible
2.ansible文件说明
rpm -qi ansible #查看ansible版本信息
rpm -qa ansible #查看ansible包名称
rpm -ql ansible #查看ansible安装目录
/etc/ansible #ansible主目录
/etc/ansible/ansible.cfg #ansible主配置文件
/etc/ansible/hosts #ansible主机清单
/etc/ansible/roles #ansible角色目录
/usr/bin/ansible #ansible主程序目录
/usr/bin/ansible-connection #ansible连接工具
/usr/bin/ansible-console #ansible控制台
/usr/bin/ansible-doc #ansible文档工具
/usr/bin/ansible-galaxy #ansible galaxy
/usr/bin/ansible-inventory #ansible资产
/usr/bin/ansible-playbook #ansible playbook剧本工具
/usr/bin/ansible-pull #ansible pull是指在客户端组件基于ansible pull的方式从服务器上拉取文件
3.ansible.cfg配置详解
[default]
inventory = /etc/ansible/hosts #被控端主机清单文件
library = /usr/share/my_modules/ #指定ansible搜索模块位置,如果需要自定ansible模块,需要放到 library 所指定的目录下
remote_tmp = ~/.ansible/tmp #临时文件远程主机存放目录
local_tmp = ~/.ansible/tmp #临时文件本地主机存放目录
forks = 5 #ansible在执行工作时进程数量
poll_interval = 15 #默认轮询间隔时间,单位秒
sudo_user = root #被控端默认执行sudo命令所切换的用户
ask_sudo_pass = True #每次执行sudo命令时是否询问sudo到目标用户的密码
ask_pass = True #每次执行ansible命令是否询问ssh密码
transport = smart #通信机制
remote_port = 22 #远程连接被控端的ssh端口
module_lang = C #模块和系统之间通信的语言,默认为C语言
gathering = implicit #控制默认facts收集,远程系统变量
roles_path = /etc/ansible/roles #角色存储路径
host_key_checking = False #是否检查远程主机密钥
sudo_exe = sudo #sudo远程执行命令
sudo_flags = -H -S -n #传递sudo之外的参数
timeout = 10 #SSH超时时间
remote_user = root #指定默认的远程连接用户
log_path = /var/log/ansible.log #ansible日志文件,执行ansible的用户需要对日志文件具有写入权限
module_name = command #ansible默认执行的模块
executable = /bin/sh #执行的shell环境,用户shell模块
hash_behaviour = replace #如果变量重叠,优先级更高的一个是替换优先级低得还是合并在一起,默认为替换
private_role_vars = yes #默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量
private_key_file = /path/to/file #私钥文件存储位置
command_warnings = False #command模块Ansible默认发出警告
nocolor = 1 #ansible输出带上颜色区别,0表示开启,1表示关闭
pipelining = False #开启pipe ssh通道优化
[inventory]
[privilege_escalation]
#出于安全角度考虑,部分公司不希望直接以root的高级管理员权限直接部署应用,往往会开放普通用户权限并给予sudo的权限,该部分配置主要针对sudo用户提权的配置
become=True #是否sudo
become_method=sudo #sudo方式
become_user=root #sudo后变为root用户
become_ask_pass=False #sudo后是否需要验证密码
[paramiko_connection]
pty=False #是否禁用sudo功能
[ssh_connection]
#Ansible默认使用SSH协议连接对端主机,该部署是主要是SSH连接的一些配置,但配置项较少,多数默认即可
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s #ssh连接时的参数
pipelining = False #SSH pipelining 是一个加速 Ansible 执行速度的简单方法。ssh pipelining 默认是关闭,之所以默认关闭是为了兼容不同的 sudo 配置,主要是 requiretty 选项。如果不使用 sudo,建议开启。打开此选项可以减少 ansible 执行没有传输时 ssh 在被控机器上执行任务的连接数。不过,如果使用 sudo,必须关闭 requiretty 选项
scp_if_ssh = smart #该项为True时,如果连接类型是ssh,使ansible使用scp,为False是,ansible使用sftp。默认为smart,smart为先尝试sftp,然后尝试scp
[persistent_connection] #持续连接
connect_timeout = 30 #ansible如果在30秒内没有收到请求,则关闭连接,默认为30秒
command_timeout = 30 #ansible执行命令如果在30秒内没有收到回应则认为命令超时
[accelerate] #缓存加速
accelerate_port = 5099 #加速连接端口5099
accelerate_timeout = 30 #命令执行超时时间
ccelerate_connect_timeout = 5.0 #连接超时时间,单位为秒
accelerate_daemon_timeout = 30 #上一个活动连接的时间,单位为分钟
accelerate_multi_key = yes #允许多个私钥被加载到daemon
[selinux]
special_context_filesystems=nfs,vboxsf,fuse,ramfs,9p #文件系统在处理安全上下文时需要特殊处理,定义复制现有上下文的文件系统
libvirt_lxc_noseclabel = yes #将此设置为yes,以允许libvirt_lxc连接在没有SELinux的情况下工作
[colors]
#Ansible对于输出结果的颜色也进行了详尽的定义且可配置,该选项对日常功能应用影响不大,几乎不用修改,保持默认即可。
highlight = white
verbose = blue
warn = bright purple
error = red
debug = dark gray
deprecate = purple
skip = cyan
unreachable = red
ok = green
changed = yellow
diff_add = green
diff_remove = red
diff_lines = cyan
[diff]
always = no
context = 3
4.主机清单hosts详解
1.配置介绍
ansible_ssh_host=172.26.3.58 #目标主机地址
ansible_ssh_port=22 #目标端口,默认为ansible.cfg中配置的端口
ansible_ssh_user=test #连接目标主机的用户
ansible_ssh_pass=123456 #连接目标主机的用户密码
ansible_ssh_private_key_file=/root/.ssh/id_rsa #连接目标主机的用户密钥,密钥和密码二选一即可
ansible_sudo_ssh=123456 #sudo到ansible.cfg配置中指定用户的密码
ansible_python_interpreter=/bin/python2.7 #指定python解释器
第一种写法
[axxl]
app_node1 ansible_ssh_host=172.26.3.57 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
app_node2 ansible_ssh_host=172.26.3.58 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
#分组名称为 [axxl]
app_node:为主机的别名,如果使用ansible_ssh_host参数就必须要指定别名
ansible_ssh_host:指定主机地址
ansible_ssh_port:指定主机端口
ansible_ssh_user:指定连接用户
ansible_ssh_pass:指定连接密码
第二种写法
[mbxy]
172.26.3.[81:82] ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_private_key_file=/root/.ssh/id_rsa
#分组名称为 [mbxy]
172.26.3.[81:82]:目标主机地址, [81:82]使用表达式来匹配同网段主机,可以多写一些,例如:172.26.3.[81:100],则执行81-100之内的所有地址
ansible_ssh_private_key_file:明文密码写入hosts文件不安全,可以通过私钥来进行连接
第三种写法
[ybx]
172.26.3.84
172.26.3.85
[ybx:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass=123456
#分组名称为 [ybx]
[ybx:vars]:只针对 [ybx]分组内的机器使用该变量
第四种写法
[nginx]
172.26.3.62
[mbkz]
172.26.3.81
[all:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass=123456
#多个分组 [nginx] [mbkz]
[all:vars]:对hosts文件内所有的分组应用此变量
第五种写法
[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
#主机名
如果目标地址的主机名本机可以解析,那么也可以添加主机名
第六种写法
db-[99:101]-node.example.com
#域名或主机名的正则表达式匹配
ansible命令详解
ansible --help
Usage: ansible <host-pattern> [options]
选项:
-a MODULE_ARGS, --args=MODULE_ARGS #指定模块的参数
--ask-vault-pass #询问账号的密码
-B SECONDS, --background=SECONDS #异步运行,在指定秒后异步运行失败
-C, --check #不做出任何改变,只是进行测试检查
-D, --diff #当更改(小)文件和模板时,显示这些文件中的差异
-e EXTRA_VARS, --extra-vars=EXTRA_VARS #将其他变量设置为key=value或YAML/JSON,如果文件名前面有@
-f FORKS, --forks=FORKS #指定要使用的并行进程数,例如100台机器,-f指定每次运行几台,默认每次运行5台
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY #指定主机列表路径,如果不指定,默认为/etc/ansible/ansible.cfg中指定的hosts
-l SUBSET, --limit=SUBSET #将选定的主机限制为附加模式。
--list-hosts #列出清单中的主机列表,不进行任何操作
-m MODULE_NAME, --module-name=MODULE_NAME #指定要执行的模块名称,默认为 command 模块
-M MODULE_PATH, --module-path=MODULE_PATH #指定要执行模块的路径,默认模块路径为~/.ansible/plugins/modules:/usr/share/ansible/plugins
-o, --one-line #浓缩输出
--playbook-dir=BASEDIR #指定playbook文件目录
-P POLL_INTERVAL, --poll=POLL_INTERVAL #指定轮训间隔时间,默认为15
--syntax-check #如果使用了playbook则执行--syntax-check对剧本进行check
-t TREE, --tree=TREE #将ansible输出记录到指定目录
--vault-id=VAULT_IDS the vault identity to use
--vault-password-file=VAULT_PASSWORD_FILES
vault password file
-v, --verbose #详细模式(-VVV更多,-VVVV可启用连接调试)
--version #显示程序的版本号、配置文件位置、配置模块搜索路径、模块位置、可执行位置和退出
特权提升选项:
-b, --become #临时使用--become-method指定的提取方法
--become-method=BECOME_METHOD #使用权限提升方法(默认值=sudo)
--become-user=BECOME_USER #以该用户的身份运行操作(默认值=root)
-K, --ask-become-pass #请求权限提升密码
连接选项:
-k, --ask-pass #请求连接密码
--private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE #指定私钥文件进行登录
-u REMOTE_USER, --user=REMOTE_USER #指定连接用户,默认不指定则为hosts文件中用户
-c CONNECTION, --connection=CONNECTION #连接方式,默认为smart,还有ssh和sftp
-T TIMEOUT, --timeout=TIMEOUT #ansible连接超时时间,默认为10s
--ssh-common-args=SSH_COMMON_ARGS #指定要传递到SFTP/SCP/SSH的常见参数(例如ProxyCommand)
--sftp-extra-args=SFTP_EXTRA_ARGS #指定要传递到SFTP的额外参数(例如-f、-l)
--scp-extra-args=SCP_EXTRA_ARGS #指定要传递到SCP的额外参数(例如-1)
--ssh-extra-args=SSH_EXTRA_ARGS #指定只传递给ssh的额外参数(例如-R)
ansible-doc命令详解
ansible-doc是插件文档工具
ansible-doc -h
Usage: ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
Options:
-j, --json #仅用于内部测试,为所有插件转储json元数据
-l, --list #列出ansible内置的所有模块
-F, --list_files #在没有摘要的情况下显示插件名及其源文件(暗示-列表)
-M MODULE_PATH, --module-path=MODULE_PATH #模块路径,默认为 ~/.ansible/plugins/modules:/usr/share/ansible/plugins/modules
-s, --snippet #显示指定插件的参数等,用法 ansible-doc -s module_name
-t TYPE, --type=TYPE #选择插件类型,默认为模块
ansible常用模块详解
ping 模块
ping模块尝尝用于检测网络是否通畅
ansible -i hosts all -m ping
group 模块
group用户在目标机器上创建/删除用户组
#创建用户组
ansible -i hosts bigops -m group -a "gid=3000 name=algroup state=present system=no" -b
#参数解释
gid:指定组gid号,如果不指定,默认在主机上向后延伸gid号
name:指定组名称
state:指定组状态,值可以为 absent:删除用户组, present:创建用户组,默认为 present
system:是否为系统组,值为 yes 或 no,gid=3000,也就证明不是系统组了,system值默认也为 no
#在目标主机上查看我们创建的组
ansible -i hosts bigops -m shell -a "cat /etc/group | grep algroup" -b
192.168.31.225 | CHANGED | rc=0 >>
algroup:x:3000:
#删除用户组
ansible -i hosts bigops -m group -a "gid=3000 name=algroup state=absent system=no" -b
ansible -i hosts bigops -m shell -a "cat /etc/group | tail -1" -b #再去查看的时候发现用户组已被删除
192.168.31.225 | CHANGED | rc=0 >>
zabbix:x:1002:
user 模块
user模块用户在目标主机上创建/删除用户
#创建用户组
ansible -i hosts bigops -m group -a "name=ansible gid=1038 state=present system=no" -b
#创建用户
ansible -i hosts bigops -m user -a "name=ansible password=123456 create_home=yes home=/home/ansible group=ansible groups=root shell=/bin/bash uid=1024 state=present move_home=yes generate_ssh_key=yes" -b
#参数解释
name=ansible:指定用户名称
password=123456:指定用户密码
create_home=yes:是否创建家目录
home=/home/ansible:指定家目录位置
group=ansible:指定基本组(此基本组必须存在)
groups=root:指定附加组
shell=/bin/bash:指定用户登录shell环境
uid=1024:指定用户uid
state=present:指定用户状态, present为创建,absent为删除
move_home=yes:假如此用户已经存在,yes为覆盖家目录,no为创建为此用户创建另外一个家目录,两个家目录通过uid区分
generate_ssh_key=yes:创建用户的同时是否为此用户创建ssh密钥文件
#查看创建的用户
ansible -i hosts bigops -m shell -a "id ansible"
192.168.31.225 | CHANGED | rc=0 >>
uid=1024(ansible) gid=1038(ansible) groups=1038(ansible),0(root)
#删除用户
ansible -i hosts bigops -m user -a "name=ansible state=absent remove=yes" -b
#参数解释
state=absent:删除用户
remove=yes:删除此用户关联的家目录
copy 模块
copy模块用户将文件拷贝到目标主机上
#方法一
ansible -i hosts bigops -m copy -a "src=/home/ansible/hosts dest=/tmp/file_text mode=777"
#参数解释:
src=指定本地源文件
dest=指定要复制到目标路径,我这里把原文件hosts修改为了file_text
mode=指定复制后的文件权限为777
#方法二
将/home/ansible/下的所有文件复制到目标主机的/tmp/目录下
ansible -i hosts bigops -m copy -a "src=/home/ansible/ dest=/tmp/"
#方法三
将/home目录复制到目标主机的/tmp目录下,注意/home后面没有 "/",如果后面加了 "/"则把home下的所有文件复制过去,而不是 home 目录
ansible -i hosts bigops -m copy -a "src=/home dest=/tmp/"
#方法四
使用content来生成我们要复制到目标的文件内容
ansible -i hosts bigops -m copy -a "content='abcops opsblogs\nMy abcops\n' dest=/tmp/ops.txt"
查看文件内容
cat ops.txt
abcops opsblogs
My abcops
#方法五
复制到目的地址的文件直接修改权限及属性信息
ansible -i hosts bigops -m copy -a "content='abcops opsblogs\nMy abcops\n' dest=/tmp/ops.txt owner=micvs group=micvs mode=750"
owner=micvs:将ops.txt的属主修改为micvs
gorup=micvs:将ops.txt的属组修改为micvs
mode=750:将ops.txt的权限修改为750
fetch 模块
fetch模块主要作为为将远程主机文件复制到本地
ansible -i hosts bule_cmdb -m fetch -a "src=/root/anaconda-ks.cfg dest=/tmp/" -b
#参数解释
src=/root/anaconda-ks.cfg:为远程主机文件
dest=/tmp/:本地目录
#在本地/tmp目录中是以IP地址区分各个主机的文件
command 模块
command模块主要是可以直接执行命令,command本身执行不使用shell来解析命令,所有输出的命令将作为原始命令输出
#方法一
ansible -i hosts bigops -m command -a "chdir=/usr/local/src pwd"
#参数解释
chdir:切换到指定目录
pwd:为我们常规命令列出当前所在目录
#方法二
[root@Jumpserver ansible]# ansible -i hosts bigops -m command -a "echo '123456' | passwd --stdin apper" -b
192.168.31.225 | CHANGED | rc=0 >>
123456 | passwd --stdin apper
我们使用echo来把apper用户的密码改为123456,但是command模块却把我们的命令给echo输出到了界面,是因为command命令默认不识别shell,所以使用command命令无法完成具备shell类型的命令
shell 模块
shell模块比command模块功能强大,能完成command模块完成不了的任务,shell模块能够识别shell类型的命令
#chdir切换到/var/log/nginx目录,然后使用pwd命令显示当前目录
ansible -i hosts bigops -m shell -a "chdir=/var/log/nginx pwd"
#执行大于两个命令时,可使用分号 ; 来进行作为间隔符,直接使用cd命令也可以切换到相应的目录中,无需使用chdir
ansible -i hosts bigops -m shell -a "cd /var/log/nginx;pwd;ls;tail -2 /etc/passwd" -b
#使用shell模块,可直接创建用户,也就是无需使用 user 模块,shell模块可识别 echo 在线修改密码
ansible -i hosts bigops -m shell -a "useradd apper;echo '123456' | passwd --stdin apper" -b
192.168.31.225 | CHANGED | rc=0 >>
Changing password for user apper.
passwd: all authentication tokens updated successfully.
file 模块
file模块主要为设定文件属性
#方法一
在目标主机/tmp/目录下创建ansible_dir空目录
ansible -i hosts bigops -m file -a "path=/tmp/ansible_dir state=directory"
#方法二
在目标主机/tmp/ansible_dir/目录下创建ansible_txt空文件
ansible -i hosts bigops -m file -a "path=/tmp/ansible_dir/ansible_txt state=file"
但是使用file来创建空文件则报错,我们可以使用copy中的content来写入一个空文件,具体如下
ansible -i hosts bigops -m copy -a "content='' dest=/tmp/ansible_dir/ansible_txt"
#方法三
使用file模块来为目标主机创建符号链接
ansible -i hosts bigops -m file -a "src=/tmp/ansible_dir/ansible_txt path=/ansible_txt state=link" -b
源文件为/tmp/ansible_dir/ansible_txt,链接至/ansible_txt
cron 模块
cron模块主要是为目标主机来创建任务计划
#创建任务计划
ansible -i hosts bigops -m cron -a "minute=01 hour=00 day=* month=* weekday=* job='/sbin/ntpdate ntp2.aliyun.com;hwclock -w' name='Clock synchronization' user=micvs state=present"
#参数详解:
minute==分
hour==时
day==日
month==月
weekday==周
job=任务
name==任务计划名称
user==指定用户添加crontab
state=值为present,则添加任务计划,值为absent则删除任务计划
#查看定义的任务计划
[micvs@abcops_cmdb01 ~]$ crontab -l
#Ansible: Clock synchronization
01 00 * * * /sbin/ntpdate ntp2.aliyun.com;hwclock -w
#删除任务计划
删除任务计划必须要指定任务计划名称,方可删除,否则删除失败
ansible -i hosts bigops -m cron -a "name='Clock synchronization' state=absent user=micvs"
删除用户为micvs的名称为'Clock synchronization'的任务计划
yum 模块
yum模块主要是在目标主机上进行yum软件安装/卸载等操作
ansible -i hosts bigops -m yum -a 'name=htop state=latest disable_gpg_check=yes' -b
ansible -i hosts bigops -m yum -a 'name=httpd state=latest disable_gpg_check=yes' -b
#参数解释
name:安装软件的名称
conf_file:指定远程主机yum源位置
state:安装状态,值如下
latest 如果安装的软件存在则进行更新,如果不存在则安装最新版
present 如果安装的软件存在则不进行安装,如果不存在则安装
install 正常安装
absent 删除软件包
removed 卸载软件包
disable_gpg_check:关闭gpg_check
disablerepo:禁用某个yum源
enablerepo:启用某个yum仓库
service 模块
service模块主要用于管理linux主机上的服务
#启动目标主机上的httpd服务,是通过service启动的,在CentOS7上不可用
ansible -i hosts bigops -m yum -a "name=httpd state=startd enable=yes" -b
#参数解释:
name:指定服务名称
state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
enable:是否开机启动 yes|no
script 模块
script模块主要在传输远程节点后运行本地脚本
我这里写一个脚本如下:
#!/bin/bash
for i in ansible01 ansible02 ansible03
do
useradd $i
done
tail -3 /etc/passwd
使用script模块执行脚本
#使用script脚本直接指定本地脚本,ansible会把脚本拷贝到目标主机上执行后删除
ansible -i hosts bigops -m script -a "/home/ansible/ansible.sh" -b
192.168.31.225 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.31.225 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.31.225 closed."
],
"stdout": "ansible01:x:1004:1004::/home/ansible01:/bin/bash\r\nansible02:x:1005:1005::/home/ansible02:/bin/bash\r\nansible03:x:1006:1006::/home/ansible03:/bin/bash\r\n",
"stdout_lines": [
"ansible01:x:1004:1004::/home/ansible01:/bin/bash",
"ansible02:x:1005:1005::/home/ansible02:/bin/bash",
"ansible03:x:1006:1006::/home/ansible03:/bin/bash"
]
}
第二个脚本如下:
#!/bin/bash
for i in {1..100}
do
mkdir ansible/$i -p
done
要求在/tmp/yum下创建ansible目录下创建1-100个目录
ansible -i hosts bigops -m script -a "chdir=/tmp/yum /home/ansible/create_dir.sh"
#参数解释
chdir:进入/tmp/yum目录
然后执行从ansible控制端来的脚本
创建好的目录