前言
运维工程师的核心职能
- 平台架构组件
- 日常运营保障
- 性能、效率优化
运维工作
系统安装 --> 程序包安装、配置、服务启动 --> 批量操作 --> 程序发布 --> 监控
不能影响用户体验;
系统不能停机;
不能导致系统故障或造成系统完全不可用;
一般都是 灰度发布 程序,影响的只是一小部分的用户。
ansible的特性
- 模块化
- 基于Python语言开发,
Parmike
,PtYAML
,Jinja2
三个关键模块 - 部署简单,agentless(无代理)
- 支持主从模式
- 支持自定义模块
- 支持Palybook(剧本)
- 基于SSH(安全)
- 幂等性
@> 幂等性:假设cp一个文件到/data目录下,再次执行同一条指令,ansible检测到文件,将不会进行修改。也就是允许多次执行同一条命令,但是他们结果一样。
ansible的配置文件
/etc/ansible/ansible.cfg #主配置文件
/etc/ansible/hosts #主机清单
/etc/snsible/roles/ #角色清单,Palybook
一、ansible的基础使用
!> ansible基于ssh控制其他主机,需要进行密钥认证。而不是密码认证,否则每次都将输入密码。
安装ansibe
yum install ansible -y
基本语法
ansible 主机 -m 模块 -a 'ages'
主控主机生成key
把公钥复制受控主机上
添加主机清单
vim /etc/ansible/hosts
[websrvs] 172.16.10.10 172.16.10.20 [dbsrvs] 172.16.200.52 172.16.10.10 #代表定义主机组
主机调用方法
~]# ansible 172.16.10.10 -m ping
表示只对
172.16.10.10
发ping
~]# ansible websrvs -m ping
表示只对websrvs
中的主机发ping
~]# ansible 'websrvs:dbsrvs' -m ping
逻辑与,表示对两个组都发出ping
~]# ansible 'websrvs:&dbsrvs' -m ping
逻辑与,表示两个组中都包含的主机
~]# ansible 'websrvs:!dbsrvs' -m ping
逻辑非,表示websrvs中有,但不能出现再dbservs中
@> 绿色结果为成功且没有对系统做修改
黄色结果为成功且做了对应的修改
红色为错误
二、模块使用
默认模块是command
1. ping
测试主机连通性
~]# ansible all -m ping #测试主机清单中所有主机的连通性
2. comamnd
用于批量执行命令,-m command
可省
~]# ansible all -a 'hostname' #获取所有主机的hostnmae
直接将命令指明 -a 'COMMAND'
removes
文件不存在就不进行在一步
~]# ansible 172.16.10.10 -a 'removes=/data/file touch /data/f2'
#表示file不存在就不执行touch命令
creates
文件不存在就进行下一步
~]# ansible 172.16.10.10 -a 'creates=/data/file touch /data/f3'
#表示/data/file不存在就执行touch
chdir
切换至指定文件夹执行命令
~]# ansible 172.16.10.10 -a 'chdir=/data ./test.sh'
#表示再data目录执行 ./test.sh
!> command模块不支持一些特殊字符,如“*”,“|”等等
3. shell
同样也是用于执行命令的模块,它支持特殊字符,建议使用直接使用shell模块,同样支持command的参数。
~]# ansible 172.16.10.10 -m shell -a 'rm -f /data/*'
#该命令是comman不能实现的,因为含有"*"特殊字符
用法和command
相似
4. script
将本地脚本推送至所有主机运行
例如:在/opt下有一个脚本,test.sh
#!/bin/bash
#
hostname
此时推送到所有主机运行
~]# ansible all -m script -a '/opt/test.sh'
支持参数和command
相似
5. copy
复制文件到受控主机
backup=yes #表示原有文件备份
src=/path/to/file #本地源文件
dest=/path/to/file #存放受控主机的位置
mode=# #设置文件权限
owner=user #设置文件所有者
group=groupNAME #设置文件的属组
content="Text" #不指定本地文件,直接生成文件,这里就是定义文件的内容
例如:拷贝/data/test文件到受控主机的/tmp/下
~]# ansible all -m copy -a 'src=/data/test dest=/tmp/test backup=yes owner=admin group=admin'
#如果文件存在需要备份,属组和属主为admin
例如:创建新文件,内容为Hello \n Hi \n
,保存在受控端的tmp目录下,名为new
~]# ansible all -m copy -a 'content="Hello\nHi\n" dest=/tmp/new'
6. fetch
抓取受控主机的文件,缺点是一次只能抓取一个文件。对于多个文件需要打包再抓取
src=/path/to/file #远程目标文件
dest=/path/to/file #本地存放路径
例如:抓取所有主机的messages
文件到本地/data
目录
~]# ansible all -m fetch -a 'src=/var/log/messages dest=/data'
7. file
文件管理模块
path=/path/to/file #文件/文件夹 存放位置
mode=# #设置文件权限
owner= #文件属主
state=touch|adsent|directory|link #分别是新建,删除,建立文件夹,创建软连接
示例:所有受控主机新建文件file-test
,其他用户不可读写
~]# ansible all -m file -a 'path=/data/file-test state=touch mode=660'
删除文件
~]# ansible all -m file -a 'path=/data/file-test state=absent'
新建目录
~]# ansible all -m file -a 'path=/data/dir1 state=directory'
删除目录
~]# ansible all -m file -a 'path=/data/dir1 state=absent'
创建软连接
~]# ansible all -m file -a 'src=/etc/fstab dest=/data/fstab-link state=link'
删除软连接
~]# ansible all -m file -a 'dest=/data/fstab-link state=absent'
删除一个文件夹下的全部文件
~]# ansible all -m shell -a 'rm -f /data/*'
8. hostname
设置受控主机的主机名,注意这样只能一个一个设置,全部设置主机名将相同。且设置的主机名是永久有效的。
示例:设置172.16.10.10
的主机名为node3
~]# ansible 172.16.10.10 -m hostname -a 'name='node3'
9. cron
计划任务的创建
minute= #分钟,范围0-59,*表示每分钟
hour= #小时,范围0-23, *表示每小时
day= #天,范围1-31,*表示每天
weekday= #星期,范围0-6,*表示每tian
month= #月,范围1-12,*表示每个月
jod #执行任务
name #计划任务的名称
创建计划任务
~]# ansible all -m cron -a 'mintue=* jod="/usr/bin/wall Wrning" name="Wrning"'
#没分钟发出一次广播,内容为"Wrning"
禁用计划任务
~]# ansible all -m cron -a 'disabled=yes jod="/usr/bin/wall Wrning" name="Wrning"'
#jod和name必须指明,不然不能正常禁用,启用直接把yes改为no
删除计划任务
~]# ansible all -m cron -a 'jod="/usr/bin/wall Wrning" name="Wrning" state=absent'
10. yum
软件包的管理(安装/卸载/升级/查看)
查看包
~]# ansible all -m yum -a 'list=httpd' #查看是否安装httpd
~]# ansible all -m yum -a 'list=installed' #查看已经安装的包
安装包
~]# ansible all -m yum -a 'name=vsftpd,httpd' #表示同时安装vsftpd和httpd
卸载包
~]# ansible all -m yum -a 'name=vsftpd,httpd state=removed' #删除这两个包
安装rpm本地包
~]# ansible all -m copy -a 'src=/data/rpm包名 dest=/tmp/rpm包名'
#先将rpm包推送到受控主机
~]# ansible all -m yum -a 'name=/tmp/rpm包名'
#安装rpm包
忽略key的检查
~]# ansible all -m yum -a 'name=/tmp/rpm包名 disable_gpg_check=yes'
更新缓存
~]# ansible all -m yum -a 'name=dstat update_cache=yes' #只能在安装软件时进行更新
11. service
服务管理(启动/停止/重载/开机自启)
name= #服务名
enabled=yes|no #是否开机启动
state=
started #启动
stopped #停止
restarted #重启
reloaded #重载
启动服务,允许开机启动
~]# ansible websrvs -m service -a 'name=httpd enabled=yes state=started' #启动服务,开机自启
12. user
用户管理(增/删/改)
name= #用户名
shell= #指定shell
home= #指定家目录
system=yes|no #是否为系统用户
uid= #指明uid
groups= #附加组,多个逗号隔开
group= #主组
remove=yes #删除家目录
添加用户
~]# ansible all -m user -a 'name=nginx shell=/sbin/nologin home=/var/nginx system=yes groups=admin,root' #添加用户nginx,指明shell,home和附加组
修改用户
~]# ansible all -m user -a 'name=nginx shell=/sbin/nologin home=/var/nginx system=no groups=admin,root' #改为不是系统用户
删除用户
~]# ansible all -m user -a 'name=nginx state=absent remove=yes'
同时删除家目录
13. group
组管理((增/删/改))
添加组
~]# ansible all -m group -a 'name=admin system=yes gid=102'
添加组为系统组,名称为admin
,gid为102
修改组
~]# ansible all -m group -a 'name=admin system=no id=1002'
删除组
~]# ansible all -m group -a 'name=admin state=absent
3. setup
显示受控端的状态信息,包括ip,架构等等
~]# ansible websrvs -m setup
~]# ansible 172.16.10.10 -m setup -a 'filter=ansible_fqdn' #过滤,只显示fqdn(全名)
~]# ansible 172.16.10.10 -m setup -a 'filter=ansible_hostname' #过滤,只显示hostname
以上都是常用的模块
<center>END</center>