网站建设技术交流qq,大兴网站建设制作,巩义网站公司,ps做网站图本文主要是分享介绍三款主流批量操控工具Ansible、Saltstack、Puppet主要对比区别#xff0c;以及Ansible和saltstack的基础安装和使用示例#xff0c;如果觉得本文对你有帮助#xff0c;欢迎点赞、收藏、评论#xff01; There are many things that can not be broken以及Ansible和saltstack的基础安装和使用示例如果觉得本文对你有帮助欢迎点赞、收藏、评论 There are many things that can not be broken
一、自动化运维工具的选择
1、为什么要用自动化运维工具
运维的痛点:
海量的设备越来越多每台设备单独管理需要投入更多人力
传统运维效率低大多工作人为完成
传统运维工作繁琐人工操作容易出错
传统运维每日重复做相同的事情
传统运维没有标准化流程执行的过程不可控执行的结果不统一
传统运维的脚本繁多不能方便管理。
自动化运维工具就是要解决上面所有问题。
2、自动化运维工具有哪些
市场上主流的三大开源自动化配置管理工具有Puppet、Ansible、SaltStack。
Puppet 使用一种描述性的语言给客户端声明了一些状态配置puppet基于传统的C/S架构架构中通常有一台服务器负责对下游客户端的控制。每个被控制的设备都要安装puppet客户端。puppet使用ruby语言编写而ruby语言是解析型语言所谓解析型语言就是ruby语言的每次执行都需要借助翻译器将ruby语言翻译成可以被CPU直接执行的机器码。 SaltStack SaltStack是基于Python开发的一套C/S架构配置管理工具功能不仅仅是配置管理如使用salt-cloud配置AWS EC2实例它的底层使用ZeroMQ消息队列pub/sub方式通信使用SSL证书签发的方式进行认证管理。采用号称世界上最快的消息队列ZeroMQ使得SaltStack能快速在成千上万台机器上进行各种操作而且采用RSA Key方式确认身份传输采用AES加密这使得它的安全性得到了保障。 Ansible ansible是一个基于python开发的轻量级自动化运维管理工具可以用来批量执行命令安装程序支持playbook编排。它通过ssh协议来连接主机去中心化相对比puppet和saltstack无需安装客户即可实现文件传输、命令执行、应用部署、配置管理、任务编排等显得更为简单与轻量。ansible只是提供一种框架其基于模块工作的本身没有批量部署。 3、自动化运维工具的对比
技术特性对比 优缺点对比 4、salt还是ansible 1、响应速度的考量
SaltStack的master和minion主机是通过ZeroMQ传输数据而Ansible是通过标准SSH进行数据传输SaltStack的响应速度要比Ansible快很多。标准SSH连接的时候比较耗费时间ZeroMQ传输的速度会快很多所以单单从响应速度方面考虑SaltStack会是更好的选择。但是在一般的运维场景下Ansible的响应速度也可以满足需求。
2、安全的考量
Ansible和SaltStack都需要和远程主机进行连接它们的最大的安全问题就是MITM攻击通过伪装成Master主机和远程主机进行通信从而进行攻击。 SaltStack使用ZeroMQ进行数据传输ZeroMQ本身数据传输不支持加密SaltStack可以通过使用AES数据加密方法来对数据进行加密传输但是SaltStack的minion主机以守护进程的方式运行在远端暴露了很多容易被攻击的点。
3、运维成本的考量
SaltStack需要在Master和Minion主机启动守护进程自身需要检测守护进程的运行状态增加运维成本。Ansible和远端主机之间的通信是通过标准SSH进行远程主机上只需要运行SSH进程就可以进行运维操作SSH是机房主机中一般都安装和启动的进程所以在Ansible进行运维的时候只需要关注Ansible主机的运行状态。Ansible对机房运维不会增加过多的运维成本。从工具本身的运维角度来说Ansible要比SaltStack简单很多。
二、Saltstack安装与使用
1、saltstack的架构 在SaltsStack架构中服务端叫作Master客户端叫作Minion都是以守护进程的模式运行一直监听配置文件中定义的ret_portsaltstack客户端与服务端通信的端口负责接收客户端发送过来的结果默认4506端口和publish_portsaltstack的消息发布系统默认4505端口的端口。当Minion运行时会自动连接到配置文件中定义的Master地址ret_port端口进行连接认证。 Master控制中心,salt命令运行和资源状态管理 Minion : 需要管理的客户端机器,会主动去连接Mater端, 并从Master端得到资源状态信息,同步资源管理信息 States配置管理的指令集 Modules在命令行中和配置文件中使用的指令模块,可以在命令行 中运行 Grainsminion端的变量,静态的 Pillarminion端的变量,动态的比较私密的变量,可以通过 配置文件实现同步minions定义 highstate为minion端下发永久添加状态,从sls配置文件读取. 即同步状态配置 salt_schedule会自动保持客户端配置 2、saltstack的安装配置
1安装部署
建议从官网下载安装包配置saltstack的yum源可以离线安装部署
服务端
yum install -y salt-master.noarch
客户端
yum install -y salt-minion.noarch
saltstack官方提供了各种版本系统安装方法地址http://repo.saltstack.com/#rhel
2服务启动和客户端配置
[rootmaster ~]#systemctl enable salt-master
[rootmaster ~]#systemctl start salt-master
客户端上
[rootclient ~]# sed -i s/#master: salt/master: masterip/g /etc/salt/minion
[rootclient ~]# sed -i s/#id:/id: clientip/g /etc/salt/minion
[rootclient ~]#systemctl enable salt-minion
[rootclient ~]#systemctl start salt-minion
3、SaltStack使用
A.Master与Minion认证
minion在第一次启动时会在/etc/salt/pki/minion/下自动生成minion.pemprivate key和 minion.pubpublic key然后将 minion.pub发送给master。master在接收到minion的public key后通过salt-key命令accept minion public key这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的 public key然后master就能对minion发送指令了。
认证命令如下 [rootmaster ~]# salt-key –L #查看当前证书签证情况 Accepted Keys: Unaccepted Keys: 192.168.100.100 Rejected Keys: salt-key –a 接受某个客户端请求
salt-key –A 接受所有客户端请求
salt-key –d 删除单个客户端
salt-key –D 删除所有客户端
B:常用模块
1、测试连接情况 salt * test.ping
# 测试saltstack minion与master的连通性。 *表示所有目标机器 test.ping 只是模块里的一个功能用来测试连通性
# 测试指定受控端主机是否存活 [rootmaster ~]# salt node1 test.ping node1: True 2、远程执行命令 salt [options] ‘目标机’ 功能 [arguments]
# 例如 #对机器node1使用uptime命令
salt node1 cmd.run uptime
3、文件分发模块
# salt-cp 分发文件到minion上,不支持目录分发通常在master运行
salt-cp [options] target SOURCE DEST
salt-cp * testfile.html /tmp salt-cp node* /opt/index.html /tmp/a.html
4、其他常用模块命令 salt * network.active_tcp # 查看tcp连接情况 salt * network.get_hostname # 查看主机名 salt * service.available sshd # 查看ssh服务是否可达 salt * service.get_all # 查看所有启动的服务 salt * service.status nginx # 查看指定服务是否在线 salt * sys.doc pkg #查看pkg模块文档 # salt内置的执行模块列表 http://docs.saltstack.cn/ref/modules/all/index.html C:配置状态管理
salt states的核心是sls文件该文件使用YAML语法定义了一些k/v的数据。
sls文件存放根路径在master配置文件中定义默认为/srv/salt,该目录在操作系统上不存在需要手动创建。
在salt中可以通过salt://代替根路径例如你可以通过salt://top.sls访问/srv/salt/top.sls。 在states中top文件也由master配置文件定义默认为top.sls该文件为states的入口文件。 一个简单的sls文件如下
# 1.描述了要装一个httpd服务 apache-install: # 这个是一个名称可以随便写 pkg.installed: # pkg是状态模块installed是状态模块中的方法 - name: httpd # 描述了我在里要装一个httpd包 # 2.描述了httpd服务是启动状态并且是开机自启动状态 apache-service: # 这个是一个名称可以随便写 service.running: # 描述了httpd服务是运行的状态 - name: httpd - enable: True # 描述httpd服务开机自动启动 # salt node1 apache.sls D:grains.item模块
功能获取机器基本信息cpu、内存 # 1、查看系统版本 # salt node1 grains.item os # 2、查看cpu型号 # salt node1 grains.item cpu_model # 3、获取ipv4地址 # salt node1 grains.item fqdn_ip4 # 4、查询内核版本 # salt node1 grains.item kernelrelease # 5、查看主机名 # salt node1 grains.item nodename # 6、查看系统版本号 centos6、centos7等 # salt node1 grains.item osmajorrelease # 7、查看salt版本 # salt node1 grains.item saltversion # 8、查看cpu数据量 # salt node1 grains.item num_cpus # 9、查看内存大小 # salt node1 grains.item mem_total # 10、查看ipv4地址 # salt node1 grains.item ipv4 三、Ansible的安装与使用 1、Ansible架构
ansible基于Python开发集合了众多运维工具puppet、cfengine、chef、func、fabric的优点实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的本身没有批量部署的能力。 真正具有批量部署的是ansible所运行的模块ansible只是提供一种框架。 核心组件包括 (1)、连接插件connection plugins负责和被监控端实现通信 (2)、host inventory指定操作的主机是一个配置文件里面定义监控的主机 (3)、各种模块核心模块、command模块、自定义模块 (4)、借助于插件完成记录日志邮件等功能 (5)、playbook剧本执行多个任务时非必需可以让节点一次性运行多个任务。 2、Ansible安装配置
AAnsible安装
1、在线安装
root yum -y install epel-release root yum install ansible
2、离线安装
Yum分析下载依赖 根据目标主机所用操作系统在实验环境安装一个新的操作系统利用yum分析依赖并下载依赖包到指定目录。
rootyum install -y ansible --downloadonly --downloaddir/root/ansible
打包并上传到目标主机
roottar -cvf ansible.tar ./root/ansible
目标主机解压并执行安装脚本
roottar -xvf ansible.tar cd ansible sh install.sh
其中安装脚本就是根据Yum依赖顺序依次rpm -Uvh 依赖包
B、Ansible主配置文件
Ansible 配置文件/etc/ansible/ansible.cfg vim /etc/ansible/ansible.cfg [defaults] #inventory /etc/ansible/hosts # 主机列表配置文件 #library /usr/share/my_modules/ # 库文件存放目录 #remote_tmp $HOME/.ansible/tmp # 临时py命令文件存放在远程主机目录 #local_tmp $HOME/.ansible/tmp # 本机的临时命令执行目录 #forks 5 # 默认并发数,同时可以执行5次 #sudo_user root # 默认sudo 用户 #ask_sudo_pass True # 每次执行ansible命令是否询问ssh密码 #ask_pass True # 每次执行ansible命令是否询问ssh口令 #remote_port 22 # 远程主机的端口号(默认22) 建议优化项 host_key_checking False # 检查对应服务器的host_key建议取消注释 log_path/var/log/ansible.log # 日志文件,建议取消注释 module_name command # 默认模块 C:INVENTORY清单
Inventory 文件用来定义你要管理的主机。其默认位置在 /etc/ansible/hosts 如果不保存在默认位置也可通过 -i 选项指定。 被管理的机器可以通过其 IP 或域名指定。未分组的机器需保留在 hosts 的顶部分组 可以使用 [] 指定如 [web] linuxtoy.org 同时分组也能嵌套 [vps:children] web db 此外也可以通过数字和字母模式来指定一系列连续主机如 [1:3].linuxtoy.org # 等价于 1.linuxtoy.org、2.linuxtoy.org、3.linuxtoy.org [a:c].linuxtoy.org # 等价于 a.linuxtoy.org、b.linuxtoy.org、c.linuxtoy.org
可以在每个主机后面指定用户名密码ansible_ssh_userxxx ansible_ssh_passpassword
如若目标主机使用了非默认的SSH端口还可以在主机名称之后使用冒号加端口号来标明 如 www1.magedu.com:2222 可以指定端口 D、小试牛刀
现在我们执行以下命令来看看 Ansible 是否能正常工作 ansible -i hosts all -m ping -u www 该命令选项的作用分别为 -i指定 inventory 文件使用当前目录下的 hosts all针对 hosts 定义的所有主机执行这里也可以指定组名或模式 -m指定所用的模块我们使用 Ansible 内置的 ping 模块来检查能否正常管理远端机器 -u指定远端机器的用户 如果返回如下结果 linuxtoy.org | success { changed: false, ping: pong } 则说明一切正常。 下面我们再看看远端机器的 uptime ansible vps -a uptime #这将输出 linuxtoy.org | success | rc0 11:23:16 up 177 days, 21:19, 0 users, load average: 0.55, 0.45, 0.39 此处我们省略了 -mAnsible 默认使用 command 模块-a 指定模块的参数即执行 uptime 命令。 3、Ansible使用
A: ansible命令参数
ansible通过ssh实现配置管理、应用部署、任务执行等功能 建议配置ansible端能基于密钥认证的方式联系各被管理节点
ansible host-pattern [-m module_name] [-a args]
ansible 被管理的主机(ALL) 模块 参数 --version 显示版本 -m module 指定模块默认为command -v 详细过程 –vv -vvv更详细 --list-hosts 显示主机列表可简写 --list -k, --ask-pass 提示输入ssh连接密码,默认Key验证 -C, --check 检查并不执行 -T, --timeoutTIMEOUT 执行命令的超时时间,默认10s -u, --userREMOTE_USER 执行远程执行的用户 -b, --become 代替旧版的sudo切换 --become-userUSERNAME 指定sudo的runas用户,默认为root -K, --ask-become-pass 提示输入sudo时的口令
B: ansible使用检测 ansible all --list 列出所有主机 ping模块: 探测网络中被管理主机是否能够正常使用 走ssh协议 如果对方主机网络正常,返回pong ansible-doc -s ping 查看ping模块的语法
检测所有主机的网络状态 1 默认情况下连接被管理的主机是ssh基于key验证,如果没有配置key,权限将会被拒绝 因此需要指定以谁的身份连接,输入用户密码,必须保证被管理主机用户密码一致 ansible all -m ping -k
2 或者实现基于key验证 将公钥ssh-copy-id到被管理的主机上 , 实现免密登录 ansible all -m ping
C: ansible常用模块 1.command模块 Command在远程主机执行命令默认模块可忽略-m选项 ansible srvs -m command -a service vsftpd start ansible srvs -m command -a echo adong |passwd --stdin 123456 此命令不支持 $VARNAME | ; 等特殊符号,需要用shell模块实现 chdir: 进入到被管理主机目录 creates: 如果有一个目录是存在的,步骤将不会运行Command命令 ansible websrvs -a chdir/data/ ls
2.shell模块 Shell和command相似用shell执行命令 ansible all -m shell -a getenforce 查看SELINUX状态 ansible all -m shell -a sed -i s/SELINUX.*/SELINUXdisabled /etc/selinux/config ansible srv -m shell -a echo magedu |passwd –stdin wang 调用bash执行命令 类似 cat /tmp/stanley.md | awk -F| {print $1,$2} /tmp/example.txt 这些复杂命令即使使用shell也可能会失败 解决办法写到脚本时copy到远程执行再把需要的结果拉回执行命令的机器
3.script模块 Script在远程主机上运行ansible服务器上的脚本 -a /PATH/TO/SCRIPT_FILE ansible websrvs -m script -a /data/test.sh
4.copy模块 Copy从主控端复制文件到远程主机 src : 源文件 指定拷贝文件的本地路径 (如果有/ 则拷贝目录内容,比拷贝目录本身) dest: 指定目标路径 mode: 设置权限 backup: 备份源文件 content: 代替src 指定本机文件内容,生成目标主机文件 ansible websrvs -m copy -a src/root/test1.sh dest/tmp/test2.shownerwang mode600 backupyes 如果目标存在默认覆盖此处指定先备份 ansible websrvs -m copy -a contenttest content\nxxx dest/tmp/test.txt 指定内容直接生成目标文件
5、File模块 File设置文件属性 path: 要管理的文件路径 (强制添加) recurse: 递归,文件夹要用递归 src: 创建硬链接,软链接时,指定源目标,配合statelink statehard 设置软链接,硬链接 state: 状态 absent 缺席,删除 ansible websrvs -m file -a path/app/test.txt statetouch 创建文件 ansible websrvs -m file -a path/data/testdir statedirectory 创建目录 ansible websrvs -m file -a path/root/test.sh ownerwang mode755 设置权限755 ansible websrvs -m file -a src/data/testfile dest/data/testfile-link statelink 创建软链接
6、Cron模块 Cron计划任务 支持时间minute,hour,day,month,weekday ansible websrvs -m cron -a minute*/5 job/usr/sbin/ntpdate 172.16.0.1 /dev/null nameSynctime 创建任务 ansible websrvs -m cron -a stateabsent nameSynctime 删除任务 ansible websrvs -m cron -a minute*/10 job/usr/sbin/ntpdate 172.30.0.100 namesynctime disabledyes 注释任务,不在生效 D: ansible-playbook 对于需反复执行的、较为复杂的任务我们可以通过定义 Playbook 来搞定。Playbook 是 Ansible 真正强大的地方它允许使用变量、条件、循环、以及模板也能通过角色 及包含指令来重用既有内容。我们来看一个简单的例子该例子在远端机器上创建一个 新的用户 --- - name: create user hosts: vps user: root gather_facts: false vars: - user: toy tasks: - name: create {{ user }} on vps user: name{{ user }} 首先我们给 Playbook 指定了一个名称接着通过 hosts 让该 Playbook 仅作用于 vps 组user 指定以 root 帐号执行Ansible 也支持普通用户以 sudo 方式执行gather_facts 的作用是搜集远端机器的相关信息稍后可通过变量形式在 Playbook 中使用vars 定义变量也可单独放在文件中tasks 指定要执行的任务。 要执行 Playbook可以敲入 ansible-playbook user.yml
E: ansible-roles Ansible自1.2版本之后引入了Roles的新特性以便层次性和结构化的组织Playbook。相比于Ansible命令的方式进行控制Ansible Playbook的控制方式极大的提升了Ansible对于被控端设备的管理能力。但是如果我们想配置更加复杂的被控端环境那么单单的将所有的配置命令写成一个Playbook文件就可多达成百上千行。这极不利于Ansible Playbook的管理和维护。 相比于Ansible PlaybookRoles能够层次型结构自动装载变量、任务以及handlers。在本质上Ansible Roles就是将变量、任务、模板以及处理器分别的放在不同的目录中并通过include的方式进行调用并组合成一个整体。 一个项目从开始到结束不是简单几十个playbook就可以完事了当文件数很多有上百个的话仅通过简单的includes不停的引用那最终的结果错综复杂。这个时候ansible roles就可以很好的发挥它的作用了。 每个角色的格式一特定的层级目录结构进行组织如下 mysql/ files/ templates/ tasks/ handlers/ vars/ meta/
在playbook中调用角色的方式 - hosts webservers remote_user: root roles: - mysql