一.ansible
- 简介:2013年推出的一款TI自动化和DevOps软件,2015年被RedHat收购,是基于Python研发,糅合很多老运维工具的优点,实现了批量操作系统配置,批量程序部署,批量运行命令等功能
ansible可以实现:
-自动化部署app
-自动化管理配置项
-自动化持续交付
-自动化(AWS)云服务管理
选择ansible---活跃度 学习成本 使用成本 编码语言(python 集成在系统底层) 性能 使用是否广泛
优点-- 只需要ssh和Python即可使用,无客户端,功能强大模块丰富,容易上手门卡低,基于Python开发做二次开发更容易,使用公司比较多,社区活跃
特性: ①模块化设计 ②基于Python语言实现 (paramiko PyYAML半结构化语言 jinja2 ) ③JSON输出
- 执行流程
读取配置->读取主机配置->使用host-pattern过滤器列表->根据参数确定执行模块和配置->runner执行返回->输出,结束
- 主机定义与分组
ansible之后可以做一些简单的任务
ansible配置文件查找顺序
-首席检测ANSIBLE_CONFIG变量定义的配置文件
-其次检测当前目录下的./ansible.cfg文件
-再次检查当前用户家目录下 ~/ansible.cfg文件
- /etc/ansible/ansible.cfg是ansible的默认配置文件路径
主机定义与分组
ansible.cfg配置文件
-inventory 定义托管主机地址配置文件路径名
-inventory指定的配置文件,写入远程主机的地址
格式#表示注释
[组名称]
主机名称或ip地址.其他参数
样例:
[web]
web1
web2
主机定义与分组
ansible.cfg配置文件
-ssh主机key验证配置参数
-host_key_checking=False
如果为False,不需要输入yes
如果为True,等待输入yes
- ansible命令基础
ansible主机集合 -m模块名称 -a模块参数
-主机集合 主机名或组名 多个使用"逗号"分隔
-m 模块名称 默认 command 模块
-a or --args 模块参数
其他参数
-i inventory文件路径 或可执行脚本
-k 使用交互式登录密码
-e 定义变量
-v 显示详细信息
ansible all --list-hosts (列出要执行的主机)
ansible all -m ping -k (批量监测主机)
部署证书文件
ansible是通过ssh在远程执行命令的
ssh远程执行命令必须要通过认证才行
密码写入配置文件安全性很差
使用key方式认证
给所有主机部署公钥
-没有秘钥命令执行会出错
ansible web -a 'uotime'
cd /root/.ssh
ssh-keygen -t rsa -b 2048 -N '' -f key
ssh-copy-id -i key.pub 主机名称
- 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"
children子组定义,用于引用其他组名称
例如
[app:children]
web
db
自定义配置文件
-创建文件夹myansible创建配置文件ansible.cfg
[defaults]
inventory=myhost
host_key_checking=False
配置主机文件
[app1]
web1
db1
- 动态主机
-无线可能
-ansible inventory 包含静态和动态的inventory指在文件/etc/ansible/hosts中指定的主机和组,
动态inventory指通过外部脚本获取主机列表,按照其要求格式返回给ansilbe命令
json 对象表示法 一种基于文本独立与语言的轻量级数据交换格式
批量配置管理
ansible-doc和平模块
ansible-doc
-模块的手册相当与shell的man,很重要
ansible-doc -l 列出所有模块
ansible-doc modulename 查看帮助
ping模块
-测试网络链接通性,平模块没有参数
-ansible host-pattern -m ping
command模块
默认模块,远程执行命令
ansible host-pattern -m command -a '[args]'
若命令里面有如下字符则执行不成功 <>| & ;command 模块不能解析系统变量
该模块不启动动shell直接在ssh进程中执行,所有使用到shell的命令执行都会失败
下列命令执行会失败
ansible all -m command -a 'ps aux | grep shh'
shell模块用法基本和command一样,区别是shell模块是通过/bin/sh进行命令.可以执行任意命令
不能执行交互式的命令 例如 vim top等
变量解析
ansible执行命令是二次解析
第一次在本机解析 第二次在执行机器解析
需要第二次解析的变量转义(\)
文件在哪里
文件在用户家目录
ansible是使用ssh多次链接执行
连接退出以后之前的状态就全部失效了
解决方法:使用chdir 代替cd命令
ansible cache -m shell -a 'chdir=/tmp touch testfule'
sciptmokuai
在本地写脚本,然后使用script模块批量执行
ansible web -m script -a 'utscript'
yum模块
-使用域名包管理器来管理软件包
-name:要进行操作的软件包名字
state:动作(installed,removed)
-install ====installed
-remove====removed
ansible db -m yum -a '那么="lrzsz" state=removed'
service模块
-name:必选项 服务名称
enabled :是否开机自启 yes|no
sleep:执行restarted 会在stop和start之间沉睡几秒钟
state:对当前服务执行启动,停止重启重新加载等操作(started,stoppedrestarted,reloaded)
ansible cache -吗 service -a 'anmed="sshd" enabled="yes" "statestarted"
copy有模块
-赋值文件到远程主机
src:赋值本地文件到远程主机,绝对路径和相对路径都可,路径为目录是会递归复制,若路径以"/"结尾,支付至目录里的内容,若不易"/"结尾,则复制包含目录在内的整个内容,类似于rsync
dest:必选项 远程主机的绝对路径 如果源文件是一个目录 哪该路径必须是目录
backup:覆盖先前备份源文件,备份文件包含时间信息.有两个选择:yes|no
force:若目标主机包含该文件,大内容不同,如果设置为yes,则强制覆盖设置为no 则只有当目标主机的目标位置不催在该文件时才复制.默认为yes
linesinfilemokuai
类似与sed的一种行编辑替换模块
path 目标文件
regrep 正则表达式,要修改的行
line 最终修改结果
ansible db -吗 lineinfile -a 'path="/etc/my.cnf" regrep="^binlog-format" line="binlog-format=row"'
replace模块
类似于sed的一种编辑替代模块
path目的文件
regep正则表达式
replace替换后的结果
替换指定字符 row --> maixed
ansible db -m replace -a ' path="/etc/mycnf" regrep="row" replcae="mixed"'
setup模块
主要用于获取主机信息,playbooks里经常会用的另一个参数gather_facts与该模块行管,setup模块下经常用的是filter参数
filter过滤所需信息
ansible cache -吗 setup -a 'filter=ansible_distribution'