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控制端来的脚本

创建好的目录

人已赞赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