* 简介:
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是工作在agentless模式(基于ssh服务实现工作在被监控端。监控端是ssh的客户端),具有幂等性(幂等性不会重复执行相同的指令。例如不会重复安装软件),ansible在控制端只需要告诉监控端的期望状态(只需要告诉被监控端的期望状态 )就可以实现批量部署,
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
* 特性
(1)、no agents:不需要在被管控主机上安装任何客户端,更新时,只需在操作机上进行一次更新即可
(2)、no server:无服务器端,使用时直接运行命令即可;
(3)、modules in any languages:基于模块工作,可使用任意语言开发模块;
(4)、yaml,not code:使用yaml语言定制剧本playbook;
(5)、ssh by default:基于SSH工作,支持sudo;
(6)、strong multi-tier solution:可实现多级指挥。
* Ansible 特点:
部署简单,只需在主控端部署 Ansible 环境,被控端无需做任何操作。
默认使用 SSH(Secure Shell)协议对设备进行管理。
主从集中化管理。
配置简单、功能强大、扩展性强。
支持 API 及自定义模块,可通过 Python 轻松扩展。
通过 Playbooks 来定制强大的配置、状态管理。
对云计算平台、大数据都有很好的支持。
提供一个功能强大、操作性强的 Web 管理界面和 REST API 接口 —- AWX 平台。
* 架构
Ansible:Ansible核心程序。
HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
ConnectionPlugins:连接插件,Ansible和Host通信使用
* 任务执行流程
1、加载自己的配置文件,默认/etc/ansible/ansible.cfg;
2、查找对应的主机配置文件,找到要执行的主机或者组;
3、加载自己对应的模块文件,如 command;
4、通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
5、对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
6、给文件 +x 执行权限;
7、执行并返回结果;
8、删除临时py文件,sleep 0退出;
* Ansiblle安装
ansible安装常用两种方式,yum安装和pip程序安装。
源码地址 :https://pypi.python.org/packages/source/a/ansible/ansible-1.5.tar.gz
- 使用 pip(python的包管理模块)安装
首先,需要安装一个python-pip包,安装完成以后,直接使用pip命令来安装ansible[root@Super ansible]# yum install python-pip -y [root@Super ansible]# pip install ansible
python版本2.5以上,低于2.5需要额外安装模块python-simplejson
- 使用 yum 安装
先安装一个epel-release包,然后再安装我们的 ansible[root@Super ansible]# yum install -y epel-release [root@Super ansible]# yum -y install ansible
yum安装目录如下:
配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
Help文档目录:/usr/share/doc/ansible-X.X.X/
Man文档目录:/usr/share/man/man1/
-
ansible配置文件ansible.cfg查找是从多个地方找的,顺序如下:
检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);
~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件;
/etc/ansible.cfg检查etc目录的配置文件。 -
/etc/ansible/ansible.cfg文件有许多参数,常用的有:
inventory = /etc/ansible/hosts #这个参数表示资源清单inventory文件的位置
library = /usr/share/ansible #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
forks = 5 #并发连接数,默认为5
sudo_user = root #设置默认执行命令的用户
remote_port = 22 #指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
host_key_checking = False #设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不进行host_key检查,省去目标key发生变化时输入(yes/no)的步骤
timeout = 60 #设置SSH连接的超时时间,单位为秒
log_path = /var/log/ansible.log #指定一个存储ansible日志的文件(默认不记录日志) - 资源清单inventory(/etc/ansible/hosts)文件就是我们的主机清单,里面保存的是一些 ansible 需要连接管理的主机列表,这个配置可以实现不同组合的配置,这里先用一种最简单的配法:
[root@Super ~]# vim /etc/ansible/hosts 文末添加
## db-[99:101]-node.example.com
[test]
10.15.43.164
10.15.43.238
-
ansible 7个常用命令
/usr/bin/ansible Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块 的官网平台,基于网络的
/usr/bin/ansible-playbook Ansible 定制自动化的任务集编排工具
/usr/bin/ansible-pull Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)
/usr/bin/ansible-vault Ansible 文件加密工具
/usr/bin/ansible-console Ansible基于Linux Consoble界面可与用户交互的命令执行工具
/usr/bin/ansible-doc Ansible 模块功能查看工具,常用于获取模块信息及其使用帮助 - ansible 命令
格式:ansible
[-f forks] [-m module_name] [-a args]
ansible是指令核心部分,其主要用于执行ad-hoc命令,即单条命令。默认后面需要跟主机和选项部分,默认不指定模块时,使用的是command模块,默认使用的模块是可以在ansible.cfg 中进行修改
[root@Super ~]# ansible -h
-a MODULE_ARGS, --args=MODULE_ARGS #模块的参数,如果执行默认COMMAND的模块,即是命令参数,如:“date”,"pwd"等等
module arguments #模块参数
--ask-become-pass ask for privilege escalation password # Ansible su切换用户的时候使用该参数输入密码
-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 # ansible-valut 加密文件
-B SECONDS, --background=SECONDS #后台运行超时时间
run asynchronously, failing after X seconds
(default=N/A)
-C, --check don't make any changes; instead, try to predict some #只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化
of the changes that may occur
-c CONNECTION, --connection=CONNECTION 连接类型使用。可能的选项是paramiko(SSH),SSH和地方。当地主要是用于crontab或启动。
connection type to use (default=smart)
-e EXTRA_VARS, --extra-vars=EXTRA_VARS # 调用外部变量
-f FORKS, --forks=FORKS # Ansible一次命令执行并发的线程数,默认是5
specify number of parallel processes to use
(default=5)
-h, --help show this help message and exit #打开帮助文档API
-i INVENTORY, --inventory-file=INVENTORY #指定库存主机文件的路径,默认为/etc/ansible/hosts
specify inventory host file
(default=/etc/ansible/hosts)
-l SUBSET, --limit=SUBSET #进一步限制所选主机/组模式 --limit=192.168.91.135 只对这个ip执行
further limit selected hosts to an additional pattern
--list-hosts outputs a list of matching hosts; does not execute
anything else
-m MODULE_NAME, --module-name=MODULE_NAME #执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
module name to execute (default=command)
-M MODULE_PATH, --module-path=MODULE_PATH #要执行的模块的路径,默认为/usr/share/ansible/
specify path(s) to module library
(default=/usr/share/ansible/)
-o, --one-line condense output #压缩输出,摘要输出.尝试一切都在一行上输出。
-P POLL_INTERVAL, --poll=POLL_INTERVAL #调查背景工作每隔数秒。需要- b
set the poll interval if using -B (default=15)
--private-key=PRIVATE_KEY_FILE #私钥路径,使用这个文件来验证连接
use this file to authenticate the connection
-S, --su run operations with su 用 su 命令
-R SU_USER, --su-user=SU_USER #指定SU的用户,默认是root用户
run operations with su as this user (default=root)
-s, --sudo run operations with sudo (nopasswd)
-U SUDO_USER, --sudo-user=SUDO_USER #sudo到哪个用户,默认为 root
desired sudo user (default=root)
-T TIMEOUT, --timeout=TIMEOUT #指定SSH默认超时时间, 默认是10S
override the SSH timeout in seconds (default=10)
-t TREE, --tree=TREE log output to this directory 将日志内容保存在该输出目录,结果保存在一个文件中在每台主机上。
-u REMOTE_USER, --user=REMOTE_USER 远程用户, 默认是root用户
connect as this user (default=root)
--vault-password-file=VAULT_PASSWORD_FILE
vault password file
-v, --verbose verbose mode (-vvv for more, -vvvv to enable 详细信息
connection debugging)
--version show program's version number and exit 输出ansible的版本
匹配所有主机:*或者all
匹配多个组:group1:group2
在group1这个组里,但不能在group2这个组里的主机:group1:!group2
取两个组的交集:group2:&group2
- ansible-vault
ansible-vault主要应用于配置文件中含有敏感信息,又不希望他能被人看到,vault可以帮你加密/解密这个配置文件,属高级用法。主要对于playbooks里比如涉及到配置密码或其他变量时,可以通过该指令加密,这样我们通过cat看到的会是一个密码串类的文件,编辑的时候需要输入事先设定的密码才能打开。这种playbook文件在执行时,需要加上 --ask-vault-pass参数,同样需要输入密码后才能正常执行,
- ansible-doc
[root@Super ~]# ansible-doc -h
Usage: ansible-doc [options] [module...]
Show Ansible module documentation 显示Ansible模块文档
Options:
--version show program's version number and exit 显示ansible-doc的版本号
-h, --help show this help message and exit 显示命令参数API文档
-M MODULE_PATH, --module-path=MODULE_PATH 查询模块,--module-path=MODULE_PATH 指定模块的路径
Ansible modules/ directory
-l, --list List available modules 显示已存在的所有模块列表,通过这个命令可以看到ansible中各个模块的名称,以及模块的大概功能
[root@Super ansible]# ansible-doc -l 命令查看到当前 ansible 都支持哪些模块
-s, --snippet Show playbook snippet for specified module(s) 显示playbook制定模块的用法
[root@Super ansible]# ansible-doc -s 模块名 查看该模块有哪些参数可以使用
-v Show version number and exit 显示ansible-doc的版本号
-
ansible 配置公私钥
ansible 是基于 ssh 协议实现的,其配置公私钥的方式与 ssh 协议的方式相同,通过ssh-copy-id(yum -y install openssh-clientsansible)将公钥上传到目标服务器。 - ansible 常用模块
1、主机连通性测试
使用ansible的ping模块来进行主机连通性测试,test是资源清单inventory(/etc/ansible/hosts)中主机清单的组名
从命令的返回信息中可以看到,10.15.43.238/164不可达,也就是说,ansible无法通过ssh连接到主机。返回上述信息是正常的,因为ansible主机并不知道10.15.43.238/164这台主机的用户名和密码,ansible是无法通过ssh连接到它。所以,还需要在清单中,配置两台主机的ssh信息,才能够进行正确的进行连接,配置示例如下:[root@Super ~]# grep -A3 test /etc/ansible/hosts [test] 10.15.43.164 ansible_port=22 ansible_user=root ansible_ssh_pass=redhat 10.15.43.238 ansible_port=22 ansible_user=root ansible_ssh_pass=redhat [root@Super ~]#
ansible_port 用于配置对应主机上的sshd服务端口号,
ansible_user 用于配置连接到对应主机时所使用的用户名称。
ansible_ssh_pass 用于配置对应用户的连接密码。
10.15.43.238中开启了防火墙和sestatus,这里我全部关闭了[root@Super ~]# ssh-keygen -R 10.15.43.238 # Host 10.15.43.238 found: line 1 /root/.ssh/known_hosts updated. Original contents retained as /root/.ssh/known_hosts.old [root@Super ~]# ansible test -m ping 10.15.43.238 | FAILED! => { "msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host." } 10.15.43.164 | SUCCESS => { "changed": false, "ping": "pong" } [root@Super ~]#
由于在本机的~/.ssh/known_hosts文件中并有fingerprint key串,ssh第一次连接的时候一般会提示输入yes 进行确认为将key字符串加入到 ~/.ssh/known_hosts 文件中。可以使用-o参数将StrictHostKeyChecking设置为no,使用ssh连接时避免首次连接时让输入yes/no部分的提示,在ansible.cfg配置文件中,启用ssh_args 部分,在末尾添加-o StrictHostKeyChecking=no ,或者放开host_key_checking = False(推荐)。
[root@Super ~]# egrep -i "ssh_args |host_key_checking" /etc/ansible/ansible.cfg
host_key_checking = False
#ssh_args = -C -o ControlMaster=auto -o ControlPersist=61s -o StrictHostKeyChecking=no
[root@Super ~]# ansible test -m ping
10.15.43.238 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.15.43.164 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[root@Super ~]#
这样就说明我们的主机是连通状态的。接下来的操作才可以正常进行。
- command 模块
这个模块可以直接在远程主机上执行命令,并将结果返回本主机。ansible不指定模块时,使用的是command模块,可以在ansible.cfg 中进行修改
[root@Super ~]# ansible test -m command -a 'hostname'
10.15.43.238 | SUCCESS | rc=0 >>
host238
10.15.43.164 | SUCCESS | rc=0 >>
host164
[root@Super ~]# ansible test -m command -a 'ls -l /opt'
10.15.43.238 | SUCCESS | rc=0 >>
total 0
-rw-r--r-- 1 root root 0 Jun 19 20:12 host238.txt
10.15.43.164 | SUCCESS | rc=0 >>
total 0
-rw-r--r--. 1 root root 0 Jun 20 04:11 host164.txt
[root@Super ~]#
命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。它不会通过shell进行处理,比如$HOME和操作如"<",">","|",";","&" 工作(需要使用(shell)模块实现这些功能)。注意,该命令不支持| 管道命令。
该模块下常用的几个命令:
chdir # 在执行命令之前,先切换到该目录
executable # 切换shell来执行命令,需要使用命令的绝对路径
free_form # 要执行的Linux指令,一般使用Ansible的-a参数代替。
creates # 一个文件名,当这个文件存在,则该命令不执行,可以
用来做判断
removes # 一个文件名,这个文件不存在,则该命令不执行
[root@Super ~]# ansible test -m command -a 'chdir=/opt ls'
10.15.43.164 | SUCCESS | rc=0 >>
host164.txt
10.15.43.238 | SUCCESS | rc=0 >>
host238.txt
[root@Super ~]#
先切换到/opt/ 目录,再执行“ls”命令
[root@Super ~]# ansible test -m command -a 'removes=/opt/ip.txt cat /opt/ip.txt '
10.15.43.238 | SUCCESS | rc=0 >>
host ip:10.15.43.238
10.15.43.164 | SUCCESS | rc=0 >>
host ip:10.15.43.164
[root@Super ~]#
如果/opt/ip.txt存在,就执行cat /opt/ip.txt
- shell 模块
shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,只要是shell命令,都可以通过这个模块在远程主机上运行,例如管道等,如果使用默认的command模块是不支持管道的。
[root@Super ~]# ansible test -m shell -a 'ifconfig|grep -i inet|grep -v 127.0.0.1'
10.15.43.238 | SUCCESS | rc=0 >>
inet 10.15.43.238 netmask 255.255.255.0 broadcast 10.15.43.255
inet6 fe80::20c:29ff:febd:8d97 prefixlen 64 scopeid 0x20
inet6 ::1 prefixlen 128 scopeid 0x10
10.15.43.164 | SUCCESS | rc=0 >>
inet 10.15.43.164 netmask 255.255.255.0 broadcast 10.15.43.255
inet6 fe80::e3ea:e9f7:d65c:3165 prefixlen 64 scopeid 0x20
inet6 ::1 prefixlen 128 scopeid 0x10
[root@Super ~]#
- copy 模块
这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等。
选项:src #被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制,用法类似于"rsync"
content #用于替换"src",可以直接指定文件的值
dest #必选项,将源文件复制到的远程主机的绝对路径
backup #当文件内容发生改变后,在覆盖之前把源文件备份,备份文件包含时间信息
directory_mode #递归设定目录的权限,默认为系统默认权限
force #当目标主机包含该文件,但内容不同时,设为"yes",表示强制覆盖;设为"no",表示目标主机的目标位置不存在该文件才复制。默认为"yes"
others #所有的 file 模块中的选项可以在这里使用
给定内容生成文件,并制定权限
mode指定文件的属性为755
覆盖
- file 模块
该模块主要用于设置文件的属性,比如创建文件、创建链接文件、删除文件等。常见的命令:force #需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group #定义文件/目录的属组。后面可以加上mode:定义文件/目录的权限
owner #定义文件/目录的属主。后面必须跟上path:定义文件/目录的路径
recurse #递归设置文件的属性,只对目录有效,后面跟上src:被链接的源文件路径,只应用于state=link的情况
dest #被链接到的路径,只应用于state=link的情况
state #状态,有以下选项:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
注意,文件保存的路径是设置的接收目录下的被管制主机ip目录下
cron 模块
该模块适用于管理cron计划任务的,其使用的语法跟crontab文件中的语法一致,同时,可以指定以下选项:
day= #日应该运行的工作( 1-31, , /2, )
hour= # 小时 ( 0-23, , /2, )
minute= #分钟( 0-59, , /2, )
month= # 月( 1-12, *, /2, )
weekday= # 周 ( 0-6 for Sunday-Saturday,, )
job= #指明运行的命令是什么
name= #定时任务描述
reboot # 任务在重启时运行,不建议使用,建议使用special_time
special_time #特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
state #指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务
user # 以哪个用户的身份执行
yum 模块
该模块主要用于软件的安装,其选项如下:
name= #所安装的包的名称
state= #present--->安装, latest--->安装最新的, absent---> 卸载软件。
update_cache #强制更新yum的缓存
conf_file #指定远程yum安装时所依赖的配置文件(安装本地已有的包)。
disable_pgp_check #是否禁止GPG checking,只用于presentor latest。
disablerepo #临时禁止使用yum库。 只用于安装或更新时。
enablerepo #临时使用的yum库。只用于安装或更新时。
238已经安装过,164新安装
service 模块
该模块用于服务程序的管理。主要选项:
arguments #命令行提供额外的参数
enabled #设置开机启动。
name= #服务名称
runlevel #开机启动的级别,一般不用指定。
sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。(定义在剧本中。)
state #有四种状态,分别为:started--->启动服务, stopped--->停止服务, restarted--->重启服务, reloaded--->重载配置
-
开启服务并设置自启动
root@Super ansible]# ansible test -m service -a 'name=crond state=started enabled=true' 10.15.43.238 | SUCCESS => { "changed": true, "enabled": true, "name": "crond", "state": "started", "status": { ...... 10.15.43.164 | SUCCESS => { "changed": true, "enabled": true, "name": "crond", "state": "started", "status": { ...... [root@Super ansible]# ansible test -m shell -a 'systemctl status crond' 10.15.43.238 | SUCCESS | rc=0 >> ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2018-06-20 15:08:13 CST; 4min 59s ago Main PID: 55742 (crond) ...... 10.15.43.164 | SUCCESS | rc=0 >> ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2018-06-20 23:08:20 CST; 5min ago Main PID: 29663 (crond) ......
- 关闭服务
[root@Super ansible]# ansible test -m service -a 'name=crond state=stopped' 10.15.43.238 | SUCCESS => { "changed": true, "name": "crond", "state": "stopped", "status": { ...... 10.15.43.164 | SUCCESS => { "changed": true, "name": "crond", "state": "stopped", "status": { ......
user 模块
该模块主要是用来管理用户账号,主要选项:
comment # 用户的描述信息
createhome # 是否创建家目录
force # 在使用state=absent时, 行为与userdel –force一致.
group # 指定基本组
groups # 指定附加组,如果指定为(groups=)表示删除所有组
home # 指定用户家目录
move_home # 如果设置为home=时, 试图将用户主目录移动到指定的目录
name # 指定用户名
non_unique # 该选项允许改变非唯一的用户ID值
password # 指定用户密码
remove # 在使用state=absent时, 行为是与userdel –remove一致
shell # 指定默认shell
state # 设置帐号状态,不指定为创建,指定值为absent表示删除
system # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid # 指定用户的uid
group 模块
该模块主要用于添加或删除组,常用的选项:
gid= #设置组的GID号
name= #指定组的名称
state= #指定组的状态,默认为创建,设置值为absent为删除
system= #设置值为yes,表示创建为系统组
script 模块
该模块用于将本机的脚本在被管理端的机器上运行,该模块直接指定脚本的路径即可
[root@Super ansible]# ansible test -S -R root -m shell -a 'crontab -l'
10.15.43.15 | SUCCESS | rc=0 >>
30 6 * * * /usr/bin/systemctl restart snmpd||/sbin/service snmpd restart
10.15.43.16 | SUCCESS | rc=0 >>
30 6 * * * /usr/bin/systemctl restart snmpd||/sbin/service snmpd restart
[root@Super ansible]# cat /app/scripts/remote-excet/system-time.sh
#!/bin/bash
export LANG="en_US.UTF-8"
#export LANG="zh_CN.UTF8"
source /etc/rc.d/init.d/functions
[ -f /etc/profile ] && . /etc/profile
[ -f ~/.bash_profile ] && . ~/.bash_profile
yum -y install ntpdate
if grep -q ntpdate /var/spool/cron/root;then
/usr/sbin/ntpdate ntp1.nl.net||/usr/sbin/ntpdate cn.pool.ntp.org && /sbin/clock -w
service crond restart || systemctl restart crond
else
/usr/sbin/ntpdate ntp1.nl.net||/usr/sbin/ntpdate cn.pool.ntp.org && /sbin/clock -w
echo "*/3 * * * * /usr/sbin/ntpdate ntp1.nl.net||/usr/sbin/ntpdate cn.pool.ntp.org && /sbin/clock -w" >> /var/spool/cron/root
service crond restart || systemctl restart crond
fi
[root@Super ansible]# ansible test -S -R root -m script -a '/app/scripts/remote-excet/system-time.sh'
10.15.43.15 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 10.15.43.15 closed.\r\n",
......
10.15.43.16 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 10.15.43.16 closed.\r\n",
.....
[root@Super ansible]# ansible test -S -R root -m shell -a 'crontab -l'
10.15.43.16 | SUCCESS | rc=0 >>
30 6 * * * /usr/bin/systemctl restart snmpd||/sbin/service snmpd restart
*/3 * * * * /usr/sbin/ntpdate ntp1.nl.net||/usr/sbin/ntpdate cn.pool.ntp.org && /sbin/clock -w
10.15.43.15 | SUCCESS | rc=0 >>
30 6 * * * /usr/bin/systemctl restart snmpd||/sbin/service snmpd restart
*/3 * * * * /usr/sbin/ntpdate ntp1.nl.net||/usr/sbin/ntpdate cn.pool.ntp.org && /sbin/clock -w
[root@Super ansible]#
setup 模块
该模块主要用于收集信息,是通过调用facts组件来实现的,facts组件是Ansible用于采集被管机器设备信息的一个功能,使用setup模块可以查机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。
acts就内建变量,每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作,如redhat系列用yum安装,而debian系列用apt来安装软件。
- 查看信息
直接用命令获取到变量的值[root@Super ~]# ansible test -S -R root -m setup -a 'filter="*mem*"' 10.15.43.16 | SUCCESS => { "ansible_facts": { "ansible_memfree_mb": 6, "ansible_memory_mb": { "nocache": { "free": 269, "used": 212 }, "real": { "free": 6, "total": 481, "used": 475 }, "swap": { "cached": 2, "free": 4079, "total": 4095, "used": 16 } }, "ansible_memtotal_mb": 481 }, "changed": false } 10.15.43.15 | SUCCESS => { "ansible_facts": { "ansible_memfree_mb": 29, "ansible_memory_mb": { "nocache": { "free": 288, "used": 192 }, "real": { "free": 29, "total": 480, "used": 451 }, "swap": { "cached": 0, "free": 4095, "total": 4095, "used": 0 } }, "ansible_memtotal_mb": 480 }, "changed": false } [root@Super ~]#
* 保存信息
setup模块可以保存所筛选的信息到ansibe的主机上,文件名为被管制的主机的IP。
[root@Super ~]# ansible test -S -R root -m setup -a 'filter="mem"' --tree /tmp/facts #/将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)
10.15.43.16 | SUCCESS => {
"ansible_facts": {
"ansible_memfree_mb": 5,
"ansible_memory_mb": {
"nocache": {
"free": 266,
"used": 215
},
"real": {
"free": 5,
"total": 481,
"used": 476
},
"swap": {
"cached": 1,
"free": 4079,
"total": 4095,
"used": 16
}
},
"ansible_memtotal_mb": 481
},
"changed": false
}
10.15.43.15 | SUCCESS => {
"ansible_facts": {
"ansible_memfree_mb": 22,
"ansible_memory_mb": {
"nocache": {
"free": 284,
"used": 196
},
"real": {
"free": 22,
"total": 480,
"used": 458
},
"swap": {
"cached": 0,
"free": 4095,
"total": 4095,
"used": 0
}
},
"ansible_memtotal_mb": 480
},
"changed": false
}
[root@Super ~]# cd /tmp/facts/
[root@Super facts]# ls
10.15.43.15 10.15.43.16
[root@Super facts]# cat 10.15.43.16
{"ansible_facts": {"ansible_memfree_mb": 5, "ansible_memory_mb": {"nocache": {"free": 266, "used": 215}, "real": {"free": 5, "total": 481, "used": 476}, "swap": {"cached": 1, "free": 4079, "total": 4095, "used": 16}}, "ansible_memtotal_mb": 481}, "changed": false}[root@Super facts]#