ansible安装及常用模块

Ansible中文权威指南:http://www.ansible.com.cn/

一、ansible介绍

Ansible是一种自动化的运维工具,基于Python开发,它集合了众多运维工具(比如puppet、chef、func等)的优点,能够实现批量操作。但其实Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,Ansible只是提供一种框架。

Ansible 是一个模型驱动的配置管理器,支持多节点发布、远程任务执行。默认使用 SSH 进行远程连接。无需在被管理节点上安装附加软件,可使用各种编程语言进行扩展。

二、Ansible特性

  • 模块化,调用特定的模块来完成特定任务 ,本身是核心组件,短小精悍 ;
  • 基于Python语言实现的,由Paramiko (python 的一个可并发连接 ssh 主机功能库 ) , PyYAML和Jinja2 ( 模板化 ) 三个关键模块实现;
  • agentless 无客户端工具;
  • 以主从模式工作;
  • 支持自定义模块;
  • 支持playbook,连续任务按先后设置顺序完成;
  • 期望每个命令具有幂等性:

1.管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接

2.可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为ad-hoc;

3.管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件 。

# ansible的配置文件:

/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录

三、ansible安装

3.1 ansible安装前准备

3.1.1 对管理主机的要求

目前,只要机器上安装了 Python 2.6 或 Python 2.7 (windows系统不可以做控制主机),都可以运行Ansible.

主机的系统可以是 Red Hat, Debian, CentOS, OS X, BSD的各种版本,等等.

自2.0版本开始,ansible使用了更多句柄来管理它的子进程,对于OS X系统,你需要增加ulimit值才能使用15个以上子进程,方法 sudo launchctl limit maxfiles 1024 2048,否则你可能会看见”Too many open file”的错误提示.

3.1.2 对托管节点的要求

通常我们使用 ssh 与托管节点通信,默认使用 sftp.如果 sftp 不可用,可在 ansible.cfg 配置文件中配置成 scp 的方式. 在托管节点上也需要安装 Python 2.4 或以上的版本.如果版本低于 Python 2.5 ,还需要额外安装一个模块:python-simplejson

3.1.3 托管节点注意点

(1)没安装python-simplejson:也可以使用Ansible的”raw”模块和script模块,因此从技术上讲,可以通过Ansible的”raw”模块安装python-simplejson,之后就可以使用Ansible的所有功能了.

(2)如果托管节点上开启了SElinux,需要安装libselinux-python,这样才可使用Ansible中与copy/file/template相关的函数.可以通过Ansible的yum模块在需要的托管节点上安装libselinux-python.

如果没有默认安装 Python 2.X 解释器.需要安装一个 Python 2.X 解释器,并在 inventory中设置 ‘ansible_python_interpreter’ 变量指向的 2.X Python.可以使用 ‘raw’ 模块在托管节点上远程安装Python 2.X.
例如:

ansible myhost --sudo -m raw -a "yum install -y python2 python-simplejson"

这条命令可以通过远程方式在托管节点上安装 Python 2.X 和 simplejson 模块.

3.2 CentOS 7 安装ansible

3.2.1 安装ansible

(1)方法一:使用yum安装ansible

sudo yum install -y epel-release
sudo yum install -y ansible

[root@localhost ~]# yum info ansible
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * epel: hkg.mirror.rackspace.com
Installed Packages
Name        : ansible
Arch        : noarch
Version     : 2.9.6
Release     : 1.el7
Size        : 104 M
Repo        : installed
From repo   : epel
Summary     : SSH-based configuration management, deployment, and
            : task execution system
URL         : http://ansible.com
License     : GPLv3+
Description : Ansible is a radically simple model-driven
            : configuration management, multi-node deployment, and
            : remote task execution system. Ansible works over SSH
            : and does not require any software or daemons to be
            : installed on remote nodes. Extension modules can be
            : written in any language and are transferred to managed
            : machines automatically.

(2)方法二:使用pip安装ansible

yum install python-pip
pip install ansible
3.2.2 修改ansible配置和主机列表hosts:
#关闭第一次使用ansible连接客户端时输入命令提示
sed -i "s@\#host_key_checking = False@host_key_checking = False@g" /etc/ansible/ansible.cfg

