1、ansible概述

        Ansible是一款基于Python开发的自动化运维工具,它不需要安装客户端,使用SSH进行通信,同时可支持系统账号认证或秘钥认证,也支持windows客户端。

Ansible主要组成部分:

  (1)ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件;

  (2)INVENTORY:Ansible管理主机的清单;

  (3)MODULES:Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义;

  (4)PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用。

  (5)API:供第三方程序调用的应用程序编程接口;

  (6)ANSIBLE:ansible命令工具,其为核心执行工具;

2、ansible的安装

(1)yum方式安装

#需要安装epel仓库
yum install epel-release
#安装ansible
yum install ansible

(2)使用pip方式安装(需要python2.7及以上版本支持)

#需要安装python-pip程序包及python-devel
yum install python-pip python-devel -y
#安装需要依赖的软件
yum install gcc glibc-devel zlib-devel rpm-build openssl-devel -y
#升级PIP至最新版本
pip install --upgrade pip
#安装ansible
pip install ansisble --upgrade

(3)源码方式安装

#安装git客户端
yum install git -y
#拉取GitHub上的源码包文件
git clone git://github.com/ansible/ansible.git --recursive
#执行env-setup脚本,安装ansible
cd ansible
source ./hacking/env-setup

(4)验证安装:

ansible --version

3、ansible的配置文件

        Ansible安装完成后,默认的配置文件存放在’/etc/ansible/’目录下,’/etc/ansible’目录的下的文件有ansible.cfg,hosts及目录roles,ansible.cfg为ansible默认的配置文件,使用的过程中,大多数情况下使用默认的配置文件即可,特殊情况下可根据自己需求修改配置文件。Hosts为ansible远程管理的主机及主机组配置文件。

4、ansible配置管理的主机及主机组

        Ansible安装完成后,它与客户端的通信时通过ssh通信的,与客户端的认证方式有密码认证及公钥私钥认证,默认使用的是基于公私钥认证,为了安装考虑,建议使用默认的公私钥认证。

(1)为客户端分发公钥

#在ansible服务端生成秘钥对
ssh-keygen -t rsa
#为客户端分发公钥,主机多时可通过脚本分发
ssh-copy-id -i /root/.ssh/id_rsa.pub "user"@host

(2)定义主机和组

        Ansible对管理的主机组的配置文件为 /etc/ansible/hosts,对于功能相同的主机可以存放于同一组中,方便配置管理。也可将一个主机放在多个组中,若目标主机使用了非默认的SSH端口,可以在主机名称后使用冒号加端口来标明。

#配置一个test组,下面有三台主机
[test]
10.0.0.13
10.0.0.14
10.0.0.8

在定义主机及组时,也可为主机及组定义主机及组变量

#定义主机,并定义主机变量
[dayi123]
10.0.0.8 servername=nginx01 serverport=8011
#定义组变量,为上面定义的组test定义变量
[test:vars]
serverport=80

  在inventory中,组还可以包含其他的组,并且可以向组中的主机指定变量,而这些变量只能在ansible-playbook中使用。

5、Ansible系列命令介绍

        Ansible安装完成后,输入ansible按两次tab键,会补全所有ansible字母开头的命令,主要有七项。

(1)ansible命令的用法:

    Ansible命令是日常工作中最长使用的命令,主要的使用场景为非固化需求,临时一次性的操作。

    Ansible命令的使用语法格式为:

        ansible <host-pattern> [options]

    常用的参数选项有:

        -m  指定执行时使用的模块

        -u  指定远程主机运行此命令的用户

        -s  相当于sudo

        -S  使用sudo

        Ansible返回结果一般会使用红色,橘色,橘黄色显示,红色表示执行过程异常,会终止剩余任务的执行,绿色和橘黄色表示执行过程没有异常,但橘黄色表示命令执行结束后目标有状态变化,绿色表示命令执行结束后目标没有状态变化。

