初识ansible
一 . 初识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-msater, 被控节点需要安装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 为我们提供的平模块:
- ansible 192.168.133.130 -m 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)<br>[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 'remove=/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的更多相关文章
- ansible笔记(11):初识ansible playbook(二)
ansible笔记():初识ansible playbook(二) 有前文作为基础,如下示例是非常容易理解的: --- - hosts: test211 remote_user: root tasks ...
- ansible笔记(10):初识ansible playbook
ansible笔记():初识ansible playbook 假设,我们想要在test70主机上安装nginx并启动,我们可以在ansible主机中执行如下3条命令 ansible test70 -m ...
- ansible笔记(9):初识ansible playbook(二)
1.先看一个playbook示例: 表示在远程主机192.168.10.2中/test文件夹中新建一个CCC文件,其权限设置为0700. 1.1书写风格之一:参数可以集中写在一行. 1.2书写风格之二 ...
- ansible笔记(8):初识ansible playbook
回顾总结:我们来想象一个工作场景,看看怎样把之前的知识点应用到这个工作场景中.假设,我们想要在192.168.10.2主机上安装nginx并启动,我们可以在ansible控制主机中执行如下3条命令. ...
- 初识Ansible 01
自动化运维工具有很多,从实现的功能.维护的成本.使用的系统来选择,几种常用运维工具比较: Puppet基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱 SaltS ...
- 自动化运维工具之 Ansible 介绍及安装使用
一.初识Ansible 介绍: Absible 使用 模块(Modules)来定义配置任务.模块可以用标准脚本语言(Python,Bash,Ruby,等等)编写,这是一个很好的做法,使每个模块幂等.A ...
- Ansible开发之路
一.初识Ansible 链接:https://www.cnblogs.com/baishuchao/articles/9164083.html 二.Ansible的架构 链接:https://www. ...
- ansible(1)
一.初识ansible 1.准备工作: 准备四台干净的虚拟机,如下: 192.168.133.129(主控节点,下面三个为被控节点) 192.168.133.130 192.168.133.131 1 ...
- ansible学习-playbook的YAML语法
[一篇非常好的ansible参考博文] 初识Ansible http://liumissyou.blog.51cto.com/4828343/1616462 --------------------- ...
随机推荐
- iOS-----AVFoundation框架的功能详解
使用AVFoundation拍照和录制视频 需要开发自定义的拍照和录制视频功能,可借助于AVFoundation框架来实现,该框架提供了大量的类来完成拍照和录制视频.主要使用如下类: AVCaptur ...
- TCP/IP 必知必会的十个问题
本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. 一.TCP/IP模型 TCP/IP协议模型(Transmission Control Protoc ...
- spi总结
SPI的四种模式 SPI的相位(CPHA)和极性(CPOL)分别可以为0或1,对应的4种组合构成了SPI的4种模式(mode) Mode 0:CPOL = 0,CPHA = 0 Mode 1:CPOL ...
- freeradius连接mysql数据库慢
[环境说明] 服务器版本 redHat5.3 mysql版本 MySQL5.6.22 freeradius版本 2.1.12 [问题描述] 配置好freeradiu ...
- Android学习笔记之Android Studio下创建menu布局文件
1.创建menu文件夹 Android Studio项目中如果没有menu文件夹,在res文件夹右键,new-Android resource directory: 则会弹出下图对话框,在Resour ...
- Loj 2047 伪光滑数
Loj 2047 伪光滑数 正解较复杂,但这道题其实可以通过暴力解决. 预处理出 \(128\) 内的所有质数,把 \(n\) 内的 \(prime[i]^j\) 丢进堆中,再尝试对每个数变形,除一个 ...
- BZOJ5297 CQOI2018 社交网络 【矩阵树定理Matrix-Tree】
BZOJ5297 CQOI2018 社交网络 Description 当今社会,在社交网络上看朋友的消息已经成为许多人生活的一部分.通常,一个用户在社交网络上发布一条消息(例如微博.状态.Tweet等 ...
- python(八):反射
反射机制是通过python3内置的hasattr.getattr.setattr来实现的.即根据变量名的字符串形式来获取变量名的属性或方法. 一.通过反射查看已知对象的属性和方法 getattr(ob ...
- pat甲级 1155 Heap Paths (30 分)
In computer science, a heap is a specialized tree-based data structure that satisfies the heap prope ...
- 接口测试基础——第6篇unittest模块(一)
我们先来简单介绍一下unittest框架,先上代码,跟住了哦~~ 1.建立如下结构的文件夹: 注意,上面的文件夹都是package,也就是说你在new新建文件夹的时候不要选directory,而是要选 ...