Ansible:运维工作
Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible架构相对比较简单,仅需通过SSH连接客户机执行任务即可。
运维工作(包含的内容及层次):
系统安装(物理机、虚拟机)--> 程序包安装、配置、服务启动--> 批量操作--> 程序发布 --> 监控
OS Provisioning:
物理机:PXE、Cobbler(可以提供多个不同的版本)
虚拟机:Image Templates,映像文件模版
Configuration:配置,如程序包管理、用户管理、配置文件、服务管理、cron任务等
puppet(ruby)、 saltstack(python)、 chef、 cfengine
Command and Control:task exec
fabric,func
预发布验证:新版本的代码先发布到服务器(与线上环境配置完全相同,只是未接入到调度器)
程序发布:
1)不能影响到用户体验
2)系统不能停机;
3)不能导致系统故障或造成系统完全不可用;
灰度发布:
发布路径:
/webapp/app
/webapp/app-1.1
/webapp/app-1.2
在调度器上关闭一批主机(maintanance) --> 关闭服务 --> 部署新版本的应用程序 --> 启动服务 --> 在调度器上启用这一批服务器;
自动化灰度发布:脚本、发布平台
运维工具的分类:
agent:(被运维的主机上有代理服务)puppet,func
agentless:(没有代理服务,通过ssh)ansible,fabric
ansible ——是高度模块化的,调用特定的模块,完成特定的任务;基于Python实现,由Paramiko、PyYAML和Jinjia2三个关键模块;部署简单,agentless;主从模式;支持自定义模块;支持Playbook;幂等性——一个playbook多次执行的结果相同;
Ansible默认通过 SSH 协议管理机器;
ansible中有两种模式,分别是ad-hoc模式和playbook模式:
ad-hoc简而言之,就是"临时命令"
- 临时的看下远程机器的内存信息
- 临时的批量分发一个配置文件
特别小的需求,临时命令就解决
大需求,部署软件这样的复杂需求,就写剧本
临时命令非常适合您很少重复的任务,例如,如果您想关闭实验室中的所有机器
Ansible ad hoc 命令使用/usr/bin/ansible命令行工具在一个或多个托管节点上自动执行单个任务,ad hoc 命令既快速又简单。
(新出现的一款运维工具saltstack:saltstack是一个配置管理系统,能够维护预定义状态的远程节点。saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。saltstack是运维人员提高工作效率、规范业务配置与操作的利器。Salt的核心功能: 使命令发送到远程系统是并行的而不是串行的 使用安全加密的协议 使用最小最快的网络载荷 提供简单的编程接口Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口。Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口。)
Ansible的安装:
yum install ansible
配置文件:
/etc/ansible/ansible.cfg
/etc/ansible/hosts 主机清单文件
因为Ansible使用SSH协议管理机器,涉及到安全方面,可以基于密钥认证的方式连接各被管理节点,也可以在主机清单文件中配置上对应的用户和密码。
在管理端:
ssh-keygen -t rsa -P ‘’
生成的私钥/root/.ssh/id_rsa,公钥/root/.ssh/id_rsa.pub,需要将公钥拷贝到每一个被管理节点的用户的家目录下的.ssh子目录中:
ssh-copy-id -i /path_pubkey user@ip
操作后,在129上的/root/.ssh/中多了authorized_keys文件。
ssh-keygen 是用于生成、管理和转换 SSH 密钥的工具。SSH (Secure Shell) 是一种安全的网络协议,广泛用于在计算机之间进行加密的远程登录和数据传输。而 SSH 密钥对是保证这种通信安全性的核心机制。SSH 密钥是一种基于公钥加密的认证方式。一般来说,它由一对密钥组成:公钥和私钥。公钥是公开的,可以分享给任何人,而私钥则需要保密,只能保存在用户本地。生成 SSH 密钥时,通常会生成一个私钥文件和一个公钥文件。公钥可以放置在远程服务器的 .ssh/authorized_keys 文件中,而私钥保留在本地,用于匹配公钥进行身份验证。
ssh-copy-id命令,把本地的ssh公钥文件安装到远程主机对应的账户下, 可以把本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限。
经过上述步骤,可以在管理节点上不需要密码对被管理节点操作:
Ansible应用的通用语法:
ansible <host-pattern> [ -f forks] [ -m module_name ] [ -a args ]
-m module_name :默认为command,即不写-m参数,默认使用command模块
-f forks:对很多节点进行管理时,一次并发所有节点会造成拥堵,可以设定每次并发的数量。
-a args:模块的参数
ansible-doc : 显示Ansible模块文档信息
-l,--list: List available modules,显示所有可用的模块
-s,--snippet: Show playbook snippet for specified module(s),显示指定模块的简单帮助
对被管理节点的定义:在/etc/ansible/hosts文件中:
Ansible的命令执行结果(颜色)
按照命令执行后的颜色区分
绿色 命令以用户期望执行,但是状态没有发生改变
黄色 命令以用户期望执行,状态发生了改变
紫色 告警信息,提示你有更合适的用法
红色 命令错误,执行失败
蓝色 详细的命令执行过程
表示命令执行成功的颜色
一般来说: 绿色、 黄色
表示执行名称成功,区别在于
绿色 :表示执行成功状态未改变
黄色 :表示执行成功状态改变
显示指定模块信息:如,显示用户模块信息
ansible-doc -s user
Ansible常用模块及用法:
command模块,默认可以不写-m,下载文件:
ansible websrvs -a 'wget -O /tmp/GeoGebra_jb51.rar ftp://192.168.217.1/GeoGebra_jb51.rar'
user模块:用户管理模块
用户是创建成功了。
再次执行,这次发现返回的状态是SUCCESS,绿色:
group模块:
参数:gid:local:name:non_unique:state:system
cron模块:定时任务模块
参数: backup: cron_file: day: disabled: env: hour: insertafter: insertbefore: job: minute: month: name: reboot: special_time: state: user: weekday:
查看被管理节点:
删除:
被管理节点中,websrvs组是CentOS6.9,dbserver组是CentOS7.9,管理节点是dbserver中的一台机器,在对websrvs组进行管理时,返回的信息经常有错,但是到被管理节点查看,结果又是正确的,这一点需要注意。
copy模块:本地文件分发拷贝给目标主机
参数:attributes: backup:checksum:content: decrypt: dest: directory_mode: follow: force: group: local_follow: mode: owner: remote_src: selevel:serole: setype: seuser: src: unsafe_writes: validate:
第一次执行,出错:
在被管理节点安装libselinux-python:
yum install libselinux-python
再次执行:
被管理节点上:
file模块:设置文件属性(也可以创建文件)
参数:access_time: access_time_format: attributes: follow:force: group: mode: modification_time: modification_time_format: owner: path: recurse: selevel: serole: setype: seuser: src: state: unsafe_writes:
强制创建可以使用force参数。
ping模块:测试主机是否在线,一般无参数
参数:data
yum模块:在被管理节点安装软件包,假设每个被管理节点yum源可用
参数:download_only: enable_plugin: enablerepo: exclude: install_weak_deps: installroot: list: lock_timeout: name: releasever: security: skip_broken: state: update_cache: update_only: use_backend: validate_certs:
service模块:对被管理节点上的服务进行管理
参数:arguments: enabled: name: pattern: runlevel: sleep: state: use:
可以看到131上的服务没有启动成功。
shell模块:需要指明某些命令在被管理节点主机上运行。
参数:chdir: cmd: creates: executable: free_form: removes: stdin: stdin_add_newline: warn:
ansible websrvs -m command -a “echo centos | passwd --stdin centos”
以上命令会显示执行成功,但是相应主机上的用户密码没有被改变,原因是管道命令符将结果送给了管理主机即在当前主机上echo了,而不是被管理主机,所以修改用户密码不能通过command模块实现。
script模块:本地脚本在远程主机运行,实际上是先复制到远程主机,然后在远程主机运行后删除
参数:chdir: cmd: creates: decrypt: executable: free_form: removes:
本地主机上ansible-test.sh:
#!/bin/bash
#
echo "$(hostname) ansible script is good" > /tmp/ansible-script.txt
setup模块:收集远程主机信息
参数:fact_path: filter: gather_subset: gather_timeout:
ansible websrvs -s setup
对于复杂的运维工作,可以使用playbook:
Playbook Structure:
Inventory
Modules
Ad Hoc Commands
Playbooks
Tasks 任务
Variables 变量
Templates 模板
Handlers 处理器
Roles 角色
playbook的核心要素:tasks、Variable、templates、handlers、roles
要编写playbook,需要了解YAML。
YAML:
基本语法
标量(Scalars)—— 标量是最简单的数据类型,可以是字符串、整数、浮点数、布尔值等。
序列(Sequences)—— 指一个有序的元素列表,而不是指一个键有多个值。每个元素可以是标量(如字符串、数字)、映射(键值对集合),甚至是另一个序列。序列通常用 - 符号来表示。
映射(Mappings) —— 映射是由键值对组成的集合,每个键后面跟一个冒号和值
多行字符串 —— 多行字符串可以通过 | 或 > 来定义。| 保留换行符,而 > 将内容折叠成一行。
高级特性
锚点与别名 —— 可以使用锚点 (&) 和别名 (*) 来引用同一对象,减少重复。
锚点 (&):用于标记一个节点,使得该节点可以在后续的地方被引用。
别名 (*):用于引用之前定义过的锚点,表示使用相同的值或结构。
合并键 (<<) —— 合并键 << 是 YAML 提供的一种特殊语法,用来将两个映射合并在一起。它可以是一个锚点别名,也可以是一个映射列表。当使用锚点别名时,它会将锚点定义的内容合并到当前映射中。
如果当前映射中已经存在同名键,则以当前映射中的值为准(即覆盖原有值)。
如果当前映射中不存在同名键,则直接添加来自锚点的键值对。
变量:
facts:
register:
通过命令行传递变量: --extra-var “name=value”
通过roles传递变量
Inventory中定义(ini格式),如hosts文件中
主机变量,直接定义在主机后面,如
hostname name=value name=value
组变量:组名后加:变量名,如
[groupname:vars]
name=value
name=value
组嵌套:
[groupname:children]
组名1
组名2
主机参数,ansible_ssh_user=centos ansible_ssh_pass