(2)ansible-galaxy

  通过ansible-galaxy上传下载Roles(Roles下载地址为:https://galaxy.ansible.com),

        ansible-galaxy命令使用格式:

            ansible-galaxy [init|info|install|list|remove] [--help] [options]

  也可使用关键字查询roles:ansible-galaxy nginx

(3)ansible-pull

        Ansible-pull的作用为推送命令至远程,效率无限提升,对运维要求较高

(4)ansible-doc

        Ansible-doc是ansible模块的文档说明,对每个模块都有详细的用法说明及案例,功能和linux的man命令类似

        Ansible-doc用法:ansible-doc [options] [module]

#列出所有的模块
ansible-doc -l
#查看摸模块的用法
ansible-doc [module]
#查看ping命令的用法
ansible-doc ping

(5)ansible-playbook

        Ansible-playbook工作机制是通过读取预先编写的playbook文件实现批量管理,实现的功能与ansible命令相似,ansible-playbook执行时后跟yml格式的playbook文件,执行事先编好的任务集。

使用方法如:ansible-playbook playbook.yml

(6)ansible-vault

        Ansible-vault主要用于配置文件加密

        用法:

            ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help] [options] file_name

(7)ansible-console

        Ansible-console是ansible为用户提供的一款交互式工具,用户可在ansible-console虚拟出的终端上使用ansible内置的各种命令。所有的操作与shell类似,并支持tab补全。

6、ansible命令常用模块的使用

        ansible2.3中的模块大概有一千多个,可通过命令”ansible-doc -l”查看有那些模块,查看模块时也可以根据关键字搜索某个具体的模块名称。可通过”ansible-doc [modulename]”查看具体具体模块的用法。

(1)ping模块

  检查摸个主机或者某个组中的主机是否联通,如果联通则返回”pong”

#测试某个主机是否联通
[root@ansible ~]# ansible 10.0.0.14 -m ping 
#测试某个组的主机是否联通
[root@ansible ~]# ansible test -m ping     
#测试所有的主机是否联通
[root@ansible ~]# ansible all -m ping      
10.0.0.13 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

(2)command模块

        command模块用于在被管理的客户端执行命令,但是command模块不支持管道符号”|”及”>”,”<”,”;”,”&”等一些特殊符号。

        选项:     

            reates 一个文件名,当该文件存在,则该命令不执行

            free_form 要执行的linux指令

            chdir 在执行指令之前,先切换到该目录

            removes 一个文件名,当该文件不存在,则该选项不执行

            executable 切换shell来执行指令,该执行路径必须是一个绝对路径

#查看磁盘剩余空间
[root@ansible ~]# ansible 10.0.0.13 -m command -a "df -h"      
10.0.0.13 | SUCCESS | rc=0 >>
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/vg_server1-lv_root
                      37G  1.1G   34G   3% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             477M   33M  419M   8% /boot

(3)shell模块

        shell模块同command模块功能基本一样,但shell模块支持特殊符号。

  选项(shell模块同command模块基本相同):

#查看是否存在用户”dayi123”,将信息保存到”/tmp/userinfo”中
[root@ansible ~]# ansible "*" -m shell -a "grep "dayi123" /etc/passwd >>/tmp/userinfo"
#查看”/tmp/userinfo”
[root@ansible ~]# ansible "*" -m shell -a "cat /tmp/userinfo"
#修改主机10.0.0.13及10.0.0.14用户”dayi123”的密码
[root@ansible ~]# ansible 10.0.0.13:10.0.0.14 -m shell -a "echo "dayi123" |passwd --stdin dayi123"

(4)copy模块

        Copy模块用于将当前主机的文件及目录拷贝到远程主机上。

        选项:

          backup 在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no

            content 用于替代“src”,可以直接设定指定文件的值

            dest 必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录

            directory_mode 递归设定目录的权限,默认为系统默认权限

            force 如果目标主机包含该文件,但内容不同,如果设置为”yes”,则强制覆盖,如果为”no”,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes

            src 被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用”/”来结尾,则只复制目录里的内容,如果没有使用”/”来结尾,则包含目录在内的整个内容全部复制。

            mode 文件或目录拷贝完成后设置权限。

            owner 文件拷贝完成后设置文件的属主

            group 文件拷贝完成后设置文件的属组

#拷贝目录
 [root@ansible ~]# ansible test -m copy -a "src=/etc/cron.daily/ dest=/tmp/"