#指定日志路径:
sed -i "s@\#log_path = \/var\/log\/ansible.log@log_path = \/var\/log\/ansible.log@g" /etc/ansible/ansible.cfg

[root@localhost ~]# grep -v "^#" /etc/ansible/ansible.cfg | grep -v "^$"
[defaults]
host_key_checking = False
log_path = /var/log/ansible.log
[inventory]
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]

3.2.3 将所有主机ip加入到/etc/ansible/hosts文件中
[root@localhost ~]# cat /etc/ansible/hosts
[app]
192.168.75.128

#默认ssh的端口为22端口,如果为其他端口号,可在主机名后面加上端口号,如 192.168.75.128:9604 ,也可以修改配置文件中的remote_port变量值

#也可以定义一个主机范围,如192.168.75.[100:200] ,表示192.168.75.100 - 192.168.75.200 的主机
3.2.4 创建和配置 SSH 公钥认证(免密码登录)
[root@localhost ~]# 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:
6b:1c:34:84:6e:61:23:90:75:49:f2:41:2e:9c:8c:e1 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
|  o+oo=o.        |
| ..=.**o         |
|  E =+ooo        |
|     .o. .       |
|     .  S        |
|       . o       |
|        +        |
|       .         |
|                 |
+-----------------+
3.2.5 通过ansible将公钥分发至各主机上
ansible all -m authorized_key -a "user=root key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}' path=/root/.ssh/authorized_keys manage_dir=no" --ask-pass -c paramiko

#需要输入主机的密码,若是有的主机密码不一致,那么该主机会分发失败,此时只需再执行一遍命令输入该主机密码即可。或者先将密码相同的主机进行分组,然后依次指定主机组执行命令分批分发公钥。

#此命令是通过追加的方式来推送公钥至authorized_keys,所以不用担心原来的文件内容会被覆盖。

到任意一台主机上查看,可以看到公钥已成功推送:

[root@localhost ~]# cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCiVwMCS/RSSuBVxNF8RMZ3WPxgdvxghC/UumhfMPPx/W2XsNZtJo3ioi73D8ZOnVWsCuhwHxE1FT1rhPiI61K33RAdrZuamlLYftcpzaOuHMpThxaIO7d1hu4ddmrOtfYQ8UMEPf4Wd8se2pTLr1W+hEwakm6UIbyezMUSDchLo2CuB5WFj8yaB7UlLjq7sTR2zbRqn2P3CPSlmDvkzCua8w2POsvI74sasvayhxka7pejzpvj49KniHaep7s1FpA2WsHJ/At8XWFqwtihO8jHffXIyc8nRH/iCf79baPmViNvVXdoGdcXprjVZmuxmNUmEN0G1QNZLR3P+dtlf58D [email protected]
PS:ansible免密登录命令另一方法
ssh-keygen -t rsa -P ""      #生成秘钥/root/.ssh/id_rsa.pub
ssh-copy-id -i ./.ssh/id_rsa.pub [email protected]   #将公钥传到192.168.75.128上,其中192.168.75.128是要被监控的机器

#如果出现报错:-bash: ssh-copy-id: command not found
#则需要安装一个包:yum -y install openssh-clientsansible
3.2.6 修改ansible配置,指定私钥文件路径
sed -i "s@\#private_key_file = \/path\/to\/file@private_key_file = \/root\/.ssh\/id_rsa@g" /etc/ansible/ansible.cfg
3.2.7 测试
[root@localhost ~]# ansible all -m ping --list-hosts
  hosts (1):
    192.168.75.128
    
[root@localhost ~]# ansible all -m ping
192.168.75.128 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
# 可以在命令后面加上-vvvv参数查看详细的输出结果,尤其是在命令执行失败需要排错的时候非常有用

四、ansible命令及常用模块

4.1 ansible命令

通过ssh实现配置管理、应用部署、任务执行等功能

建议配置ansible端能基于密钥认证的方式联系各被管理节点

【格式】ansible [-m module_name] [-a args]

的匹配规则:

#ALL 表示列表中的所有主机 ,ping进行主机连通性测试
例:ansible all -m ping 

#匹配所有主机 * 支持通配符     
例: ansible "*" -m ping 

#匹配所有主机         
ansible 192.168.1.* -m ping 

