• ansible(1)


    一、初识ansible

    1、准备工作:

      准备四台干净的虚拟机,如下:

      192.168.133.129(主控节点,下面三个为被控节点)

      192.168.133.130

      192.168.133.131

      192.168.133.132

    2、安装ansible(只有主控节点安装,即地址为192.168.133.129的服务器安装)
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo          # 下载epel源,因为ansible需要从epel源下载
    yum install -y ansible         # 安装ansible
    

      查看ansible安装后生成的文件:

    rpm -ql ansible |more
    /etc/ansible
    /etc/ansible/ansible.cfg            # 配置文件
    /etc/ansible/hosts                  # 主要文件
    /etc/ansible/roles
    

      hosts文件详解:

    # This is the default ansible 'hosts' file.
    #
    # It should live in /etc/ansible/hosts
    #
    #   - Comments begin with the '#' character # 用#来表示注释
    #   - Blank lines are ignored # 空白行被忽略
    #   - Groups of hosts are delimited by [header] elements # 主机组 需要在【】下面
    #   - You can enter hostnames or ip addresses #可以写主机名或者ip地址
    #   - A hostname/ip can be a member of multiple groups # 一台主机可以在多个组里面
    # ......
    # www[001:006].example.com   # 表示从www001到www006的机器
    # ......
    3、ansible与saltstack对比

      相同点:

        都是为了同时在多台机器上执行相同的命令;

        都是python开发;

      不同点:

        agent(salt 控制节点需要安装salt-master,被控节点需要安装salt-minion,而ansible不需要,它通过ssh来连接并控制被控节点)

        配置(salt配置麻烦,ansible基本不用配置)

        学习路线(salt比较陡峭,ansible比较平缓)

        第三方工具(salt比较少)

        开源社区的对接(salt比较少)

        现有用户(salt还是比ansible少一些)

        二次开发扩展的能力(ansible比较差,尤其是2.0以后)

        大规模并发(200以内一样,200以上salt会好一些,当然我们也可以对ansible做一些配置使其在200以上追上salt)

        Windows的支持(salt会好很多)

    4、ansible 连接并控制被控节点

      ssh 的认证方式

        - 密码连接:即 ssh root@192.168.xx.xx,回车然后输入密码

        - 秘钥连接

      ssh 秘钥登录方式如下:

    ssh-keygen               # 用来生成ssh的密钥对,一路回车
    ssh-copy-id 192.168.133.130                   # 复制秘钥到远程主机,回车后输入"yes",再回车输入远程主机登录密码
    
    ssh 192.168.133.130             # 然后就可以通过此命令登录远程主机了
    5、ansible的命令格式

      我们之前ping命令可以测试主机之间是否相通,ansible也为我们提供了一个ping模块,先来看一下ansible都为我们提供了哪些命令,如下:

    ansible -h         # 查看ansible的命令格式,为 ansible <host-pattern> [options] ,部分命令格式如下:
    -a MODULE_ARGS, --args=MODULE_ARGS            # 模块参数
    -C, --check                                   # 检查,测试
    -f FORKS, --forks=FORKS                       # 用来做高并发的,指定一次执行的机器
    --list-hosts                                  # 列出主机列表
    -m MODULE_NAME                                # 模块名称
    --syntax-check                                # 语法检查
    -k                                            # 输入密码方式连接
    -v                                            # 输出详细信息
    

      使用ansible为我们提供的ping模块:

      这是因为我们没有配置ansible的配置文件,提示主机列表为空,我们修改ansible的配置文件 /etc/ansible/hosts 如下:

      此时,再次执行ansible的ping命令,结果如下:

      当我们在hosts文件中再加入主机192.168.133.131,然后执行ping命令,结果如下,思考这是为什么?

      出现上面结果表示我们没有复制秘钥到主机192.168.133.131,因此,要安装以上方式复制秘钥(ssh-copy-id 192.168.133.131),也可以通过密码的方式登录(每次都要输密码,较麻烦且不安全),如下:

     

      按照上面方式,再将秘钥复制到被控节点192.168.133.132,且将该主机地址写入ansible的hosts文件。

      上面我们知道如何使用ansible的ping模块测试某一台被控节点,那么如何执行一条命令测试所有被控节点,如下:

       也可以测试其中两台,如下:

    6、主机分组

      实际开发中,我们可以按照功能将以上被控节点分组,将分组信息写入ansible的hosts文件,如下:

      接下来就可以对组进行操作了,如下:

      多个组的操作,并集关系,如下:

      多个组的操作,交集的关系,如下:

      多个组的操作,差集的关系,如下:

      上面我们知道ansible有不同模块,还有模块参数,那么如何查看模块的参数,如下命令可查看:

    ansible-doc -h             # 查看模块的帮助信息,查看结果如下:
    ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
    -j                    # 以json的方式返回ansible的所有模块
    -l, --list            # 列出所有的ansible的模块
    -s                    # 以片段式显示ansible的帮助信息

      注意:系统自带的ping走的是ICMP协议,而ansible的ping不是ICMP协议,如下可知:

    7、命令相关模块(command,shell,script)

    7.1、command模块

       ansible的默认模块就是命令(command)模块,使用命令ansible -h 可查看,如下:

      查看command模块的帮助信息,如下:

      示例:

    [root@localhost ~]# ansible web -a 'ls /'              # 在web组下的主机上执行查看根目录下文件的命令
    [root@localhost ~]# ansible web -a 'pwd'              # 在web组下的主机上执行查看当前目录的命令
    [root@localhost ~]# ansible web -a 'chdir=/tmp pwd'           # 切换目录执行命令,使用场景是编译安装时使用
    [root@localhost ~]# ansible web -a 'creates=/tmp pwd'       # 用来判断/tmp目录是否存在,存在就不执行操作
    [root@localhost ~]# ansible web -a 'creates=/data pwd'      # 因为data不存在,所有才会执行pwd命令
    [root@localhost ~]# ansible web -a 'removes=/tmp pwd'     # 用来判断tmp目录是否存在,存在就执行操作
    [root@localhost ~]# ansible web -a 'removes=/data pwd'     # 因为data不存在,所有才不会执行
    [root@localhost ~]# ansible web -a 'useradd liu'             # 为 web 组内的主机添加用户 liu

      去web组下的主机上查看用户liu是否创建成功:

    [root@localhost ~]# tail -1 /etc/passwd      
    liu:x:1000:1000::/home/liu:/bin/bash
    [root@localhost ~]# tail -1 /etc/shadow
    liu:!!:17946:0:99999:7:::
    [root@localhost ~]# id liu
    uid=1000(liu) gid=1000(liu) groups=1000(liu)
    [root@localhost ~]# echo '123' | passwd --stdin liu # 为新创建的用户liu设置密码

      既然命令 echo '123' | passwd --stdin liu 可以为用户设置密码,那么我们能否通过ansible为web组的主机上新建用户批量设置密码,如下:

      结果是行不通的,查看说明找原因,如下:

    7.2、shell模块

      首先查看shell模块的帮助文档,如下:

     

      示例一:使用shell模块解决上面提到的利用ansible批量修改web组下主机上用户liu的密码,如下:

      示例二:批量在远程主机上执行脚本

    [root@localhost ~]# vi a.sh          # 在当前目录下创建shell脚本a.sh,写入如下内容
    [root@localhost ~]# cat a.sh
    #!/bin/bash
    mkdir /movies                         # 在根目录下创建目录movies
    [root@localhost ~]# bash a.sh     # 执行脚本
    [root@localhost ~]# ls /               # 查看是否生成了文件
    bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
    boot  etc  lib   media  opt  root  sbin  sys  usr  movies
    # 以上不通过ansible,直接在本地执行脚本的方式
    ansible 192.168.133.130 -m shell -a 'bash a.sh'   # 执行远程文件方式一
    ansible 192.168.133.130 -m shell -a '/root/a.sh'  # 执行远程文件方式二,文件必须有执行权限(添加执行权限命令为 chmod +x a.sh)
    ansible 192.168.133.130 -m shell -a '/root/a.py'  # 执行远端的Python脚本,文件也必须有执行权限
    

    7.3、script模块

      上面学到的shell脚本是远端有脚本,我们通过ansible去执行远端的脚本,但是如果远端没有脚本该怎么办呢?接下来学习script脚本。

      查看script模块的帮助信息,如下:

      示例:

    ansible web -m script -a '/root/m.sh'     # 执行管控机上的文件
    ansible web -m script -a 'removes=/root/a.sh /root/m.sh'       # 用来判断被管控机上是不是存在文件/root/a.sh,如果存在,就执行管控机上的文件/root/m.sh,不存在就不执行
    ansible web -m script -a 'creates=/root/a.sh /root/m.sh'       # 用来判断被管控机上是不是存在文件/root/a.sh,如果存在,就不执行管控机上的文件/root/m.sh,反之就执行
    
    8、文件相关模块(copy,file,fetch)

    8.1、copy模块

    [root@localhost ~]# ansible-doc -s copy      # 查看copy模块的帮助文档,有如下参数:
    backup           # 备份,以时间戳结尾
    dest             # 目的地址
    group            # 文件的属组
    mode             # 文件的权限 r-4 w-2 x-1
    owner            # 文件的属主
    src              # 源文件
    

      示例:

    ansible db -m copy -a 'src=/root/m.sh dest=/tmp/a.sh'    # 复制本地文件的到远程主机,注意:复制到远程主机后权限发生了改变,即文件的属主、属组、同组用户都没有了x权限,这是linux的一个安全机制!
    ansible db -m copy -a 'src=/root/m.sh dest=/tmp/a.sh mode=755'    # 修改文件在远程机的权限
    ansible web -m copy -a 'src=/root/m.sh dest=/tmp/a.sh mode=755 owner=liu'   # 修改文件在远程机的属主
    ansible web -m copy -a 'src=/etc/init.d dest=/tmp/ mode=755 owner=liu' # 复制本地目录到远程主机,如果改变文件的属性,则文件夹内的文件也会被改变
    ansible web -m copy -a 'src=/etc/init.d/ dest=/tmp/ mode=755 owner=liu' # 复制本地目录内的所有文件到远程主机
    ansible web -m copy -a "content='大弦嘈嘈如急雨,小弦切切如私语
    ' dest=/tmp/b.txt" # 直接将文本内容注入到远程主机的文件中

    8.2、file模块

    [root@localhost ~]# ansible-doc -s file     # 查看file模块的帮助文档
    

      补充知识点:

    inode     # 硬盘的地址
    id     # 获取到的是内存的地址
    ln -s a.py b.py     # 为a.py创建软连接
    ln  a.py c.py       # 为a.py创建硬链接
    # 当 源文件变化时,软连接和硬链接文件都会跟着变化,即a.py变化时,b.py和c.py都会跟着变化
    ansible db -m file -a 'path=/lzmly2  state=directory' # 在远程机器上创建文件夹
    ansible db -m file -a 'path=/root/q.txt  state=touch' # 用来在远程机器上创建文件
    ansible db -m file -a 'path=/tmp/f src=/etc/fstab state=link' # 创建软连接src是源地址,path是目标地址
    ansible db -m file -a 'path=/tmp/f state=absent' # 用来删除文件或者文件夹

    8.3、fetch模块

      查看fetch模块的帮助文档,如下图:

     

      示例:

    ansible web -m fetch -a 'src=/var/log/cron dest=/tmp'   # 下载被控节点的文件,每台机器创建一个文件夹,并保留原来的目录结构
    

      

  • 相关阅读:
    linux 邮件服务器
    Nginx学习之keepalive
    explain 和 desc 详解
    mysql 常用语句
    loop设备及losetup命令
    cryptsetup文件系统加密
    ftp主动与被动模式详解
    大型网站关键技术
    大访问量网站架构设计
    Mysql 的事务隔离级别
  • 原文地址:https://www.cnblogs.com/li-li/p/10399299.html
Copyright © 2020-2023  润新知