目录
一、ansible自动化运维
人工运维时代
自动化运维时代
自动化运维趋势
自动化运维的好处
二、ansible介绍
ansible特点
三、安装ansible
编辑四 、修改主机清单
1、首先做主控端到被控端ssh免密操作
2、添加被控制端主机IP
编辑
五、ansible模块
1、command ---- 远程主机执行命
1.1切换到/data目录下执行ls
1.2如果不存在/data目录 执行ls
1.3如果存在/data目录 执行ls
1.4只能执行简单命令,shell不执行
2、shell----支持shell特性的command
2.1查看所有主机boot分区的磁盘使用率
编辑
3、script ---- 运行shell脚本
3.1输入hello world到远程主机的/opt/test.txt文件中
4、copy ---- 复制文件到远程主机
4.1复制本地的test.sh到远程主机,强制覆盖并备份
5、fetch ---- 从主机提取文件到主控端
5.1不指定 flat 会在dest指定目录下创建一个目录,以主机名命名
6、file ---- 设置文件属性
6.1在/data/目录下新建data目录并新建文件 1.txt 属主为mysql 属组为root,没有/data/data则新建
编辑
7、archive ---- 压缩
7.1压缩/data/data目录,并删除/data/data目录下文件
编辑
8、unarchive ---- 解压缩
8.1打包本机/data目录,上传到远程主机并解压
六、playbook
1、核心元素
运维人员早期需要维护数量众多的机器,一次需要执行反复,重复的劳动力,很多机器需要同时部署相同的服务器或是执行相同的命令,还得反复登录不同的机器,执行重复的动作
早期运维人员会结合ssh免密登录以及shell脚本来完成自动化的部署操作。
系统管理员面临的问题主要是配置管理系统,远程执行命令,批量安装服务,启停服务等
后来也就诞生了众多的开源软件,自动化运维软件
- fabric
- puppet
- saltstack
- chef
- Ansible
其中有两款软件是基于python语言开发的,saltstack、ansible都是基于python编写
人力运维>自动化运维>数据化运维,可视化运维>人工智能运维,devops
- 将提高工作效率,减少重复性的劳动力操作
- 大大的减少了人为出错的可能性
- ansible支持数据化管理,数据化追源,找到问题的来源点
ansible是一个同时管理多个远程主机的软件,必须是任意可以通过ssh登录的机器,因此可以管理的机器如
- 远程虚拟机
- 物理机
- 也可以直接管理本机机器
ansible通过ssh协议实现了,管理节点(安装了ansible服务的机器),被管理节点(被管理机器的节点)的通信。
只能是通过ssh协议登录的主机,就可以完成ansible自动化部署操作
- 批量文件分发
- 批量数据复制
- 批量数据修改、删除
- 批量自动化安装软件服务
- 批量服务启停
- 脚本化,自动批量服务部署
ansible的编排引擎可以出色的完成各种任务配置管理,ansible在流程控制,资源部署等方面很强大,并且ansible无需安装客户端软件,管理简介,使用yaml配置文件语法,功能强大,便于维护
ansible是基于python语言开发的,主要由python的两个ssh处理模块,paramiko以及PyYAML模块
- 安装部署简单
- 管理主机便捷、支持多台主机并行管理
- 无需安装被管理节点的客户端(no agent),且无需占用客户端的其他端口,仅仅使用ssh服务即可
- 不仅仅支持python,还支持其他语言的二次开发
- 不用root用户也可执行,降低系统权限
yum -y install epel-release && yum -y install ansible
ssh-keygen
vi /etc/ansible/hosts
ssh 192.168.127.129 ##首次通信需要留下指纹,可以手动ssh一次,也可以修改配置文件
ansible all -m authorized_key -a "user=root key='{{ lookup('file','/root/.ssh/id_rsa.pub') }}'" -k 批量推公钥
all:主机列表 -m:指定模块 -a:执行模块使用的参数(指定参数)
ansible client2 -m ping #验证ansible是否可用
使用 command 模块在远程主机中执行命令时,不会经过远程主机的 shell 处理,在使用 command 模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效。
相关选项如下:
creates:创建一个文件名,当该文件存在,则该命令不执行
free_form:要执行的linux指令,这里的free_form不需要写成赋值的形式,直接写要执行的命令即可,ansible -a代替
chdir:在执行指令之前,先切换到该目录
removes:移动一个文件名,当该文件不存在,则该选项不执行
executable:切换shell来执行指令,该执行路径必须是一个绝对路径
all:主机列表 -m:指定模块 -a:执行模块使用的参数(指定参数)
ansible all -m command -a 'chdir=/data ls'
ansible all -m command -a 'creates=/data ls'
ansible all -m command -a 'removes=/data ls'
ansible all -m command -a ' ls | grep rc'
在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令(支持管道符号等功能)
ansible all -m shell -a ' df -h | grep boot'
实现远程批量运行本地的 shell 脚本
echo 'echo "hello world" > /opt/test.txt ' > test.sh
ansible all -m script -a "test.sh"
相关选项如下:
backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no
content:用于替代“src”,可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode:递归设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
others:所有的file模块里的选项都可以在这里使用
src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync
owner 文件复制到远程并设定属主,默认为root
group 文件复制到远程并设定属组,默认为root
mode 文件复制到远程并设定权限,默认file=644,directory=755
ansible client1 -m copy -a "src=/root/test.sh dest=/root/ backup=yes force=yes"
ansible client1 -m copy -a "content=/root/test.sh dest=/root/test.sh backup=yes force=yes"
该模块用于从远程某主机获取(复制)文件到本地。有两个选项:
dest:用来存放文件的目录
src:在远程拉取的文件,并且必须是一个file,不能是目录
ansible client1 -m fetch -a "src=/root/test.sh dest=/root/ flat=yes"
ansible client1 -m fetch -a "src=/root/test.sh dest=/data/"
ls /data/
file模块用来设置文件属性,并且创建或者删除目录,创建连接。
相关选项如下:
force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效
src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
ansible client1 -m file -a 'path=/data/data/1.txt owner=mysql group=root state=directory'
ansible client1 -m command -a "ls -l /data/data"
path 远程主机上需要被打包/压缩的源文件(可以是文件列表,支持glob模式)
dest 打包/压缩后的包文件路径(包文件的父目录必须存在);如果包文件已存在,则会被覆盖。
format 指定压缩类型,包括:bz2、gz(默认)、tar、xz、zip
owner 指定属主
group 指定属组
mode 指定权限
remove yes|no,默认为no,在打包/压缩后,不删除源文件。
ansible client1 -m archive -a 'path=/data/data dest=/data/data.gz format=gz remove=yes'
ansible client1 -m command -a "ls -l /data/data"
用于解压文件,模块包含如下选项:
copy:在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。
creates:指定一个文件名,当该文件存在时,则解压指令不执行
src:如果copy为yes,则需要指定压缩文件的源路径
dest:远程主机上的一个路径,即文件解压的路径
owner:解压后文件或目录的属主
group:解压后的目录或文件的属组
mode:解压后文件的权限
list_files:如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项
tar cfP data.tar.gz /data
ansible client1 -m unarchive -a 'src=/root/data.tar.gz dest=/data copy=yes'
name | 唯一id,用来标识这个play主要用来干什么 |
hosts | 列出这个play会在远程的哪些host上执行 |
remote_user | 指定远程host执行用户 |
become_method | 用于指定切换账号时使用的特权账号,如su和sudo |
become | 用于设置是否切换账号运行,如果没有设置become_method,则使用sudo进行账号切换 |
become_user | 用于指定使用sudo进行账号切换时具体切换到哪个账号,使用这个参数时需要become为true,对于become_method可设置也可不设置,如果不设置,使用默认的sudo账号进行账号切换 |
ignore_errors | 用于控制当play中的某一个task执行失败时,是否继续执行后面的task |
pre_tasks | 用于指定在roles定义的tasks之前执行的tasks,具体可参考ansible playbook play执行顺序 |
roles | 列出这个play会引入哪些roles,可与pre_tasks,post_tasks和tasks一起控制play执行顺序 |
post_tasks | 用于指定所有task执行之后的任务,跟pre_tasks一样也可以用来控制执行顺序 |
tasks | 用于指定一系列要执行的task列表,跟pre_tasks, post_tasks和roles一起控制play执行顺序 |
run_once | 用于控制对于相同的host是否对相同任务执行多次,默认是false |
timeout | 设置每个task最多执行时间,超时则task执行失败,返回错误 |
vars | 使用Dictionary格式定义play级别变量,可参考ansible变量详解 |
vars_files | 引入包含当前play变量的文件列表 |
gather_facts | 设置是否需要收集远程host的fact变量结果 |
handlers | 被tasks调用的任务列表 |