#匹配IP地址以192.168.1开头的主机         
ansible “*app” -m ping # 匹配分组名 以 app结尾的主机 

#逻辑或:只要存在web或app组中的主机
例: ansible “web:app” -m ping         ansible “192.168.75.10:192.168.75.20” -m ping 

#逻辑与:同时在web组和db组中的主机     
ansible “web:&db” -m ping 

#逻辑非:在web组,但不在db组中的主机  
ansible ‘web:!db’ -m ping 

#综合逻辑:
ansible ‘web:db:&app:!ftp’ -m -ping 

#正则表达式:
ansible “websrvs:&dbsrvs” -m ping ansible “~(web|db).*\.testcan\.com” -m ping
Ansible执行命令过程:
  • 加载自己的配置文件
  • 默认/etc/ansible/ansible.cfg
  • 加载自己对应的模块文件,如command
  • 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户
  • $HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
  • 给文件+x执行
  • 执行并返回结果
  • 删除临时py文件,sleep 0退出
[root@localhost ~]# ansible --help
usage: ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD]
               [--become-user BECOME_USER] [-K] # 提示输入 sudo 密码,当不是 NOPASSWD 模式时使用
               [-i INVENTORY] # 指定hosts文件路径默认 default =/etc/ansible/hosts
               [--list-hosts] # 只打印有哪些主机会执行这个 playbook 文件:不是实际执行该 playbook
               [-l SUBSET] # 指定一个 pattern,对已经匹配的主机中再过滤一次
               [-P POLL_INTERVAL] #set the poll interval if using
               [-B SECONDS] [-o] # 压缩输出,摘要输出
               [-t TREE] # 日志输出到该目录,日志文件名会以主机名命名
               [-k] #提示输入 ssh 登录密码,当使用密码验证登录的时候用 
               [--private-key PRIVATE_KEY_FILE]  #私钥路径
               [-u REMOTE_USER] #连接的用户名,默认用 root,ansible.cfg 中可以配置
               [-c CONNECTION] #连接类型(default=smart)
               [-T TIMEOUT] # ssh 连接超时时间,默认 10 秒
               [--ssh-common-args SSH_COMMON_ARGS]
               [--sftp-extra-args SFTP_EXTRA_ARGS]
               [--scp-extra-args SCP_EXTRA_ARGS]
               [--ssh-extra-args SSH_EXTRA_ARGS] [-C] [--syntax-check] [-D]
               [-e EXTRA_VARS] [--vault-id VAULT_IDS]
               [--ask-vault-pass | --vault-password-file VAULT_PASSWORD_FILES]
               [-f FORKS]  #fork 多少个进程并发处理,默认 5
               [-M MODULE_PATH] #要执行的模块的路径,默认为/usr/share/ansible/ [--playbook-dir BASEDIR]
               [-a MODULE_ARGS]  #模块的参数
               [-m MODULE_NAME]  #要执行的模块,默认为 command 
               pattern

Define and run a single task 'playbook' against a set of hosts

positional arguments:
  pattern               host pattern

optional arguments:
  --ask-vault-pass      ask for vault password
  --list-hosts          outputs a list of matching hosts; does not execute
                        anything else
  --playbook-dir BASEDIR
                        Since this tool does not use playbooks, use this as a
                        substitute playbook directory.This sets the relative
                        path for many features including roles/ group_vars/
                        etc.
  --syntax-check        perform a syntax check on the playbook, but do not
                        execute it
  --vault-id VAULT_IDS  the vault identity to use
  --vault-password-file VAULT_PASSWORD_FILES
                        vault password file
  --version             show program's version number, config file location,
                        configured module search path, module location,
                        executable location and exit
  -B SECONDS, --background SECONDS
                        run asynchronously, failing after X seconds
                        (default=N/A)
  -C, --check           # 只是测试一下会改变什么内容,不会真正去执行
  -D, --diff            when changing (small) files and templates, show the
                        differences in those files; works great with --check
  -M MODULE_PATH, --module-path MODULE_PATH
                        prepend colon-separated path(s) to module library (def
                        ault=~/.ansible/plugins/modules:/usr/share/ansible/plu
                        gins/modules)
  -P POLL_INTERVAL, --poll POLL_INTERVAL
                        set the poll interval if using -B (default=15)
  -a MODULE_ARGS, --args MODULE_ARGS
                        module arguments
  -e EXTRA_VARS, --extra-vars EXTRA_VARS
                        set additional variables as key=value or YAML/JSON, if
                        filename prepend with @
  -f FORKS, --forks FORKS
                        specify number of parallel processes to use
                        (default=5)
  -h, --help            show this help message and exit
  -i INVENTORY, --inventory INVENTORY, --inventory-file INVENTORY
                        specify inventory host path or comma separated host
                        list. --inventory-file is deprecated
  -l SUBSET, --limit SUBSET
                        further limit selected hosts to an additional pattern
  -m MODULE_NAME, --module-name MODULE_NAME
                        module name to execute (default=command)
  -o, --one-line        condense output
  -t TREE, --tree TREE  log output to this directory
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable
                        connection debugging)