#拷贝文件
[root@ansible ~]# ansible test -m copy -a "src=jdk-8u144-linux-x64.rpm dest=/tmp/jdk.rpm"
#拷贝时如果目标目录文件存在则备份并在拷贝完成后修改文件属主权限
[root@ansible ~]# ansible "all" -m copy -a "src=/root/jdk-8u45-linux-x64.rpm dest=/home/dayi123/ mode=644 owner=dayi123 backup=yes"

(5)cron模块

        cron模块主要用于创建计划任务

        常用选项:

            minute=/ hour=/ day=/ month=/ weekday=/ 某个值不写,默认就是*

            name 必选项,任务的名称

            job 执行的任务,要加引号

            state 有两个选项分别为present(创建任务),absent(删除任务)

#创建时间同步的定时任务
[root@ansible ~]# ansible "all" -m cron -a "minute=1 hour=*/2 job='/usr/bin/ntpdate 10.0.0.30' name=ntpdate"
#删除定时任务
[root@ansible ~]# ansible "all" -m cron -a "name=ntpdate state=absent"

(6)fetch模块

        fetch模块它用于从远程机器获取文件,并将其本地存储在由主机名组织的文件树中。

        选项:

            src 远程系统上要获取的文件。

            dest 保存文件的目录

#获取远程主机上的hosts文件
[root@ansible ~]# ansible test2 -m fetch -a "src=/etc/hosts dest=/tmp"
10.0.0.13 | SUCCESS => {
    "changed": true,
    "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
    "dest": "/tmp/10.0.0.13/etc/hosts",
    "md5sum": "54fb6627dbaa37721048e4549db3224d",
    "remote_checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
    "remote_md5sum": null
}

(7) file模块

        file模块主要用于远程主机上的文件操作

        选项:

            force 需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no

            group 定义文件/目录的属组

            mode 定义文件/目录的权限

            owner 定义文件/目录的属主

            path 定义文件/目录的路径

            recurse 递归的设置文件的属性,只对目录有效

            src 要被链接的源文件的路径,只应用于state=link的情况

            dest 被链接到的路径,只应用于state=link的情况

        state:

           directory 如果目录不存在,创建目录

           file 即使文件不存在,也不会被创建

           link 创建软链接

           hard 创建硬链接

           touch 如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

            absent 删除目录、文件或者取消链接文件

#修改文件权限
[root@ansible ~]# ansible all -m file -a "path=/home/dayi123/jdk-8u45-linux-x64.rpm owner=dayi123"
#创建软连接
[root@ansible ~]# ansible all -m file -a "src=/etc/hosts dest=/hosts state=link"  
#如果目录不存在,则创建目录
[root@ansible ~]# ansible all -m file -a "path=/home/dayi123/tool state=directory"

(8)hostname模块

        Hostname模块用于批量修改主机名,修改后的主机名是永久生性的,重启后依然生效。

#修改单台主机名
[root@ansible ~]# ansible 10.0.0.13 -m hostname -a "name=ansible-client01"
10.0.0.13 | SUCCESS => {
    "ansible_facts": {
        "ansible_domain": "",
        "ansible_fqdn": "ansible-client01",
        "ansible_hostname": "ansible-client01",
        "ansible_nodename": "ansible-client01"
    },
    "changed": true,
    "name": "ansible-client01"
}

修改多态主机的名称时,需要在/etc/ansible/hosts中定义主机名的变量,然后在利用hostname模块修改。

在/etc/ansible/hosts中定义关于主机名的变量:

[test]
10.0.0.13:222  servername=ansible-client01
10.0.0.14  servername=ansible-client02
10.0.0.8   servername=ansible-server

批量修改主机名:

[root@ansible ~]# ansible test -m hostname -a "name={{ servername }}"         
10.0.0.8 | SUCCESS => {
    "ansible_facts": {
        "ansible_domain": "",
        "ansible_fqdn": "ansible-server",
        "ansible_hostname": "ansible-server",
        "ansible_nodename": "ansible-server"
    },
    "changed": true,
    "name": "ansible-server"
}

(9)script模块

        Script脚本模块用于将本地的脚本复制到远程主机并在远程主机执行。

        选项:

            creates:文件名,如果这个文件存在,则该命令不执行

            free_form:本地脚本路径

            removes:文件名,这个文件不存在,则该命令不执行

