一、初识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='大弦嘈嘈如急雨,小弦切切如私语\n' 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'   # 下载被控节点的文件,每台机器创建一个文件夹,并保留原来的目录结构

  

ansible(1)的更多相关文章

  1. 进击的 Ansible(二):如何快速搞定生产环境 Ansible 项目布局?

    Tips:与前文 <进击的 Ansible(一):Ansible 快速入门> 一样,本文使用的 Ansible 版本 2.5.4,项目演示环境 MacOS.由于 Ansible 项目开发活 ...

  2. 自动化运维工之Ansible(1)

    1.1 ansible简介 1.1.1 .Ansible软件介绍: Ansible提供一种最简单的方式用于发布.管理和编排计算机系统的工具,可在数分钟内搞定.Ansible由Python语言开发, 默 ...

  3. ansible(3)

    一.setup模块 ansible的setup模块主要用来收集信息,查看参数: [root@localhost ~]# ansible-doc -s setup # 查看参数,部分参数如下: filt ...

  4. Ansible(1)- 简单介绍

    什么是 Ansible 开源部署工具,也是一个自动化运维工具 开发语言:Python Ansible 的特性 模块化部署管理:调用特定的模块,完成特定任务 三个关键模块:Paramiko(python ...

  5. 学习ansible(一)

    1.介绍 1 ansible基于Python开发的自动化运维工具 2 ansible基于ssh协议实现远程管理的工具,没有客户端 3 ansible软件可以实现多种批量管理操作 2.环境 主机 IP ...

  6. ansible(一)

    Ansible简介 Ansible:Ansible的核心程序Host Lnventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等.可以通过fil ...

  7. ansible(2)

    一.ansible模块(yum.pip.service.conr.user.group) 上篇中我们已经学了ansible的几个模块,接下来再来学习几个,那么你是否知道ansible一共有多少模块呢? ...

  8. ansible(二)

    软件相关模块 yum rpm和yum的区别 rpm:redhat package manager yum可以解决依赖关系 yum源配置 [epel] name=Extra Packages - $ba ...

  9. Ansible (一)

    epel rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm yum -y ins ...

随机推荐

  1. 最新PHPcms9.6.0 任意文件上传漏洞

    在用户注册处抓包: 然后发送到repeater POC: siteid=&modelid=&username=z1aaaac121&password=aasaewee311as ...

  2. C++:成员函数实现在类定义中与在类定义外的区别

    //a.cpp class A{ public: int fun(int x){ ); } }; void tt() { } //b.cpp class A{ public: int fun(int ...

  3. strerror和perror函数详解

    /*#include <string.h> char *strerror(int errnum); 它返回errnum的值所对应的错误提示信息,例如errnum等于12的话,它就会返回&q ...

  4. 示例 - 向百度说 Hello world! 并获得回应.

    1. 让浏览器打开www.baidu.com, 并等待页面加载完毕: Default.Navigate("http://www.baidu.com"); Default.Ready ...

  5. Spring MVC学习之三:处理方法返回值的可选类型

    http://flyer2010.iteye.com/blog/1294400 ———————————————————————————————————————————————————————————— ...

  6. MongoDB助力快速搭建物流订单系统

    简介 快递物流系统里最常见的一种业务类型就是订单的查询和记录.订单的特点是随着递送过程,订单数据需要随时更新路径.数据结构上需要可以灵活应对,这点非常符合Document模型,并且MongoDB支持G ...

  7. 使用JAVASCRIPT进行数据完整性验证

    页面输入完整性是编写BS经常遇到的问题,如果那里需要就到那里写,那可是要花不少的时候,并且造成不必要的浪费,下面是一个通过校验脚本,使用非常方便,通过传入FORM名就可以进行校验,通过在页面控件中增加 ...

  8. 【BZOJ】1682: [Usaco2005 Mar]Out of Hay 干草危机(kruskal)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1682 最小生成树裸题.. #include <cstdio> #include < ...

  9. cpio -H newc参数详解

    -H format 其中个format可以是: ‘bin’ The obsolete binary format. (2147483647 bytes) ‘odc’ The old (POSIX.1) ...

  10. 剑指 offer set 28 实现 Singleton 模式

    singleton 模式又称单例模式, 它能够保证只有一个实例. 在多线程环境中, 需要小心设计, 防止两个线程同时创建两个实例. 解法 1. 能在多线程中工作但效率不高 public sealed ...