Privilege Escalation Options:
  control how and which user you become as on target hosts

  --become-method BECOME_METHOD
                        privilege escalation method to use (default=sudo), use
                        `ansible-doc -t become -l` to list valid choices.
  --become-user BECOME_USER
                        run operations as this user (default=root)
  -K, --ask-become-pass
                        ask for privilege escalation password
  -b, --become          run operations with become (does not imply password
                        prompting)

Connection Options:
  control as whom and how to connect to hosts

  --private-key PRIVATE_KEY_FILE, --key-file PRIVATE_KEY_FILE
                        use this file to authenticate the connection
  --scp-extra-args SCP_EXTRA_ARGS
                        specify extra arguments to pass to scp only (e.g. -l)
  --sftp-extra-args SFTP_EXTRA_ARGS
                        specify extra arguments to pass to sftp only (e.g. -f,
                        -l)
  --ssh-common-args SSH_COMMON_ARGS
                        specify common arguments to pass to sftp/scp/ssh (e.g.
                        ProxyCommand)
  --ssh-extra-args SSH_EXTRA_ARGS
                        specify extra arguments to pass to ssh only (e.g. -R)
  -T TIMEOUT, --timeout TIMEOUT
                        override the connection timeout in seconds
                        (default=10)
  -c CONNECTION, --connection CONNECTION
                        connection type to use (default=smart)
  -k, --ask-pass        ask for connection password
  -u REMOTE_USER, --user REMOTE_USER
                        connect as this user (default=None)

Some modules do not make sense in Ad-Hoc (include, meta, etc)
Ansible命令工具
ansible主程序,临时命令执行工具
ansible-doc 查看配置文档,模块功能查看工具
ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
ansible-playbook 定制自动化任务,编排剧本工具
ansible-pull 远程执行命令的工具
ansible-vault 文件加密工具
ansible-console 基于Console界面与用户交互的执行工具

4.2 ansible-doc

模块(也被称为 “task plugins” 或 “library plugins”)是在 Ansible 中实际在执行的.它们就 是在每个 playbook 任务中被执行的.你也可以仅仅通过 ‘ansible’ 命令来运行它们.

每个模块都能接收参数. 几乎所有的模块都接受键值对(key=value)参数,空格分隔.一些模块 不接收参数,只需在命令行输入相关的命令就能调用.

#查看模块说明
[root@localhost ~]# ansible-doc -s command

#列出所有已安装的模块文档
[root@localhost ~]# ansible-doc -l 

4.3 group模块(添加用户组)

#创建用户组
[root@localhost ~]# ansible all -m group -a "gid=3000 name=mygrp state=present system=no" 
[root@128 ~]# tail -1 /etc/group
mygrp:x:3000:

#移除用户组
[root@localhost ~]# ansible all -m group -a "gid=3000 name=mygrp state=absent system=no"

#创建nginx组(system=yes表示创建的组是系统组) 
ansible all -m group -a 'name=nginx system=yes gid=80' 

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

4.4 user模块(添加用户)

#添加用户testuser,指定uid、家目录、属组、指定用户的shell环境
[root@localhost ~]# ansible all -m user -a "uid=5000 name=testuser state=present home=/home/testuser groups=mygrp shell=/bin/tcsh"
[root@128 ~]# id testuser
uid=5000(testuser) gid=5000(testuser) groups=5000(testuser),3000(mygrp)
[root@128 ~]# tail -1 /etc/passwd
testuser:x:5000:5000::/home/testuser:/bin/tcsh