#去远程主机执行脚本
[root@ansible-server ~]# ansible test -m script -a "test.sh"
10.0.0.13 | SUCCESS => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to 10.0.0.13 closed.\r\n",
    "stdout": "######################\r\n###  hello linux   ###\r\n######################\r\nMon Apr 9 03:43:48 CST 2018\r\n",
    "stdout_lines": [
        "######################",
        "###  hello linux   ###",
        "######################",
        "Mon Apr 9 03:43:48 CST 2018"
    ]
}
#当远程主机存在指定的文件时,脚本不执行
[root@ansible-server ~]# ansible test -m script -a "test.sh creates=/tmp/test.log"
10.0.0.13| SKIPPED

(10)yum模块

        yum模块用于管理远程主机上的rpm软件包

        选项:

            config_file 指定yum配置文件

            disable_gpg_check 关闭gpg_check

            disablerepo 不启用某个源

            enablerepo 启用某个源

            name 指明要安装的程序包,可以带上版本号,可以写为rpm包的路径或url地址。

            state 对软件进行的操作,是安装还是卸载,值为:

          present 默认的,表示安装

          lastest 安装为最新的版本

          absent 表示删除

#在所有的远程主机上安装ntpdate
[root@ansible-server ~]# ansible test -m yum -a "name=ntpdate state=present"

(11)Service模块

        servicer模块主要用于对服务的管理

        选项:

            arguments 给命令行提供一些选项

            enabled 是否开机启动 yes|no, 要求状态(state)和启用(enabled)中至少有一个。

            name 必选项,服务名称

            runlevel 运行级别

            sleep 如果执行了restarted,在则stop和start之间沉睡几秒钟

            state 对当前服务执行的动作,值有started,stopped,restarted,reloaded

#启动httpd服务
[root@ansible-server ~]# ansible 10.0.0.8 -m service -a 'name=httpd state=started'
#设置httpd服务开机自启动
[root@ansible-server ~]# ansible test -m service -a 'name=httpd enabled=yes'

(12)group模块

        group模块用于管理用户组

        选项:

            gid 指定组id。

            name 指定组名。

            state 对组的操作是创建还是删除(present,absent)

            system 表示创建的组是否为系统组,默认为”no”,”yes”则表示创建的组为系统组。

#创建用户组
[root@ansible-server ~]# ansible test -m group -a "name=test123 gid=1000"

(13)user模块

        User模块用户管理远程主机上的用户

        选项:

            name 指定用户名

            group 设置用户的属组

            groups 设置用户的附加组

            home 设置用户的家目录

            shell 设置用户的shell

            uid 设置用户的uid

            expires 设置用户的过期时间(时间格式为时间戳格式)

            password 设定用户的密码(密码为加密后的密码)

            system 当创建用户时,值为”yes”时表示创建系统用户,默认值为”no”

            state 值为”present”表示创建用户,值为”absent”时表示删除用户

            remove 用于删除用户,结合”state=absent”使用

            createhome 是否创建用户家目录,值为”yes”时表示创建用户家目录,值为”no”时表示不创建用户家目录,默认值为”yes”

            generate_ssh_key 是否为用户生成SSH密钥。不会覆盖现有的SSH密钥。

            ssh_key_bits 可选择指定要创建的SSH密钥中的位数。

            ssh_key_passphrase 设置SSH密钥的密码。 如果没有提供密码,SSH密钥将默认没有密码。

            ssh_key_file 指定SSH密钥文件名, 如果这是一个相对的文件名,那么它将是相对于用户的主目录。

            ssh_key_type 指定要生成的SSH密钥的类型, 可用的SSH密钥类型将取决于目标主机上的实现。

#创建用户
[root@ansible-server ~]# ansible test -m user -a "name=dayi1234 shell=/bin/bash groups=test123,dayi123"
#将指定的时间转化为时间戳格式
[root@ansible-server ~]# date -d '2019-03-01 23:59:59' +%s           
1551502799
#设置用户到期时间
[root@ansible-server ~]# ansible test -m user -a "name=dayi123 expires=1551502799"
#删除用户
[root@ansible-server ~]# ansible test -m user -a "name=dayi1234 state=absent remove=yes"