文章目录
Ansible
ansible简介
ansible是2013年推出的一款it自动化和Devopsruanjian,基于python研发,糅合许多运维工具的优点,实现了批量操作系统配置,批量程序部署,批量运行命令等功能
ansible可以实现
- 自动化部署APP
- 自动化管理配置项
- 自动化持续交付
- 自动化(AWS)云服务管理
为什么选择ansible
- 活跃度
- 学习成本
- 使用成本
- 编码语言
- 性能
- 使用是否广泛
ansible优点
- 只需要ssh和python即可使用
- 无客户端
- ansible功能强大,模块丰富
- 上手容易,门槛低
- 基于python开发,做二次开发更容易
- 使用公司比较多,社区活跃
ansible特性
-
模块化设计,调用特定的模块完成特定的任务
-
基于python语言实现
paramiko
PyYAML(半结构化语言)
jinja2
-
其模块支持JSON等标准输出格式,可以采用任何编程语言重写
-
部署简单
-
主从模式工作
-
支持自定义模块
-
支持playbook
-
易于使用
-
支持多层部署
-
支持异构it环境
ansible工作流程
主机的集合执行命令的集合
抓取全量机器&分组列表,使用host-pattern过滤机器列表(主机的集合)
根据参数确定执行模块和配置:(命令的集合)
ansiible的部署
-
对管理主机
要求python2.7或者3.6以上
-
ansible使用以下模块,都要安装
paramiko
PyYAML
Jinja2
httplib2
six
软件依赖关系(被管理主机)
- ansible默认通过ssh协议管理机器
- 被管理主机要开启ssh服务,允许ansible主机登录
- 在托管节点上也需要安装python2.7或3.6以上的版本
- 如果托管节点上开启了selinux,需要安装libselinux-python
在线安装
yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
yum -y install ansible
验证
ansible --version
ansible的使用
-
主机的定义与分组
安装ansible之后可以做一些简单的任务
-
ansible配置文件查找顺序
首先检测ANSIBLE_CONFIG变量定义的配置文件
其次检测当前目录下的./ansible.cfg文件
再次检测当前用户家目录下的 ~/ansible.cfg文件
最后检查/etc/ansible/ansible.cfg文件
/etc/ansible/ansible.cfg是ansible的默认配置文件路径
-
ansible.cfg配置文件
–inventofy 定义托管主机地址配置文件路径名
–inventory 指定的配置文件,写入远程主机的地址
格式
– #表示注释
【组名称】
主机名称或者IP地址,其他参数
-
ansible.cfg配置文件(2)
–ssh 主机 key 验证配置参数 14
–host_key_checking = false 61
如果为 false,不需要输入 yes
如果为true,需要输入 yes
-
分组定义、范围定义样例
[web]
web1
web2
[db]
db[1:2]
[other]
cache
ansible的命令基础
-
ansible 主机集合 -m 模块名称 -a 模块参数
—— 主机集合 主机名或分组名,多个使用 “逗号” 分割
—— -m 模块名,默认 command 模块
—— -a or --args 模块参数
-
其他参数
—— -i inventory 文件路径,或可执行脚本
—— -k 使用交互式登录密码
—— -e 定义变量
—— -v 显示详细信息
-
列出要执行的主机
ansible 组名 --list-hosts ansible 单个主机 --list-hosts ansible all --list -hosts 列出所有主机
-
批量检测主机
ansible all -m ping -k
ansible设置免密登录
部署证书文件
-
ansible 是通过ssh在远程执行命令的
-
ssh 远程执行命令必须通过认证才行
-
密码写入配置文件安全性很差
-
使用key方式认证
-
给所有主机部署公钥
没有密钥命令执行会出错
ansible web -a ‘uptime’
创建一对密钥,给所有主机部署密钥
cd /root/.ssh
ssh-keygen -t rsa -b 2048 -N '' -f key #创建ansible的密钥,密码为空,重命名为key
ssh-copy-id -i key.pub root@web #把公钥传到web1,web2等等
... 有几个被控主机,传几次
#部署完成之后测试,是否部署成功
ansible all -m ping
#测试时,第一遍应该会出现ssh服务不通,因为我们修改了ssh密钥的默认名字,
#有两种方式可以解决,一种是书写inventory文件时加入相应的变量,在下面有介绍到
#还有一种修改本机ssh服务的默认密钥名
#在家目录下的.ssh目录下创建一个名为config的文档
#vim config
#Host *
# IdentityFile ~/.ssh/key
# StrictHostKeyChecking no
inventory扩展参数
-
inventory参数说明
ansible_ssh_port
—— ssh端口:如果不是默认的端口号,通过此变量设置
ansible_ssh_user
——默认的ssh用户名
ansible_ssh_pass
——ssh密码(这种方式并不安全,我们建议使用 --ask-pass 或者ssh密钥)
ansible_ssh_private_key_file
——ssh使用的私钥文件,适用于有多个密钥,而你不想使用ssh代理的情况
-
vars 变量定义,用于组名后面
例如:
[all:vars]
ansible_ssh_private_key_file="/root/.ssh/key"
#注明密钥位置,密钥可以使用非默认名称2. children 子组定义,用于引用其他组名称 例如
[app:children]
web
db
-
ansible的基本配置
书写配置文件(通过配置文件加载顺序,可以设置无数个配置文件)
cd /ssh
vim ansible.cfg
[defaults]
inventory = inventory
remote_user = root
ask_pass = false
vim inventory
[app]
A
B
[app2]
C
D
ansible配置文件中的参数 | 描述 |
---|---|
inventory | 指定清单文件的路径 |
remote_user | 要在受管主机上登录的用户的名称,如果未指定,则使用当前的用户名称 |
ask_pass | 是否提示输入ssh密码,如果使用ssh公钥身份验证,改为false |
become | 连接后是否在受管主机上切换用户(通常切换为root),这里可以通过play指定 |
become_method | 如何切换用户(通常为sudo,也是默认方式,也可选择su - ) |
become_user | 要在受管主机上切换的用户(通常是root,也是默认值) |
become_ask_pass | 是否腰围become_method提示输入密码,默认为false,但是在上面选择切换用户的方式为 su - 时,必须选择为 true |
动态主机
vim ansible.cfg
[defaults]
inventory = a.py #(可以是脚本(但是格式只能是json))
host_key_checking = false
vim a.py
#! /usr/bin/python
import json
hostlist = {}
hostlist["aa"] = ["A", "B"]
hostlist["bb"] = ["C", "D"]
print json.dumps(hostlist)
ansible的模块
模块名 | 作用 |
---|---|
ping | 测试连通性(在ansible中ping是进行ssh测试) |
command | 远程命令执行 格式 ansible all -m command -a ‘执行指令’;(默认模块) |
shell | 用法与command模块执行方法一致 |
script | 在本地写好脚本,使用script模块批量执行 |
yum | 软件包管理 |
service | 管理服务状态 |
copy | 复制文件到远程之间 (修改配置) |
lineinfile | 修改配置文件,(修改某一行) |
replace | 修改配置文件,只匹配要修改的地方 |
setup | 用于获取主机信息 |
-
command模块注意事项 - 该模块通过-a跟上要执行的命令可以直接执行,若命令里有如下字符则执行不成功 ” <",">"," | " ,"&" - command模块不能解析系统变量 - 该模块不启动shell直接在ssh进程中执行,所有使用到shell的命令执行都会失败 - 书写格式
shell模块
-
- shell模块用法基本与command一致,但是可以执行任意命令(交互式命令除外) 启用远程的shell 双引号本地shell解析 单引号远程shell解析 \\\两次解析 - 变量解析 ansible执行命令是二次解析 第一次在本机执行,第二次在执行机器解析 需要第二次解析的变量要转义
yum模块
- 使用yum包管理器来管理软件包
- name:要进行操作的软件包名字
- state:动作
- install 在模块的使用方法 installed
- remove ===removed
例:
ansible A -m yun -a 'name=mysql ,state=installed ' #在A 主机上安装mysql
service模块
- name:必选项,服务名称
- enabled: 是否开机启动 yes|no
- sleep: 执行restarted,会在stop和start之间沉睡几秒钟
- state:对当前服务执行启动,停止,重启,重新加载等操作
例:
ansible A -m service -a 'name=mysql state=started'
copy模块
- 复制本地文件到远程主机
- src:复制本地文件到远程主机,绝对路径和相对路径都可,路径为目录时会递归复制,若路径以‘/’结尾,只复制目录里的内容,若不已‘ / ’ 结尾,则复制包含目录在内的整个内容,类似于rsync
- dest:必选项,远程主机的绝对路径,如果源文件是一个目录,则该路径必须是目录
- backup:覆盖前先备份原文件,备份文件包含时间信息,有两个选项 yes|no
- force:若目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,设为no,则只有当目标主机的目标位置不存在该文件时才复制,默认为yes
ansible A -m copy -a 'src=/etc/resolv.conf dest=/etc/resolv.conf'
#复制文件
ansible A -m copy -a 'src=/etc/yum.repos.d/ dest=/etc/yum.repos.d/'
lineinfile 模块
- 类似于sed的一种行编辑替换模块
- path: 目标文件文件
- regexp: 正则表达式,要修改的行
- line 最终修改的结果
- 一旦匹配,整行替换
#修改my.cnf 中bin-log的格式
ansible A -m lineinfile -a 'path="/etc/my.cnf" regexp="^binlog-format" line="binlog-fromat = row" '
replace模块
- 匹配要修改的地方
#还原my.cnf 中bin-log的格式
ansible A -m replace -a 'path="/etc/my.cnf" regexp=" row$ " replace=" mixed" '
setup模块
- 主要用于获取主机信息,playbooks里经常会用的另一个参数gather_facts与该模块相关,setup模块下经常用的是filter参数
- filter:过滤
ansible A -m setup #查看主机的详细信息
ansible A -m setup | grep hostname #查看主机名
ansible A -m setup -a 'filter=ansible_hostname'
20210818221658683.png)]ansible-doc
- 模块手册,相当于shell的man
- ansible -l 列出所有模块
- ansible-doc modulename 查看帮助
ansible-doc | grep user #与用户相关的模块
ansible 的七种工具
第一种武器
ansible命令,用于执行临时性的工作,必须掌握
第二种武器
ansible-doc是ansible模块的文档说明,针对每个模块都有详细的说明及应用案例介绍,功能和Linux系统man命令类似,必须掌握
第三种武器
ansible-console是ansible为用户提供的交互式工具,用户可以在ansible-console虚拟出来的终端上像shell一样使用ansible内置的各种命令,这为习惯使用shell交互方式的用户提供了良好的使用体验
第四种武器
ansible-galaxy从GitHub上下载管理roles的一款工具,与python的pip类似
第五种武器
ansible-playbook是日常应用中使用效率最高的命令,工作机制:通过读取先编写好的playbook文件实现批量管理,可以理解为按一定条件组成的ansible任务集,必须掌握
第六种武器
ansible-vault主要用于配置文件加密,如编写的playbook文件中包含敏感信息,不想其他人随意查看,可用它加密/解密这个文件
第七种武器
- ansible-pull(2000台以上使用这个模式)
- ansible有两种工作模式pull/push,默认使用push模式工作,pull和push工作模式刚好相反
- 设用场景:有大批量机器需要配置,即便使用高并发线程依旧要花费很多时间
- 通常在配置大批量机器的场景下使用,灵活性稍有欠缺,但效率几乎可以无限提升,对运维人员的技术水平和前瞻性规划有较高要求