#添加一个系统用户: 
ansible all -m user -a 'name=sysuser1 system=yes home=/home/sysuser1' 

#删除用户(当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r)
ansible all -m user -a 'name=sysuser1 state=absent remove=yes' 

#添加一个nginx用户: 
ansible all -m user -a 'name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80 comment="nginx service"' 
[root@128 ~]# id nginx
uid=80(nginx) gid=80(nginx) groups=80(nginx),0(root),1(bin)

参数说明:
- 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

4.5 copy模块

#复制文件,指定权限为600(默认权限是644),如目标存在先备份(默认覆盖)
[root@localhost ~]# ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=600 backup=yes" 
[root@128 ~]# ls -lh /tmp/
total 4.0K
drwx------ 2 root root  40 Mar 27 18:01 ansible_command_payload_dIGLu7
-rw------- 1 root root 465 Mar 30 11:24 fstab.ansible

#复制目录
[root@localhost ~]# ansible all -m copy -a "src=/etc/pam.d/ dest=/tmp/" 

#写内容直接生成文件,默认不换行
[root@localhost ~]# ansible all -m copy -a "content='hello 20200330\n' dest=/tmp/hi.txt owner=testuser group=mygrp" 
[root@128 ~]# ll /tmp/hi.txt 
-rw-r--r-- 1 testuser mygrp 15 Mar 30 11:29 /tmp/hi.txt

参数说明:
- src    #被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制,用法类似于"rsync"
- content   #用于替换"src",可以直接指定文件的值
- dest    #必选项,将源文件复制到的远程主机的绝对路径
- backup   #当文件内容发生改变后,在覆盖之前把源文件备份,备份文件包含时间信息
- directory_mode    #递归设定目录的权限,默认为系统默认权限
- force    #当目标主机包含该文件,但内容不同时,设为"yes",表示强制覆盖;设为"no",表示目标主机的目标位置不存在该文件才复制。默认为"yes"
- others    #所有的 file 模块中的选项可以在这里使用

4.6 command模块

在远程主机上运行命令(无法执行管道)

[root@localhost ~]# ansible all -m command  -a "hostname"
192.168.75.128 | CHANGED | rc=0 >>
128
[root@localhost ~]# ansible all -m command  -a "echo testuser | passwd --stdin testuser"
192.168.75.128 | CHANGED | rc=0 >>
testuser | passwd --stdin testuser

相关说明:
- 使用 command 模块在远程主机中执行命令时,不会经过远程主机的 shell 处理。
- 在使用 command 模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如 "<" , ">", "|", ";" 和 "&"这些符号,如果你需要这些功能,可使用 shell 模块。
- 如果远程节点是 windows 操作系统,则需要使用 win_command 模块

4.7 shell模块

在远程主机shell进程下运行命令,支持shell特性,如管道、重定向等。与 command 模块不同的是,shell 模块在远程主机中执行命令时,会经过远程主机上的 /bin/sh 处理。

[root@localhost ~]# ansible all -m shell  -a "echo testuser | passwd --stdin testuser"
192.168.75.128 | CHANGED | rc=0 >>
Changing password for user testuser.
passwd: all authentication tokens updated successfully.

4.8 file模块

#创建文件,指定属主testuser,指定属组mygrp,权限755(touch如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间)
ansible all -m file -a 'name=/tmp/file1 owner=testuser group=mygrp mode=755 state=touch'
[root@128 ~]# ll /tmp | grep file1
-rwxr-xr-x 1 testuser mygrp    0 Mar 30 17:38 file1

#删除文件
ansible all -m file -a 'name=/tmp/file1 state=absent'

#创建目录(如果目录不存在,创建目录)
ansible all -m file -a "path=/var/tmp/hello.dir state=directory" 

#删除目录
ansible all -m file -a "path=/var/tmp/hello.dir state=absent"

#创建软链接
ansible all -m file -a "src=/tmp/hi.txt path=/var/tmp/hi.link state=link"
[root@128 ~]# ll /var/tmp/hi.link 
lrwxrwxrwx 1 root root 11 Mar 30 14:55 /var/tmp/hi.link -> /tmp/hi.txt

