欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

devops工具-Ansible基础

程序员文章站 2024-01-22 17:48:10
一、Ansible介绍 简介 Ansible使用Python语言开发,是一个配置管理型工具,与之类似的工具还有Puppet、SaltStack、chef等,默认通过SSH协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,可同时支持多台主机进行管理,Ansible是基于模块工作的,本身没有批 ......

一、ansible介绍

简介

    ansible使用python语言开发,是一个配置管理型工具,与之类似的工具还有puppet、saltstack、chef等,默认通过ssh协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,可同时支持多台主机进行管理,ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署的是ansible所运行的模块,能够实现批量运行命令、部署程序、配置系统等功能。目前已经ansible已经被红帽官方收购,并基于实现了企业级产品,如tower。
    ansible上手快,简单易学,深受广大运维人员青睐,是devops工程师必备技能之一。
 

特点

  • 部署简单,只需在主控端部署ansible环境,被控端无需做任何操作;
  • 默认使用ssh协议对设备进行管理;
  • 丰富的模块支持,可实现日常绝大部分操作;
  • 配置简单、功能强大、扩展性强;
  • 支持api及自定义插件或模块,可通过python轻松扩展;
  • 通过playbooks来定制强大的配置、状态管理;
  • 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;

架构 

devops工具-Ansible基础

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操作的配置文件。
 
执行过程:
  1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg;
  2. 查找对应的主机配置文件,找到要执行的主机或者组;
  3. 加载自己对应的模块文件,如 command;
  4. 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
  5. 对应执行用户的家目录的$home/.ansible/tmp/ansible-tmp-数字/xxx.py文件,给文件 +x 执行权限;
  6. 执行并返回结果;
  7. 删除临时py文件,退出;

二、安装配置

centos7安装

方式一:yum安装

yum install epel-release -y
yum install ansible –y

查看版本

ansible --version

devops工具-Ansible基础

方式二: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配置参数可参考官网:,以下列举常用配置参数: 
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模块参数:

devops工具-Ansible基础

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的使用。