一:ansible, saltstack
1.ansible:基于python开发,分布式,无客户端,轻量级,配置语言采用YAML,加密方式:open SSH,支持二次开发
2.saltstack:基于python开发,采用C/S架构,相对于puppet更轻量级,采用配置语法YAML,加密方式:AES,支持二次开发
二:选择ansible原因?
1.没有客户端比puppet和saltstack更轻量级
2.不用启动服务,只是一个工具,很轻松实现分布式扩展
3.更强的远程执行命令操作
4.不输于puppet和saltstack其他功能:
Ansible优点: (1):模块可以使用任何语言开发
(2):被管节点不需要安装代理软件
(3):安装运行很简单
(4):右web管理界面,可以配置用户,组资源清单和执行playbook
Ansible缺点:
1)对备管理节点为Windows有待加强
(2)Web管理界面是内置的Ansible的一部分
(3)需导入资源清单
(4)执行效率较低
Ansible特性:
模块化:调用特定的模块,完成特定的任务
Paramiko (Python对ssh的实现),PyYaml,Jinja2(模板语言)三个关键模块
支持自定义模块,可使用任何编程语言写模块
基于Python语言实现
部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖KPI(无需SSL)
安全,基于OpenSSH
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
较强大的多层解决方案role
Ansible工具目标:
自动化部署APP
自动化管理配置项
自动化的持续交付
自动化的云服务管理
ansible是基于模块工作的,本身没有批量部署的能力。 真正具有批量部署的是ansible所运行的模块,ansible
只是提供一种框架
Ansible命令执行来源:
1> USER,普通用户,即SYSTEM ADMINISTRATOR
2> CMDB(配置管理数据库) API 调用
3> PUBLIC/PRIVATE CLOUD API调用 (公有私有云的API接口调用)
4> USER-> Ansible Playbook -> Ansibile
利用ansible实现管理的方式:
1> Ad-Hoc 即ansible单条命令,主要用于临时命令使用场景
2> Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程
Ansible-playbook(剧本)执行过程 :
将已有编排好的任务集写入Ansible-Playbook
通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行
Ansible主要操作对象
HOSTS主机
NETWORKING网络设备
注意事项:
执行ansible的主机一般称为主控端,中控,master或堡垒机
主控端Python版本需要2.6或以上
被控端Python版本小于2.4需要安装python-simplejson
被控端如开启SELinux需要安装libselinux-python
windows不能做为主控端 ansible不是服务,不会一直启动,只是需要的时候启动
asnsible的原理及机制:
1.用户
执行命令或者playbook
2.INI解析配置文件
从主机清单中解析出IP地址
3.执行ssh连接到主机
4.到被控机创建临时目录
5.给临时目录加执行权限
6.执行python脚本
7.删除临时目录和脚本
主机清单:
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,
可以在inventory file中将其分组命名
2> 默认的inventory file为/etc/ansible/hosts
3> inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成
Ansible 配置文件:/etc/ansible/ansible.cfg:
Ansible系列命令:
Ansible-doc -l 列出所有模块
Ansible-doc ping 查看指定模块的帮助用法
Ansible-doc -s ping 查看指定模块的帮助用法
ansible通过ssh实现配置管理 应用部署 任务执行等功能
ansible all --list 列出所有主机
1.ping模块:探测网络中被管理主机是否能够正常使用 走ssh协议
如果对方主机网络正常 返回pong
1.检测所有主机的网络状态:默认情况被管理的主机是ssh基于key验证
Ansible all -m ping -k
2.或者实现基于key验证 将公钥ssh-copy-id 到被管理的主机上:
Ansible all -m ping
Ansible的Host-Pattern:
All:
Ansible all -m ping 表示所有主机清单中的主机
通配符:
Ansible “*” -m ping (*表示所有主机)
Ansible 192.168.230.* -m ping
Ansible "*srvs" -m ping
或关系“:”
Ansible "webservers:appsrvs" -m ping
Ansible "192.168.230.150:192.168.230.151" -m ping
逻辑与“:&”
Ansible "websrvs:&dbsrvs" -m ping
在websrvs组并且在dbsrvs组的主机
逻辑非“:!”
Ansible "websrvs:!&dbsrvs" -m ping
在websrvs组但不在dbsrvs组的主机
综合逻辑
Ansible 'webservers:dbservers:&appsrvs:!ftpsrvs' -m ping
正则表达式
Ansible "websrvs:&dbsrvs" -m ping
Ansble "~(web|db).*\.magedu\.com" m ping
ansible命令执行过程:
查看详细执行过程:
ansible all –m ping –v
ansible all –m ping –vv
ansible all –m ping –vvv
ansible使用案列:
以wang用户执行ping存活检测
ansible all -m ping -u wang -k
以wang sudo至root执行ping存活检测 (注意把普通用户加入到/etc/sudoers中,-K为询问特权密码,
-k为询问连接密码)
ansible all -m ping -u wang -k -b -K
以wang sudo至mage用户执行ping存活检测
ansible all -m ping -u wang -k -b --become-user=mage -K
以wang sudo至root用户执行(-m command为默认模块,可加可不加)
ansible all -m command -u wang -a 'ls /root' -b --become-user=root -k -K
ping模块测试连接
ansible 192.168.38.126,192.168.38.127 -m ping -k
列出所有管理的主机
ansible all --list-hosts
目录
一:ansible, saltstack
二:选择ansible原因?
Ansible工具目标:
asnsible的原理及机制:
ansible命令执行过程:
执行命令异常:
原因:
没有在ansible管理节点(即安装ansible的节点)上添加目标节点(即需要管理的节点)的ssh认证信息
解决办法:1.在管理节点生成公钥: ssh-keygen
2.添加目标结点的ssh认证信息 在管理节点执行:
ssh-copy-id root@destip(目标节点IP)
2.Command模块具有局限性:
Command模块 不支持特殊符号,| > * ,也不支持变量
Ansible 被控主机 -m command -a "echo centos | passwd --stdin wang "
3.shell模块:
Shell命令是通过/bin/sh进行执行的,command命令没有shell的环境变量,因此不支持特殊符号或变量的操
作。
4.script模块
在远程机器上执行本地脚本
ansible-doc -s script
ansible db -m script -a "/root/a.sh" # 执行本地的文件,管控机的文件
ansible db -m script -a "creates=/root/a.sh /root/a.sh" # 判断被控机上的文件是否存在,如果不存在,就执行,如果存在,就跳过
ansible db -m script -a “creates=/tmp /root/a.sh” # 判断被控机上的文件或目录是否存在,如果存在则不执
行,如果不存在,则执行
5.Copy模块
从ansible服务器主控端复制文件到远程主机
ansible all -m copy -a "src=/etc/fstab dest=/tmp/”
#如果目标存在,默认覆盖,此处指定先备份
ansible srv -m copy -a “src=/root/test.sh dest=/tmp/test2.sh owner=wang mode=600 backup=yes”
#指定内容,直接生成目标文件
ansible websrvs -m copy -a “content=‘test line1\ntest lin2’ dest=/tmp/test.txt”
#复制/etc/下的文件,不包括/etc/目录本身
ansible srv -m copy -a “src=/etc/ dest=/backup”
6.Fetch模块
从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
ansible srv -m fetch -a ‘src=/root/test1.sh dest=/data/scripts’
7.file模块
功能:设置文件属性
#创建空文件
ansible srv -m file -a ‘path=/data/test.txt state=touch’
#删除空文件
ansible srv -m file -a ‘path=/data/test.txt state=absent’
#创建文件时,指定文件属主和权限
ansible srv -m file -a ‘path=/root/test.txt owner=linux mod=755’
#创建目录
ansible srv -m file -a ‘path=/data/mysql state=directory owner=mysql group=mysql’
#删除目录
ansible srv -m file -a ‘path=/data/mysql state=absent’
#创建软链接
ansible srv -m file -a ‘src=/data/testfile dest=/data/testfile-link state=link’
#删除软链接
ansible srv -m file -a ‘src=/data/testfile dest=/data/testfile-link state=absent’