ansible all -m file -a 'src=/etc/fstab dest=/tmp/fstab.link state=link'
[root@128 ~]# ll /tmp/fstab.link
lrwxrwxrwx 1 root root 10 Mar 30 17:32 /tmp/fstab.link -> /etc/fstab

#删除软链接
ansible all -m file -a 'dest=/tmp/fstab.link state=absent'

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

4.9 cron模块

设置定时任务,支持时间:minute,hour,day,month,weekday

#每周1,3,5,每3分钟执行,任务名称为updatentp
ansible all -m cron -a "minute=* weekday=1,3,5 job='/usr/sbin/update ntp1.aliyun.com &> /dev/null' name=updatentp" 
[root@128 ~]# crontab -l
#Ansible: updatentp
* * * * 1,3,5 /usr/sbin/update ntp1.aliyun.com &> /dev/null

#注释cronname=updatentp的计划任务: 
ansible all -m cron -a "disabled=true job='/usr/sbin/update ntp1.aliyun.com &> /dev/null' name=updatentp"

#给cronname=updatentp的计划任务去掉注释
ansible all -m cron -a "disabled=false job='/usr/sbin/update ntp1.aliyun.com &> /dev/null' name=updatentp" 

#删除定时任务
ansible all -m cron -a 'state=absent name=updatentp' 

参数说明:
- 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 # 以哪个用户的身份执行

4.10 yum模块

使用yum安装程序包,安装多个包用逗号隔开,前提是已配置好yum源

# ansible-doc -s yum  #查看yum模块相关使用说明

# 安装ntp模块
ansible all -m yum -a "name=ntp state=installed"  
[root@128 ~]# rpm -q ntp
ntp-4.2.6p5-29.el7.centos.x86_64
[root@128 ~]# ps -ef | grep ntp
ntp       16810      1  0 15:21 ?        00:00:00 /usr/sbin/ntpd -untp:ntp -g
root      16824   9683  0 15:21 pts/1    00:00:00 grep --color=autontp

# 卸载vsftpd包: 
ansible all -m yum -a 'name=vsftpd state=removed'
# 安装已下载好的rpm包:
ansible all -m yum -a 'name=/data/zlib-devel-1.2.7-18.el7.x86_64.rpm' 
#更新缓存: 
ansible srv -m yum -a 'update_cache=yes' 
#更新缓存同时安装dstat包 
ansible srv -m yum -a 'name=dstat update_cache=yes'

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

4.11 service模块

#启动服务
ansible all -m service -a "name=ntpd state=started"

#停止服务
ansible all -m service -a "name=ntpd state=stopped"

#重新加载httpd服务: 
ansible srv -m service -a 'name=httpd state=reloaded’
#重启httpd服务: 
ansible srv -m service -a 'name=httpd state=restarted’
#开启ftp服务,同时设置开机自动启动: 
ansible srv -m service -a 'name=vsftpd state=started enabled=yes’ 

参数说明:
- runlevel:开机启动的级别,一般不用指定
- sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
- arguments #命令行提供额外的参数
- enabled #设置开机启动。
- name= #服务名称
- state #有四种状态,分别为:started--->启动服务, stopped--->停止服务, restarted--->重启服务,reloaded--->重载配置

4.12 script模块

在远程主机上执行 ansible 管理主机上的脚本。脚本一直存在于 ansible 管理主机本地,不需要手动拷贝到远程主机后再执行。

[root@localhost ~]# cat /tmp/test.sh
#!/bin/bash
echo "ansible script test" > /tmp/ansible.txt
[root@localhost ~]# ansible all -m script -a "/tmp/test.sh"
192.168.75.128 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.75.128 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 192.168.75.128 closed."
    ], 
    "stdout": "", 
    "stdout_lines": []
}

4.13 template模块

基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式作为文件模版,进行文档内变量的替换的模块。它的每次使用都会被ansible标记为”changed”状态。)

参数说明:
- backup: 如果原目标文件存在,则先备份目标文件
- src:在ansible控制器上的Jinja2格式化模板的路径。 这可以是相对或绝对的路径。
- dest:将模板渲染到远程机器上的位置。
- force:是否强制覆盖,默认为yes
- owner:目标文件属主
- group:目标文件属组
- mode:目标文件的权限模式,模式可以被指定为符号模式(例如,u + rwx或u = rw,g = r,o = r)。

