本文目录
- 简介
- 特点
- 架构
- 任务执行
- Centos7安装
- ubuntu安装
- 目录结构
- ansible配置文件查找顺序
- 常用配置参数
- 主机清单
- ansible-doc
- ansible
- ansible-playbook
- 编写配置文件
- 定义主机清单
- 配置ssh免密钥
- 运行模块
- 1. authorized_key模块
- 2.命令模块command
- 3.命令模块shell
- 4. 文件管理file模块
- 5. 文件复制copy模块
- 6.文件获取fetch
- 7. 包管理yum模块
- 8. 服务管理service模块
- 9. systemd模块
- 10. 用户管理user模块
- 11. 定时任务cron模块
- 12.运行脚本script模块
- 13.目录同步synchronize模块
- 14.信息采集setup模块
一、Ansible介绍
简介
Ansible使用Python语言开发,是一个配置管理型工具,与之类似的工具还有Puppet、SaltStack、chef等,默认通过SSH协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,可同时支持多台主机进行管理,Ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署的是Ansible所运行的模块,能够实现批量运行命令、部署程序、配置系统等功能。目前已经Ansible已经被红帽官方收购,并基于实现了企业级产品,如tower。 Ansible上手快,简单易学,深受广大运维人员青睐,是devops工程师必备技能之一。
特点
- 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
- 默认使用SSH协议对设备进行管理;
- 丰富的模块支持,可实现日常绝大部分操作;
- 配置简单、功能强大、扩展性强;
- 支持API及自定义插件或模块,可通过Python轻松扩展;
- 通过Playbooks来定制强大的配置、状态管理;
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
架构
1. Ansible:核心应用程序 2. Host inventory: 主机清单,用来定义Ansible管理的主机,默认是在Ansible配置文件中定义被管理主机,同时也支持自定义动态主机清单。 3. Comecton pugins:远程主机连接插件,负责和被管理主机实现通信。除支持使用SSH连接被管理主机外,Ansible还支持其他的连接方式,所以需要有连接插件将各个主机用连接插件连接到Ansible。 4. Core modules:Ansible核心模块,如yum、file、shell等,它是实际用于完成管理主机的模块,不通的模块功能不同。 5. Custom meodle:自定义模块。用于完成模块功能的补充,可借助相关插件完成记录日志、发送邮件等功能。 6. Playbooks :剧本,基于yaml, jinja2 语法,用来集中定义Ansible任务的配置文件,即将多个任务定义在一个剧本中由Ansible自动执行,可以由控制主机针对多台被管理主机同时运行多个任务。
任务执行
通常ansible 任务执行分为两种模式:ad-hoc和playbook
- ad-hoc模式(点对点模式):使用单个模块,支持批量执行单条命令,可完成简单类型的配置管理任务。
- playbook模式(剧本模式):Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
执行过程:
- 加载自己的配置文件,默认/etc/ansible/ansible.cfg;
- 查找对应的主机配置文件,找到要执行的主机或者组;
- 加载自己对应的模块文件,如 command;
- 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
- 对应执行用户的家目录的$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件,给文件 +x 执行权限;
- 执行并返回结果;
- 删除临时py文件,退出;
二、安装配置
Centos7安装
方式一:yum安装
yum install epel-release -y
yum install ansible –y
查看版本
ansible --version
方式二:pip安装
yum install python-pip
pip install ansible
ubuntu安装
sudo apt-get update sudo apt-get install software-properties-common sudo apt-add-repository --yes --update ppa:ansible/ansible sudo apt-get install ansible
目录结构
配置文件目录:/etc/ansible/ 执行文件目录:/usr/bin/ Lib库依赖目录:/usr/lib/python2.7/site-packages/ansible/ Help文档目录:/usr/share/doc/ansible-<version>/
ansible配置文件查找顺序
1. ANSIBLE_CONFIG :优先通过环境变量查找,例如设置为 export ANSIBLE_CONFIG=/home/admin/ansible.cfg 2. ansible.cfg :当前目录下的ansible.cfg配置文件 3. ~/.ansible.cfg :家目录下的.ansible.cfg配置文件 4. /etc/ansible/ansible.cfg:/etc下的ansible.cfg配置文件
利用以上特性,我们可以对不同使用ansible用户利用配置文件进行权限划分。比如admin用户在其家目录配置.ansible.cfg,而www用户在其家目录下定义另一个.ansible.cfg,配置不同的inventory,这样admin用户和www用户管理的主机就不相同。
常用配置参数
全部ansible.cfg配置参数可参考官网:
https://docs.ansible.com/ansible/latest/reference_appendices/config.html,以下列举常用配置参数:
inventory = /etc/ansible/hosts #主机清单配置 forks = 5 #同时执行任务的个数配置(并发数配置) sudo_user = root #设置默认sudo用户,主机清单指定可覆盖该选项 ask_sudo_pass = True #设置sudo是否需要需要密码 ask_pass = True #设置ssh是否需要输入密码 transport = smart #paramiko远程连接的连接类型 remote_port = 22 #远程主机默认ssh端口设置 log_path = /tmp/ansible.log #日志目录配置,默认不记录日志 host_key_checking = False #是否主机检查指纹 timeout = 60 #ssh连接超时默认设置 roles_path = /etc/ansible/roles #默认role配置目录 private_key_file = /path/to/file #设置默认ssh私钥位置 retries = 3 #设置ssh连接失败时候的尝试次数
需要注意的是ansible采用ConfigParser模块进行配置解析,其中一个配置组称为一个
section,而具体的配置参数称为options,例如:
[defaults] inventory = /etc/ansible/hosts forks = 5 sudo_user = root
其中[defaults]叫做配置组(section),而inventory、forks是配置参数(options)。
主机清单
ansible主机清单就是记录被控制的机器的清单,可分为动态主机清单和静态主机清单。静态主机清单通过配置文件ansible.cfg的inventory 选项指定文件路径,用于定义多个被管控主机。支持域名、IP,并可对主机分组,如下:
[web] #分组 10.1.210.53 #使用IP地址 10.1.210.51 www.example.com #使用域名 [db] 10.1.210.68
使用主机清单时候可以使用通配符,切片,逻辑表达式来使用。例如:
ansible 10.1.210.* -m ping #10.1.210.x网段的所有主机 ansible web[0:3] -m ping #属于组web的第1到4台主机 ansible web1&web2 -m ping #属于组web1又属于web2的主机
三、Ansible常用命令
ansible常用命令比较多,通常我们常用的就三个:ansible、ansible-doc、ansible-playbook。以下是相关命令以及作用:
/usr/bin/ansible #Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行 /usr/bin/ansible-doc #Ansible 模块功能查看工具 /usr/bin/ansible-galaxy #网络roles管理工具,可在网站(https://galaxy.ansible.com)上传或下载比较优秀的roles代码 /usr/bin/ansible-playbook #Ansible 定制自动化的任务集编排工具 /usr/bin/ansible-pull #支持直接从git下载playbook执行,需要遵循其规定的目录格式通常在配置大批量机器的场景下会使用 /usr/bin/ansible-vault #Ansible 文件加密工具 /usr/bin/ansible-console #与用户交互的命令执行工具
ansible-doc
ansible-doc用于查看模块的使用方法,常用方式如下:
ansible-doc -l #获取全部模块的信息 ansible-doc -s MOD_NAME #获取指定模块的使用帮助
示例查看cron模块参数:
ansible
ad-hoc模式工具,用于执行一次行命令使用语法:
ansible <host-pattern> <-m 模块> [-a args] [options]
options常用选项:
-a MODULE_ARGS #模块的参数,如果执行默认COMMAND的模块,即是命令参数,如: “date”,“pwd”等等 -k,--ask-pass #ask for SSH password。登录密码,提示输入SSH密码而不是假设基于密钥的验证 --ask-su-pass #ask for su password。su切换密码 -K,--ask-sudo-pass #ask for sudo password。提示密码使用sudo,sudo表示提权操作 --ask-vault-pass #ask for vault password。假设我们设定了加密的密码,则用该选项进行访问 -B SECONDS #后台运行超时时间 -C #模拟运行环境并进行预运行,可以进行查错测试 -c CONNECTION #连接类型使用 -f FORKS #并行任务数,默认为5 -i INVENTORY #指定主机清单的路径,默认为/etc/ansible/hosts --list-hosts #查看有哪些主机组 -m MODULE_NAME #执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数 -o #压缩输出,尝试将所有结果在一行输出,一般针对收集工具使用 -S #用 su 命令 -R SU_USER #指定 su 的用户,默认为 root 用户 -s #用 sudo 命令 -U SUDO_USER #指定 sudo 到哪个用户,默认为 root 用户 -T TIMEOUT #指定 ssh 默认超时时间,默认为10s,也可在配置文件中修改 -u REMOTE_USER #远程用户,默认为 root 用户 -v #查看详细信息,同时支持-vvv,-vvvv可查看更详细信息
host-pattern:在主机清单定义的目标主机,可支持以下几种方式:
- all:表示主机清单中所有的主机
- groupname:表示组中的所有主机
- host:指定某台主机,但是此主机必须在主机清单中
- 支持通配符(*)、逻辑与(:&)或(:)非(:!)和正则表达式(~)
示例:
ansible all -m ping #所有默认inventory文件中的机器 ansible \"*\" -m ping #同上 ansible 10.1.210.* -m ping #所有122.28.13.X机器 ansible web1:web2 -m ping #所有属于组web1或属于web2的机器 ansible web1:!web2 -m ping #属于组web1,但不属于web2的机器 ansible web1&web2 -m ping #属于组web1又属于web2的机器 ansible webserver[0] -m ping #属于组webserver的第1台机器 ansible webserver[0:5] -m ping #属于组webserver的第1到4台机器
ansible-playbook
ansible-playbook用于执行剧本命令,语法:
ansible-playbook [options] playbook.yml [playbook2 ...]
常用选项:
-u REMOTE_USER, --user=REMOTE_USER #ssh 连接的用户名 -k, --ask-pass #ssh登录认证密码 -s, --sudo #sudo 到root用户,相当于Linux系统下的sudo命令 -U SUDO_USER, --sudo-user=SUDO_USER #sudo 到对应的用户 -K, --ask-sudo-pass #用户的密码(—sudo时使用) -T TIMEOUT, --timeout=TIMEOUT #ssh 连接超时,默认 10 秒 -C, --check #指定该参数后,执行 playbook 文件不会真正去执行,而是模拟执行一遍,然后输出本次执行会对远程主机造成的修改 -e EXTRA_VARS, --extra-vars=EXTRA_VARS #设置额外的变量如:key=value 形式 或者 YAML or JSON,以空格分隔变量,或用多个-e -f FORKS, --forks=FORKS #进程并发处理,默认 5 -i INVENTORY, --inventory-file=INVENTORY #指定 hosts 文件路径,默认 default=/etc/ansible/hosts -l SUBSET, --limit=SUBSET #指定一个 pattern,对- hosts:匹配到的主机再过滤一次 --list-hosts #只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook --list-tasks #列出该 playbook 中会被执行的 task --private-key=PRIVATE_KEY_FILE #私钥路径 --step #同一时间只执行一个 task,每个 task 执行前都会提示确认一遍 --syntax-check #只检测 playbook 文件语法是否有问题,不会执行该 playbook -t TAGS, --tags=TAGS #当 play 和 task 的 tag 为该参数指定的值时才执行,多个 tag 以逗号分隔 --skip-tags=SKIP_TAGS #当 play 和 task 的 tag 不匹配该参数指定的值时,才执行 -v, --verbose #输出更详细的执行过程信息,-vvv可得到所有执行过程信息。
三、快速开始
编写配置文件
前面提到了ansible在运行时候配置文件的读取顺序,这里我们定义/etc/ansible/ansible.cfg
vi /etc/ansible/ansible.cfg [defaults] inventory = /etc/ansible/hosts forks = 5 remote_port = 22 host_key_checking = False timeout = 20 remote_user = root log_path =/tmp/ansible.log
定义主机清单
配置完成ansible配置文件以后需要定义主机清单,由于我们在配置文件中指明了inventory文件是/etc/ansible/hosts,所以需要在该路径下编辑主机清单:
vi /etc/ansible/hosts
[test]
10.1.210.51
10.1.210.53
以上定义了一个test组含有两个主机10.1.210.51、10.1.210.53,最基本的主机清单就定义完毕了,当然主机清单中还运行定义ssh连接的一些参数,如用户、端口等:
10.1.210.51 ansible_ssh_user=root ansible_ssh_port=522 10.1.210.53 ansible_ssh_user=admin ansible_ssh_port=522
配置ssh免密钥
ansible运行时基于ssh,你也可以选择不配置免密码,但是这样每次运行ansible都需要输入密码,这样比较麻烦,这也不是推荐的方式,更好的方式是是通过公私钥方式免密码登录。
首先生成密钥对:
[root@app52 ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory \'/root/.ssh\'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:P7AbPwaKH0sPweOtmd8MJ3xevSIlrQx4zTtulxurMZI root@app52 The key\'s randomart image is: +---[RSA 2048]----+ | | | | | | | . | | +.So . | | ..=+=+ o. | | .=oE+B=o.. | | ...O &X=+o . | | .*.++B*oo. | +----[SHA256]-----+
拷贝公钥到两台目标主机:
[root@app52 ~]# ssh-copy-id root@10.1.210.51 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: \"/root/.ssh/id_rsa.pub\" The authenticity of host \'10.1.210.51 (10.1.210.51)\' can\'t be established. ECDSA key fingerprint is SHA256:nT15Ecx6eQNSmfpYlkMTAA13/P4povudxMzQiUgfYqo. ECDSA key fingerprint is MD5:da:f1:53:9e:33:22:40:f8:52:a5:9a:1c:5d:d8:64:e8. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@10.1.210.51\'s password: Number of key(s) added: 1 Now try logging into the machine, with: \"ssh \'root@10.1.210.51\'\" and check to make sure that only the key(s) you wanted were added. [root@app52 ~]# ssh-copy-id root@10.1.210.53 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: \"/root/.ssh/id_rsa.pub\" The authenticity of host \'10.1.210.53 (10.1.210.53)\' can\'t be established. ECDSA key fingerprint is SHA256:xgZWILH5LuqmfjXe6rM9TaMQ8nlrnZl1f+qa8QnlaeY. ECDSA key fingerprint is MD5:9a:fd:9a:0e:33:c4:0e:4b:6c:17:24:70:ad:f1:7a:f7. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@10.1.210.53\'s password: Number of key(s) added: 1
测试免密码登录:
[root@app52 ~]# ssh 10.1.210.51 Last login: Sun Mar 10 18:59:27 2019 from 10.1.201.30 [root@app51 ~]#
运行模块
这里使用ping模块可以判断主机是否连通。
[root@app52 ~]# ansible test -m ping 10.1.210.53 | SUCCESS => { \"changed\": false, \"ping\": \"pong\" } 10.1.210.51 | SUCCESS => { \"changed\": false, \"ping\": \"pong\" }
以上ansible就可以正常使用了,下面介绍常用模块。
四、常用模块
所用常用模块都遵循以下语法,这里将介绍常用模块以及相关参数。
ansible <host-pattern> <-m 模块> [-a args] [options]
1. authorized_key模块
该模块用于添加或推送密钥到远程主机,在配置ansible无密码方式非常有用,常用参数:
key #公钥路径,可以是本地文件,可以是url地址,本地文件时使用{{ lookup(\'file\',\'~/.ssh/id_rsa.pub\') }},# url使用https://example.com/username.keys。 manage_dir #是否创建或修改目标authorized_keys所在目录的所有者和权限。默认为yes。使用自定义的目标路径时,必须设置为no path #authorized_keys所在的目录,默认为家目录下的.ssh目录中 state #是否将密钥添加到目标authorized_keys文件中,present表示添加,absent表示删除, user #指明添加到那个用户下的authorized_keys文件
演示:
推送root用户的公钥到目标主机
[root@app52 ~]# ansible 10.1.210.53 -m authorized_key -a \"user=root key={{lookup(\'file\',\'~/.ssh/id_rsa.pub\')}} state=present \" -k SSH password: 10.1.210.53 | SUCCESS => { \"changed\": false, \"comment\": null, \"exclusive\": false, \"follow\": false, \"key\": \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVlq85BhjzI9pTKBMW3h4Ntoto8FoBicifvhpZ4V2DhNr5nacKzIFTjcq/asFZ+VKJKoInRQkozRBnSrB1Rf5BbpOABK22ROgZUwkHX1H/emuuFm75s1o5y6/4Xkvfcwjczb0ZIzXSuSwSpXk66BaPRVSSVia4XLr6ZBzrZoGrTrwV1jK4phWI/cJTqdC9PSH24HfLyyPS1CMB9UWEQXGUMwem9Y9USOeAgrlVqFl3aoWx58SA6xnmm2hAefIKpDzIyuQaxCM7Yr5JdeXWlV4qE8ibBdPR3ltmZ7O2opZBRig+eMZmZoo0XpTKLbkDRHu3CxpECQAZ+nENG3apc9Yl root@app52\", \"key_options\": null, \"keyfile\": \"/root/.ssh/authorized_keys\", \"manage_dir\": true, \"path\": null, \"state\": \"present\", \"unique\": false, \"user\": \"root\", \"validate_certs\": true } #测试免密码登录 [root@app52 ~]# ssh 10.1.210.53 Last login: Wed Mar 20 21:38:57 2019 from 10.1.210.52 [root@app53 ~]# exit 登出 Connection to 10.1.210.53 closed
示例中使用-k选择在ssh时候询问密码,若要无秘钥推送需在主机清单文件指定ansible_ssh_pass参数配置密码:
[test] 10.1.210.51 ansible_ssh_pass=1234qwer 10.1.210.53 ansible_ssh_pass=1234qwer
2.命令模块command
该模块用于直接在远程主机执行命令,但不不支持|(管道)、$、&等shell操作符,这也是和shell模块的区别。常用参数:
chdir # 在执行命令之前,先切换到该目录 executable # 切换shell来执行命令,需要使用命令的绝对路径 free_form # 要执行的Linux指令,一般使用Ansible的-a参数代替。 creates # 文件路径,当这个文件存在,则该命令不执行,可以用来做判断 removes # 文件路径,这个文件不存在,则该命令不执行
演示:
使用command命令查看远程目录文件
[root@app52 ~]# ansible test -m command -a \'ls -l\' 10.1.210.53 | CHANGED | rc=0 >> 总用量 8 -rw-------. 1 root root 1258 1月 16 01:03 anaconda-ks.cfg -rw-r--r-- 1 root root 521 1月 16 10:50 rs.sh 10.1.210.51 | CHANGED | rc=0 >> 总用量 220332 -rw-------. 1 root root 1258 1月 16 00:15 anaconda-ks.cfg -rw-r--r-- 1 root root 7 2月 27 10:25 a.txt -rw-r--r-- 1 root root 10240 3月 1 15:42 backup.tar drwxr-xr-x 6 root root 47 3月 4 19:38 demo -rw-r--r-- 1 root root 76 2月 27 19:14 Dockerfile -rw-r--r-- 1 root root 578 1月 16 10:41 dr.sh -rw-r--r-- 1 root root 559 1月 16 14:53 nat.sh -rw------- 1 root root 114356736 2月 24 10:56 nginx-bus.tar.gz -rw------- 1 root root 111224320 2月 23 19:18 nginx.tar
同样的命令,使用creates判断本次任务是否需要运行:
[root@app52 ~]# ansible test -m command -a \'ls -l creates=/root/a.txt\' 10.1.210.51 | SUCCESS | rc=0 >> skipped, since /root/a.txt exists #由于/root目录下存在a.txt该条命令跳过 10.1.210.53 | CHANGED | rc=0 >> 总用量 8 -rw-------. 1 root root 1258 1月 16 01:03 anaconda-ks.cfg -rw-r--r-- 1 root root 521 1月 16 10:50 rs.sh
3.命令模块shell
shell模块用于远程主机调用shell环境执行命令,实际上是利用/bin/sh来执行命令的,该模式下可以使用shell环境,如$、|、&等,其参数于command模块相差不大。
演示:
[root@app52 ~]# ansible test -m shell -a \'cat /etc/passwd |grep root\' 10.1.210.51 | CHANGED | rc=0 >> root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin 10.1.210.53 | CHANGED | rc=0 >> root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
4. 文件管理file模块
文件模块用于管理文件或目录属性,也可以创建文件或者目录。常用参数:
group # file/directory的所属组 owner # file/directory的所有者 mode # 修改权限,格式可以是0644、\'u+rwx\'或\'u=rw,g=r,o=r\'等 path # 指定待操作的文件,可使用别名\'dest\'或\'name\'来替代path recurse # (默认no)递归修改文件的属性信息,要求state=directory src # 创建链接时使用,指定链接的源文件 state # 创建状态,对应以下参数: # directory:如果目录不存在则递归创建 # file:文件不存在时,不会被创建(默认值) # touch:touch由path指定的文件,即创建一个新文件,或修改其mtime和atime # link:修改或创建软链接 # hard:修改或创建硬链接 # absent:目录和其中的文件会被递归删除,文件或链接将取消链接状态
演示:
创建文件
[root@app52 ~]# ansible 10.1.210.51 -m file -a \'path=/tmp/b.txt state=touch\' 10.1.210.51 | CHANGED => { \"changed\": true, \"dest\": \"/tmp/b.txt\", \"gid\": 0, \"group\": \"root\", \"mode\": \"0644\", \"owner\": \"root\", \"size\": 0, \"state\": \"file\", \"uid\": 0 }
创建目录
[root@app52 ~]# ansible 10.1.210.51 -m file -a \'path=/tmp/test state=directory\' 10.1.210.51 | CHANGED => { \"changed\": true, \"gid\": 0, \"group\": \"root\", \"mode\": \"0755\", \"owner\": \"root\", \"path\": \"/tmp/test\", \"size\": 6, \"state\": \"directory\", \"uid\": 0 }
创建软连接文件
[root@app52 ~]# ansible 10.1.210.51 -m file -a \'path=/tmp/link.txt src=/tmp/b.txt state=link\' 10.1.210.51 | CHANGED => { \"changed\": true, \"dest\": \"/tmp/link.txt\", \"gid\": 0, \"group\": \"root\", \"mode\": \"0777\", \"owner\": \"root\", \"size\": 10, \"src\": \"/tmp/b.txt\", \"state\": \"link\", \"uid\": 0 } #查看软连接文件 [root@app52 ~]# ansible 10.1.210.51 -m command -a \'ls /tmp/link.txt -l\' 10.1.210.51 | CHANGED | rc=0 >> lrwxrwxrwx 1 root root 10 3月 19 19:54 /tmp/link.txt -> /tmp/b.txt
5. 文件复制copy模块
copy模块用于拷贝文件到远程主机上。默认情况下,ansible copy会检查文件md5查看是否需要拷贝,相同则不会拷贝,否则会拷贝。设置force=yes(默认),则当文件md5不同时(即文件内容不同)才覆盖拷贝,设置force=no时,则只拷贝对方没有的文件。常用参数:
src #被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制,用法类似于\"rsync\" content #直接以content给定的字符串或变量值作为文件内容保存到远程主机上,它会替代src选项 dest #必选项,将源文件复制到的远程主机的绝对路径 backup #当文件内容发生改变后,在覆盖之前把源文件备份,备份文件包含时间信息 directory_mode #递归设定目录的权限,默认为系统默认权限 follow=[yes|no] #是否追踪到链接的文件 force #当目标主机包含该文件,但内容不同时,设为\"yes\",表示强制覆盖;设为\"no\",表示目标主机的目标位置不存在该文件才复制。默认为\"yes\" group #设置远程文件的组 owner #设置远程文件的所有者 mode #设置远程文件的权限
演示:
复制文件
[root@app52 ~]# ansible 10.1.210.51 -m copy -a \'src=/tmp/ansible.log dest=/root/\' 10.1.210.51 | CHANGED => { \"changed\": true, \"checksum\": \"195af61477099d1334f7b2749f93707d367f00a4\", \"dest\": \"/root/ansible.log\", \"gid\": 0, \"group\": \"root\", \"md5sum\": \"5fc43e79e4af07c52a44817f29dc8a3d\", \"mode\": \"0644\", \"owner\": \"root\", \"size\": 4343, \"src\": \"/root/.ansible/tmp/ansible-tmp-1553067283.66-49657624579833/source\", \"state\": \"file\", \"uid\": 0 }
复制文件添加内容,指定用户和权限
[root@app52 ~]# ansible 10.1.210.51 -m copy -a \"content=\'this is wd\' dest=/root/name.txt mode=644 owner=admin group=admin\" 10.1.210.51 | CHANGED => { \"changed\": true, \"checksum\": \"3fd0fcff54aa1995f1b40a93a99b8708768a5e37\", \"dest\": \"/root/name.txt\", \"gid\": 1000, \"group\": \"admin\", \"md5sum\": \"f5b049c476514533b2cd5de017687f8f\", \"mode\": \"0644\", \"owner\": \"admin\", \"size\": 10, \"src\": \"/root/.ansible/tmp/ansible-tmp-1553067559.26-33339680488448/source\", \"state\": \"file\", \"uid\": 1000 } #查看文件 [root@app52 ~]# ansible 10.1.210.51 -m shell -a \'ls /root/name.txt -l\' 10.1.210.51 | CHANGED | rc=0 >> -rw-r--r-- 1 admin admin 10 3月 20 15:39 /root/name.txt
覆盖文件并备份
[root@app52 ~]# ansible 10.1.210.51 -m copy -a \"content=\'this is jack\' dest=/root/name.txt backup=yes\" 10.1.210.51 | CHANGED => { \"backup_file\": \"/root/name.txt.19514.2019-03-20@15:47:45~\", \"changed\": true, \"checksum\": \"32ed47aa1178639f3012ac6c28dafb80045328a3\", \"dest\": \"/root/name.txt\", \"gid\": 1000, \"group\": \"admin\", \"md5sum\": \"ab8d83c62bbb601c81166dce3b1e0a90\", \"mode\": \"0644\", \"owner\": \"admin\", \"size\": 12, \"src\": \"/root/.ansible/tmp/ansible-tmp-1553068064.26-211248349931283/source\", \"state\": \"file\", \"uid\": 1000 } #查看文件内容 [root@app52 ~]# ansible 10.1.210.51 -m shell -a \'cat /root/name.txt\' 10.1.210.51 | CHANGED | rc=0 >> this is jack #备份文件为文件名+时间 [root@app52 ~]# ansible 10.1.210.51 -m shell -a \'ls /root/name.* -l\' 10.1.210.51 | CHANGED | rc=0 >> -rw-r--r-- 1 admin admin 12 3月 20 15:47 /root/name.txt -rw-r--r-- 1 admin admin 10 3月 20 15:39 /root/name.txt.19514.2019-03-20@15:47:45~
6.文件获取fetch
该模块用于从远程主机上获取文件到本地,常用参数:
src #远程文件路径 dest #本次存放的文件的目录,如果不存在会创建 validate_checksum #获取到文件到本地后检查文件的md5是否一致 fail_on_missing #当文件不存在是标记为失败,默认yes
演示:
从10.1.210.51上拉去name.txt
[root@app52 ~]# ansible 10.1.210.51 -m fetch -a \'src=/root/name.txt dest=/root validate_checksum=yes\' 10.1.210.51 | CHANGED => { \"changed\": true, \"checksum\": \"32ed47aa1178639f3012ac6c28dafb80045328a3\", \"dest\": \"/root/10.1.210.51/root/name.txt\", \"md5sum\": \"ab8d83c62bbb601c81166dce3b1e0a90\", \"remote_checksum\": \"32ed47aa1178639f3012ac6c28dafb80045328a3\", \"remote_md5sum\": null } #注意其保存文件路径是目录是以远程节点的ip地址为目录的一个文件夹,这样做为了防止相同文件重复和覆盖 #查看刚才获取的文件 [root@app52 ~]# cat /root/10.1.210.51/root/name.txt this is jack
7. 包管理yum模块
该模块用于软件包的安装,卸载、升级等。常用参数:
disable_gpg_check #安装包时禁止gpgcheck,仅在state=present或latest时生效。 disablerepo #禁用指定的仓库,多个仓库使用逗号分隔。 enablerepo #指定使用那个仓库 exclude #排除哪些包不安装,仅在state=present或latest时生效。 list #列出可安装的包类似于yum list。 name #指定安装的包名,可带上版本号。多个包可使用逗号分隔。 update_cache #强制更新yum的缓存 state #安装或卸载包,present、installed,latest用于安装包,absent、removed用于移除已安装包。 #说明 #name需要配合state来使用,如果state指定为present/installed/latest将安装包,其中latest是安装最新包,默认为present。如果指定为absent/removed则用于卸载包。 #在ansible中,很多地方都会出现present和absent的状态,一般都表示目标资源的创建和删除。
演示:
列出包:
[root@app52 ~]# ansible 10.1.210.51 -m yum -a \'list=httpd\' 10.1.210.51 | SUCCESS => { \"ansible_facts\": { \"pkg_mgr\": \"yum\" }, \"changed\": false, \"results\": [ { \"arch\": \"x86_64\", \"envra\": \"0:httpd-2.4.6-88.el7.centos.x86_64\", \"epoch\": \"0\", \"name\": \"httpd\", \"release\": \"88.el7.centos\", \"repo\": \"base\", \"version\": \"2.4.6\", \"yumstate\": \"available\" } ] }
安装httpd服务
[root@app52 ~]# ansible 10.1.210.51 -m yum -a \'name=httpd state=present\' 10.1.210.51 | CHANGED => { \"ansible_facts\": { \"pkg_mgr\": \"yum\" }, \"changed\": true, \"msg\": \"\", \"rc\": 0, \"results\": [ \"Loaded plugins: fastestmirror\\nLoading mirror speeds from cached hostfile\\n * base: mirrors.huaweicloud.com\\n * extras: mirrors.tuna.tsinghua.edu.cn\\n * updates: mirrors.tuna.tsinghua.edu.cn\\nResolving Dependencies\\n--> Running transaction check\\n---> Package httpd.x86_64 0:2.4.6-88.el7.centos will be installed\\n--> Processing Dependency: httpd-tools = 2.4.6-88.el7.centos for package: httpd-2.4.6-88.el7.centos.x86_64\\n--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-88.el7.centos.x86_64\\n--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-88.el7.centos.x86_64\\n--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-88.el7.centos.x86_64\\n--> Running transaction check\\n---> Package apr.x86_64 0:1.4.8-3.el7_4.1 will be installed\\n---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed\\n---> Package httpd-tools.x86_64 0:2.4.6-88.el7.centos will be installed\\n---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed\\n--> Finished Dependency Resolution\\n\\nDependencies Resolved\\n\\n================================================================================\\n Package Arch Version Repository Size\\n================================================================================\\nInstalling:\\n httpd x86_64 2.4.6-88.el7.centos base 2.7 M\\nInstalling for dependencies:\\n apr x86_64 1.4.8-3.el7_4.1 base 103 k\\n apr-util x86_64 1.5.2-6.el7 base 92 k\\n httpd-tools x86_64 2.4.6-88.el7.centos base 90 k\\n mailcap noarch 2.1.41-2.el7 base 31 k\\n\\nTransaction Summary\\n================================================================================\\nInstall 1 Package (+4 Dependent packages)\\n\\nTotal download size: 3.0 M\\nInstalled size: 10 M\\nDownloading packages:\\n--------------------------------------------------------------------------------\\nTotal 2.2 MB/s | 3.0 MB 00:01 \\nRunning transaction check\\nRunning transaction test\\nTransaction test succeeded\\nRunning transaction\\n Installing : apr-1.4.8-3.el7_4.1.x86_64 1/5 \\n Installing : apr-util-1.5.2-6.el7.x86_64 2/5 \\n Installing : httpd-tools-2.4.6-88.el7.centos.x86_64 3/5 \\n Installing : mailcap-2.1.41-2.el7.noarch 4/5 \\n Installing : httpd-2.4.6-88.el7.centos.x86_64 5/5 \\n Verifying : httpd-tools-2.4.6-88.el7.centos.x86_64 1/5 \\n Verifying : apr-1.4.8-3.el7_4.1.x86_64 2/5 \\n Verifying : mailcap-2.1.41-2.el7.noarch 3/5 \\n Verifying : httpd-2.4.6-88.el7.centos.x86_64 4/5 \\n Verifying : apr-util-1.5.2-6.el7.x86_64 5/5 \\n\\nInstalled:\\n httpd.x86_64 0:2.4.6-88.el7.centos \\n\\nDependency Installed:\\n apr.x86_64 0:1.4.8-3.el7_4.1 apr-util.x86_64 0:1.5.2-6.el7 \\n httpd-tools.x86_64 0:2.4.6-88.el7.centos mailcap.noarch 0:2.1.41-2.el7 \\n\\nComplete!\\n\" ] }
卸载包
[root@app52 ~]# ansible 10.1.210.51 -m yum -a \'name=httpd state=absent\' 10.1.210.51 | CHANGED => { \"ansible_facts\": { \"pkg_mgr\": \"yum\" }, \"changed\": true, \"msg\": \"\", \"rc\": 0, \"results\": [ \"已加载插件:fastestmirror\\n正在解决依赖关系\\n--> 正在检查事务\\n---> 软件包 httpd.x86_64.0.2.4.6-88.el7.centos 将被 删除\\n--> 解决依赖关系完成\\n\\n依赖关系解决\\n\\n================================================================================\\n Package 架构 版本 源 大小\\n================================================================================\\n正在删除:\\n httpd x86_64 2.4.6-88.el7.centos @base 9.4 M\\n\\n事务概要\\n================================================================================\\n移除 1 软件包\\n\\n安装大小:9.4 M\\nDownloading packages:\\nRunning transaction check\\nRunning transaction test\\nTransaction test succeeded\\nRunning transaction\\n 正在删除 : httpd-2.4.6-88.el7.centos.x86_64 1/1 \\n 验证中 : httpd-2.4.6-88.el7.centos.x86_64 1/1 \\n\\n删除:\\n httpd.x86_64 0:2.4.6-88.el7.centos \\n\\n完毕!\\n\" ] }
8. 服务管理service模块
service模块用于管理service服务,常用参数:
enabled #是否开机自启动 name #服务名称 arguments #提供额外的参数 runlevel #启动级别 sleep #服务重启的等待时间,通常指服务关闭后启动等待的时间。 state #管理服务发生的行为,四种行为started(启动)、 stopped(停止)、 restarted(重启)、reloaded(重载)
演示:
重启sshd服务
[root@app52 ~]# ansible 10.1.210.51 -m service -a \'name=sshd state=restarted\' 10.1.210.51 | CHANGED => { \"changed\": true, \"name\": \"sshd\", \"state\": \"started\", \"status\": { \"ActiveEnterTimestamp\": \"五 2019-02-01 10:08:56 CST\", \"ActiveEnterTimestampMonotonic\": \"5276411\", \"ActiveExitTimestampMonotonic\": \"0\", \"ActiveState\": \"active\", \"After\": \"basic.target network.target system.slice systemd-journald.socket sshd-keygen.service\", \"AllowIsolate\": \"no\",
设置sshd服务为开机自启动
root@app52 ~]# ansible 10.1.210.51 -m service -a \'name=sshd enabled=yes\' 10.1.210.51 | SUCCESS => { \"changed\": false, \"enabled\": true, \"name\": \"sshd\", \"status\": { \"ActiveEnterTimestamp\": \"三 2019-03-20 17:24:11 CS
9. systemd模块
该模块用于管理systemd所管理的服务,该模块类似于service模块,由于centos7.x系统服务受systemd控制,所以ansible提供与之对应的模块管理,常用参数:
daemon_reload #是否进行systemctl daemon-reload操作 enabled #设置是否服务开机自启动 masked #是否将此unit做mask(隐藏、掩盖)处理。mask后的unit将无法启动 name #服务名称 state #service模块,四种状态:started、stopped、restarted、reloaded
演示:
启动httpd服务(前提已经安装)
[root@app52 ~]# ansible 10.1.210.51 -m systemd -a \'name=httpd state=started\' 10.1.210.51 | CHANGED => { \"changed\": true, \"name\": \"httpd\", \"state\": \"started\", \"status\": { \"ActiveEnterTimestampMonotonic\": \"0\", \"ActiveExitTimestampMonotonic\": \"0\", \"ActiveState\": \"inactive\", \"After\": \"remote-fs.target basic.target systemd-journald.socket tmp.mount network.target nss-lookup.target -.mount system.slice\", \"AllowIsolate\": \"no\", \"AmbientCapabilities\": \"0\",
10. 用户管理user模块
该模块用于管理远程主机的用户。常用参数:
comment #用户描述信息 createhome #是否穿件家目录,默认创建(需要ansible版本大于2.5) force # 强制删除用户,在使用state=absent时, 行为与userdel –force一致. group #指定该用户的组 groups #指定该用户的附加组 home #指定用户家目录 move_home #移动家目录到某个目录 name #用户名称 uid #设置用户uid password #设置用户密码 remove #删除用户时(state=absent)移除与之关联的目录, 行为与userdel —remove一致 shell #指定默认shell,默认是/bin/bash state #创建还是删除用户,present创建,absent删除 system #标记为系统用户,该操作不能对已经存在的用户生效 update_password #密码修改策略,always总是修改,无论当前用户是否存在,on_create代表只有新建才修改
演示:
创建一个zabbix用户,指定shell,并指定家目录
[root@app52 ~]# ansible 10.1.210.51 -m user -a \'name=zabbix state=present shell=/sbin/nologin home=/home/zabbix\' 10.1.210.51 | CHANGED => { \"append\": false, \"changed\": true, \"comment\": \"\", \"group\": 1001, \"home\": \"/home/zabbix\", \"move_home\": false, \"name\": \"zabbix\", \"shell\": \"/sbin/nologin\", \"state\": \"present\", \"uid\": 1001 }
修改刚才创建zabbix用户的家目录
[root@app52 ~]# ansible 10.1.210.51 -m user -a \'name=zabbix state=present home=/home/myhome\' 10.1.210.51 | CHANGED => { \"append\": false, \"changed\": true, \"comment\": \"\", \"group\": 1001, \"home\": \"/home/myhome\", \"move_home\": false, \"name\": \"zabbix\", \"shell\": \"/sbin/nologin\", \"state\": \"present\", \"uid\": 1001 } ###查看修改的用户 [root@app52 ~]# ansible 10.1.210.51 -m shell -a \'cat /etc/passwd |grep zabbix\' 10.1.210.51 | CHANGED | rc=0 >> zabbix:x:1001:1001::/home/myhome:/sbin/nologin
删除用户
[root@app52 ~]# ansible 10.1.210.51 -m user -a \'name=zabbix state=absent\' 10.1.210.51 | CHANGED => { \"changed\": true, \"force\": false, \"name\": \"zabbix\", \"remove\": false, \"state\": \"absent\" }
11. 定时任务cron模块
cron模块用于管理unix定时任务,常用参数:
inute #分钟,指定默认是*,数字范围0-59 hour #小时,不指定默认是*,范围0-23,支持unix语法,如(0-23, *, */2) day #日,不指定默认为*,范围1-31 month #月,不指定默认为*,范围1-12 weekday #周,不指定默认为*,范围0-6 name #计划任务名称 user #指定运行计划任务的用户 job #指定运行计划任务的命令 state #计划任务状态,present表示创建,absent表示删除 disabled #禁止或开启计划任务,yes代表禁止,no代表开启,使用该参数时候需要指定计划任务name和job reboot #主机重启时候是否需要执行,yes/no backup #yes/no如果设置了,则会在修改远程cron_file前备份这些文件 Special_time #特定时间运行,可选值reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)。
演示:
创建一个每天6点半执行的计划任务
[root@app52 ~]# ansible 10.1.210.51 -m cron -a \"name=\'test crontab\' hour=6 minute=30 job=\'echo this is wd\' state=present\" 10.1.210.51 | CHANGED => { \"changed\": true, \"envs\": [], \"jobs\": [ \"test crontab\" ] } #查看计划任务 [root@app52 ~]# ansible 10.1.210.51 -m shell -a \'crontab -l\' 10.1.210.51 | CHANGED | rc=0 >> #Ansible: test crontab 30 6 * * * echo this is wd
禁用计划任务
[root@app52 ~]# ansible 10.1.210.51 -m cron -a \"name=\'test crontab\' job=\'echo this is wd\' disabled=yes\" 10.1.210.51 | CHANGED => { \"changed\": true, \"envs\": [], \"jobs\": [ \"test crontab\" ] } #查看禁用的计划任务 [root@app52 ~]# ansible 10.1.210.51 -m shell -a \'crontab -l\' 10.1.210.51 | CHANGED | rc=0 >> #Ansible: test crontab #* * * * * echo this is wd
删除计划任务
[root@app52 ~]# ansible 10.1.210.51 -m cron -a \"name=\'test crontab\' state=absent\" 10.1.210.51 | CHANGED => { \"changed\": true, \"envs\": [], \"jobs\": [] } #查看已经没有了 [root@app52 ~]# ansible 10.1.210.51 -m shell -a \'crontab -l\' 10.1.210.51 | CHANGED | rc=0 >>
12.运行脚本script模块
该模块用于将本地的脚本在远程主机上运行,使用的是远程主机的shell环境,常用参数如下:
chdir # 运行脚本前先切换目录 creates # 远程主机上的文件路径,用于判断,当文件存在时候,本次任务不会运行 executable: # 可执行文件,调用脚本的 removes # 远程主机上的文件路径,也用于判断,当文件不存在时候,本次任务不会执行
演示:
切换目录运行一个脚本
创建脚本 vi test.sh #!/bin/sh touch ab.txt echo \"test script\" >> ab.txt #添加执行权限 [root@app52 ~]# chmod a+x test.sh #远程主机上运行脚本 [root@app52 ~]# ansible 10.1.210.51 -m script -a \"chdir=/tmp /root/test.sh\" 10.1.210.51 | CHANGED => { \"changed\": true, \"rc\": 0, \"stderr\": \"Shared connection to 10.1.210.51 closed.\\r\\n\", \"stderr_lines\": [ \"Shared connection to 10.1.210.51 closed.\" ], \"stdout\": \"\", \"stdout_lines\": [] } #查看创建的文件 [root@app52 ~]# ansible 10.1.210.51 -m shell -a \'cat /tmp/ab.txt\' 10.1.210.51 | CHANGED | rc=0 >> test script
13.目录同步synchronize模块
该模块用于文件或者目录同步,实现了简单的rsync命令功能,没有linux中的rsync功能完整,但是对于一些目录同步功能已经够用了。常用参数:
src #指定待传输的源文件。可以是相对路径,也可以是绝对路径。 dest #目标路径。可以是绝对路径,也可以是相对路径。 mode #指定推(push)还是拉(pull)的传输模式。 archive #等价于rsync的\"-a\"选项,即使用归档模式。它等价于rsync的\"-rtopgDl\"选项。值为yes/no。 times #保留mtime属性。 group #保留所属组属性。 owner #保留所有者属性。 links #拷贝链接文件自身。 perms #保留权限属性。 recursive #递归到目录中的文件。 compress #传输过程中压缩传输。应该总是开启,除非遇到问题。即rsync的\"-z\"选项。 copy_links #拷贝软链接的文件名和其指向的文件的内容。即a指向b文件时,将在目标端生成a普通文件,但此文件中的内容是b中的内容。 dirs #非递归方式传输目录。 delete #目标端如果比源端文件多,则删除这些多出来的文件,要求recursive=yes。 checksum #等价于\"-c\"选项,将基于文件的checksum来判断是否同步,而不是默认的quick check existing_only #接收端没有的文件不同步。但仍会传输,只是临时文件重组后不重命名而已。 partial #等价于\"--partial\"选项。默认rsync在传输中断时会删除传输了一半的文件,指定该选项将保留这部分不完整的文件,使得下次传输时可以直接从未完成的数据块开始传输。 dest_port #远程主机ssh的连接端口。 rsync_opts #指定额外的rsync选项。使用数组的方式传递这些选项。 rsync_path #当不指定rsync路径时,默认为/usr/bin/rysnc。 rsync_timeout #指定超时时间,rsync在多久时间内还没有数据传输就超时退出。 verify_host #对目标主机进行ssh的host key验证。
演示:
将本地/tmp目录同步到10.1.210.51/tmp/目录下
[root@app52 tmp]# ansible 10.1.210.51 -m synchronize -a \'src=/tmp dest=/tmp archive=yes\' 10.1.210.51 | CHANGED => { \"changed\": true, \"cmd\": \"/usr/bin/rsync --delay-updates -F --compress --archive --rsh=/usr/bin/ssh -S none -o Port=22 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null --out-format=<<CHANGED>>%i %n%L /tmp root@10.1.210.51:/tmp\", \"msg\": \"cd+++++++++ tmp/\\n<f+++++++++ tmp/ansible.log\\n<f+++++++++ tmp/yum_save_tx.2019-03-11.11-15.DZcIkr.yumtx\\n<f+++++++++ tmp/yum_save_tx.2019-03-11.11-19.Qc5Kc3.yumtx\\ncd+++++++++ tmp/.ICE-unix/\\ncd+++++++++ tmp/.Test-unix/\\ncd+++++++++ tmp/.X11-unix/\\ncd+++++++++ tmp/.XIM-unix/\\ncd+++++++++ tmp/.font-unix/\\ncd+++++++++ tmp/ansible_synchronize_payload_EWJueH/\\n<f+++++++++ tmp/ansible_synchronize_payload_EWJueH/__main__.py\\n<f+++++++++ tmp/ansible_synchronize_payload_EWJueH/__main__.pyc\\n<f+++++++++ tmp/ansible_synchronize_payload_EWJueH/ansible_synchronize_payload.zip\\ncd+++++++++ tmp/systemd-private-7f85d6b12aa643b4bc7c7563e118eb6f-chronyd.service-v9nL5T/\\ncd+++++++++ tmp/systemd-private-7f85d6b12aa643b4bc7c7563e118eb6f-chronyd.service-v9nL5T/tmp/\\n\", \"rc\": 0, \"stdout_lines\": [ \"cd+++++++++ tmp/\", \"<f+++++++++ tmp/ansible.log\", \"<f+++++++++ tmp/yum_save_tx.2019-03-11.11-15.DZcIkr.yumtx\", \"<f+++++++++ tmp/yum_save_tx.2019-03-11.11-19.Qc5Kc3.yumtx\", \"cd+++++++++ tmp/.ICE-unix/\", \"cd+++++++++ tmp/.Test-unix/\", \"cd+++++++++ tmp/.X11-unix/\",
14.信息采集setup模块
setup模块用于手机远程主机的设备信息,包括操作系统版本、CPU、IP地址、内存等重要信息。默认情况下,当ansible执行playbook时会先使用该模块收集远程主机信息,可通过gather_facts :False参数来指定不收集facts信息来加快playbook运行速度。常用参数:
filter #过滤收集的主机信息,支持通配符 gather_subset #收集指定类型的信息,可选的有all(所有)、min(精简)、hardware(硬件)、network(网络)等,多个使用逗号隔开,可以使用操作符号!,代表去反 gather_timeout #设置收集超时时间
演示:
收集主机信息,并存放在本地
[root@app52 action]# ansible test -m setup --tree /tmp/facts #保存形式是每一个IP一个文件 [root@app52 action]# ls /tmp/facts/ 10.1.210.32 10.1.210.33 10.1.210.51 10.1.210.53 #查看信息 [root@app52 action]# cat /tmp/facts/10.1.210.32 {\"ansible_facts\": {\"ansible_all_ipv4_addresses\": [\"10.0.0.125\", \"10.0.0.1\", “10.0.0...
过滤收集的信息
[root@app52 action]# ansible 10.1.210.51 -m setup -a \'filter=ansible_*_mb\' 10.1.210.51 | SUCCESS => { \"ansible_facts\": { \"ansible_memfree_mb\": 218, \"ansible_memory_mb\": { \"nocache\": { \"free\": 7407, \"used\": 415 }, \"real\": { \"free\": 218, \"total\": 7822, \"used\": 7604 }, \"swap\": { \"cached\": 3, \"free\": 8043, \"total\": 8063, \"used\": 20 } }, \"ansible_memtotal_mb\": 7822, \"ansible_swapfree_mb\": 8043, \"ansible_swaptotal_mb\": 8063 }, \"changed\": false }
收集指定类型的信息,这里只收集硬件和网络的信息:
[root@app52 action]# ansible 10.1.210.51 -m setup -a \'gather_subset=network,hardware\' |less 10.1.210.51 | SUCCESS => { \"ansible_facts\": { \"ansible_all_ipv4_addresses\": [ \"10.1.210.51\", \"172.17.0.1\" ], \"ansible_all_ipv6_addresses\": [ \"fe80::1caa:6cff:fe84:e466\", \"fe80::7828:2fff:fec8:5251\", \"fe80::38ab:99ff:fe54:dd71\", \"fe80::1496:77ff:fe7d:ee8b\", \"fe80::d80d:90ff:fe2b:1c3f\", \"fe80::dbc9:8e18:ea5e:fc02\", \"fe80::42:31ff:febb:2858\", \"fe80::60b8:daff:fe5f:356d\", \"fe80::7083:f1ff:fe03:78d3\" ], \"ansible_apparmor\": { \"status\": \"disabled\" }, \"ansible_architecture\": \"x86_64\", \"ansible_bios_date\": \"04/05/2016\", \"ansible_bios_version\": \"6.00\", \"ansible_cmdline\": { \"BOOT_IMAGE\": \"/vmlinuz-3.10.0-693.el7.x86_64\", \"LANG\": \"zh_CN.UTF-8\",
总结
本文详细了介绍了ansible的基本使用方法,并将常用模块也做了一一介绍,这些模块涵盖了日常运维操作的大部分操作,不难发现通过ansible批量操作主机非常的方便,但是也具有一定的危险性比如一旦操作失误将影响大批主机,使用时候应该小心。此外,当有一些复杂的运维操作时(比如源码安装nginx、mysql等),ansible-doc模式还是有局限性,而ansible为我们提供了playbook以及role管理,让这复杂操作都变得简单和有条理,下一篇文章将介绍playbook和role的使用。