* 简介:

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 平台。

* 架构

【Absible学习】Absible简介、安装_第1张图片
Ansible:Ansible核心程序。
HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
ConnectionPlugins:连接插件,Ansible和Host通信使用

* 任务执行流程

【Absible学习】Absible简介、安装_第2张图片
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

  1. 使用 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

  1. 使用 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)中主机清单的组名
    【Absible学习】Absible简介、安装_第3张图片
    从命令的返回信息中可以看到,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 模块中的选项可以在这里使用

复制文件
【Absible学习】Absible简介、安装_第4张图片

给定内容生成文件,并制定权限
【Absible学习】Absible简介、安装_第5张图片
mode指定文件的属性为755
覆盖
【Absible学习】Absible简介、安装_第6张图片

  • file 模块
    该模块主要用于设置文件的属性,比如创建文件、创建链接文件、删除文件等。常见的命令:

    force  #需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
    group  #定义文件/目录的属组。后面可以加上mode:定义文件/目录的权限
    owner  #定义文件/目录的属主。后面必须跟上path:定义文件/目录的路径
    recurse  #递归设置文件的属性,只对目录有效,后面跟上src:被链接的源文件路径,只应用于state=link的情况
    dest  #被链接到的路径,只应用于state=link的情况
    state  #状态,有以下选项:
    directory:如果目录不存在,就创建目录
    file:即使文件不存在,也不会被创建
    link:创建软链接
    hard:创建硬链接
    touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
    absent:删除目录、文件或者取消链接文件

创建目录
【Absible学习】Absible简介、安装_第7张图片

创建链接文件
【Absible学习】Absible简介、安装_第8张图片

删除文件
【Absible学习】Absible简介、安装_第9张图片

  • fetch 模块
    该模块用于从远程某主机获取(复制)文件到本地,有两个选项:
    dest:用来存放文件的目录
    src:在远程拉取的文件,并且必须是一个file,不能是目录
    【Absible学习】Absible简介、安装_第10张图片

注意,文件保存的路径是设置的接收目录下的被管制主机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 # 以哪个用户的身份执行

【Absible学习】Absible简介、安装_第11张图片

删除计划任务
【Absible学习】Absible简介、安装_第12张图片

yum 模块
该模块主要用于软件的安装,其选项如下:

name=  #所安装的包的名称
state=  #present--->安装, latest--->安装最新的, absent---> 卸载软件。
update_cache  #强制更新yum的缓存
conf_file  #指定远程yum安装时所依赖的配置文件(安装本地已有的包)。
disable_pgp_check  #是否禁止GPG checking,只用于presentor latest。
disablerepo  #临时禁止使用yum库。 只用于安装或更新时。
enablerepo  #临时使用的yum库。只用于安装或更新时。

【Absible学习】Absible简介、安装_第13张图片

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

  • 添加一个用户
    【Absible学习】Absible简介、安装_第14张图片

  • 删除用户
    【Absible学习】Absible简介、安装_第15张图片

group 模块
该模块主要用于添加或删除组,常用的选项:

gid=  #设置组的GID号
name=  #指定组的名称
state=  #指定组的状态,默认为创建,设置值为absent为删除
system=  #设置值为yes,表示创建为系统组

  • 创建组
    【Absible学习】Absible简介、安装_第16张图片

  • 删除组
    【Absible学习】Absible简介、安装_第17张图片

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]#