4.14 setup模块

收集指定服务器的信息,每个被管理节点在接收并运行管理命令之前,会将自己主机相关信息,如操作系统版本、IP地址等报告给远程的ansbile主机。在playbooks里经常会用到的一个参数gather_facts就与该模块相关。

[root@localhost ~]# ansible all -m setup -a "filter=ansible_os_family"
192.168.75.128 | SUCCESS => {
    "ansible_facts": {
        "ansible_os_family": "RedHat", 
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false
}

参数说明:
ansible_all_ipv4_addresses:仅显示ipv4的信息
ansible_devices:仅显示磁盘设备信息
ansible_distribution:显示是什么系统,例:centos,suse等
ansible_distribution_major_version:显示是系统主版本
ansible_distribution_version:仅显示系统版本
ansible_machine:显示系统类型,例:32位,还是64位
ansible_eth0:仅显示eth0的信息
ansible_hostname:仅显示主机名
ansible_kernel:仅显示内核版本
ansible_lvm:显示lvm相关信息
ansible_memtotal_mb:显示系统总内存
ansible_memfree_mb:显示可用系统内存
ansible_memory_mb:详细显示内存情况
ansible_swaptotal_mb:显示总的swap内存
ansible_swapfree_mb:显示swap内存的可用内存
ansible_mounts:显示系统磁盘挂载情况
ansible_processor:显示cpu个数(具体显示每个cpu的型号)
ansible_processor_vcpus:显示cpu个数(只显示总的个数)
ansible_python_version:显示python版本

4.15 fetch模块

从远程某主机获取(复制)文件到本地

#打包 /var/log 下所有日志文件并远程抓取
ansible all -m shell -a 'tar Jcf log.tar.xz /var/log/*.log'
ansible all -m fetch -a 'src=/root/log.tar.xz dest=/tmp'

参数说明:
- src:远程系统上要获取的文件。 这必须是一个文件,而不是一个目录。 后续版本可能会支持递归提取。
-dest:保存文件的目录。 例如,如果dest目录是/backup,在主机host.example.com上命名为/ etc/profile的src文件将被保存到/backup/host.example.com/etc/profile。
- flat:允许您覆盖将目标文件添加到主机名/ path / to / file的默认行为。

4.16 apt模块

# 在安装foo软件包前更新然后安装foo 
ansible all -m apt -a 'name=foo update_cache=yes'
# 移除foo软件包
ansible all -m apt -a 'name=foo state=absent'
# 安装foo软件包
ansible all -m apt -a 'name=foo state=present'
# 安装foo 1.0软件包
ansible all -m apt -a 'name=foo=1.00 state=present'
# 安装nginx最新的名字为squeeze-backport发布包,并且安装前执行更新
ansible all -m apt -a 'name=nginx state=latest default_release=squeeze-backports update_cache=yes'
# 只下载openjdk-6-jdk最新的软件包,不安装
ansible all -m apt -a 'name=openjdk-6-jdk state=latest install_recommends=no'
# 安装所有软件包到最新版本
ansible all -m apt -a 'upgrade=dist'
# 更新apt-get的list
ansible all -m apt -a 'update_cache=yes'
# 3600秒后停止update_cache
ansible all -m apt -a 'update_cache=yes cache_valid_time=3600'
# 安装远程节点上的/tmp/mypackage.deb软件包
ansible all -m apt -a 'deb=/tmp/mypackage.deb'

参数说明:
- deb: 用于安装远程机器上的.deb后缀的软件包(optional)
- install_recommends:这个参数可以控制远程电脑上是否只是下载软件包,还是下载后安装,默认参数为true,设置为false的时候只下载软件包,不安装
- update_cache: 当这个参数为yes的时候等于apt-get update(optional)
- name: apt要下载的软件包名字,支持name=git=1.6 这种制定版本的模式
- state:状态(present,absent,latest),表示是安装还卸载
   present:默认的,表示为安装
   lastest: 安装为最新的版本
   absent:表示删除

你可能感兴趣的:(自动化)