问:
Q1.请问你如何去高效率管理已开机的且有系统的10000台计算机?例如,给这10000台计算机安装vsftpd软件。
A.采用ssh来批量远程管理或采用ansible、puppet(由google公司开发)、saltstack等自动化部署工具来远程管理这10000台服务器。
Q2.如何采用ansible来远程管理这10000台服务器?
A.只需要在linux工程师的个人电脑上安装ansible软件,并添加需要管理的10000台计算机的IP地址信息到这台电脑上,在这台电脑上用ssh-keygen生成秘钥对(私钥和公钥),用ssh-copy-id root@192.168.11.$i将公钥id_rsa.pub发送到这10000台计算机上。最后用ansible来远程管理这1万台计算机。
一 . Ansible简介
ansible基于python开发 , 集合了众多运维工具(puppet , cfengine , chef , func , fabric)的优点 , 实现了批量系统配置 , 批量程序部署 , 批量运行命令等功能 ; ansible是基于模块工作的 , 本身没有批量部署的能力 , 真正具有批量部署的是ansible所运行的模块 ,ansible只是提供一种框架 .
几种运维工具比较
Puppet | 基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱 |
SaltStack | 基于 Python 开发,采用 C/S 架构,相对 puppet 更轻量级,配置语法使用 YAML,使得配置脚本更简单 |
Ansible | 基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用YAML 及 Jinja2模板语言,更强的远程命令执行操作 |
ansible图解:
connection plugins:连接插件,负责和被管理端实现通信,有SSH,ZEROMQ等,默认使用SSH连接
host inventory:主机清单,是一个配置文件里面定义监控的主机。配置文件位于/etc/ansible/hosts
modules : 模块,核心模块、command模块、ping模块、shell模块、cron模块、file模块、自定义模块等
plugins : modules功能的补充,包括连接插件,邮件插件等
playbook:编排(即剧本、脚本功能),定义 Ansible 多任务配置文件,非必需
Ansible特性
no agents : 不需要在被管主机上安装任何客户端 , 更新时 , 只需要在操纵机上进行一次更新即可
no server : 无服务器端 , 使用时直接运行命令即可
modules in any languages : 基于模块工作 , 可使用任意语言开发模块
yaml node code : 使用yaml语言制定剧本playbook
ssh by default : 基于ssh工作
strong multi-tier solution : 可实现多级指挥
Ansible下载和安装
可以下载阿里的centos7网络yum源配置文件,下载epel第三方扩展网络yum源配置文件
步骤:
在阿里云的yum源网站查看centos , epel的yum源帮助 ,下载阿里云centos7的yum源文件和epel第三方扩展网络yum源配置文件
阿里云的yum源网站 : https://opsx.alibaba.com/mirror
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
清除yum缓存 , 并生成新的yum缓存云数据
yun clean all
yum makecache fast
用yum下载ansible软件
yum install ansible --downloadonly --downloaddir=/ansible7 #下载ansible , 并指定目录为/ansible7
ls /ansible7 #查看/ansible7目录
createrepo /ansible7 #生成yum的repodata仓库数据库(metadata 元数据)文件夹和文件
注解: metadata元数据,又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
创建ansible7的yum配置文件(此处以脚本方式)
cat > /etc/yum.repos.d/ansible7.repo <<EOF
[ansible7]
name=ansible 7 software
baseurl=file:///ansible7
enabled=1
gpgcheck=0
EOF
删除网络yum源配置文件 , 清除yum缓存 , 用ansible的本地yum源来安装此软件
cd /etc/yum.repos.d
ls
rm -fv C*.repo epel.repo
yum clean all
yum repolist
yum search ansible
yum install -y ansible
查看ansible配置文件
rpm -qc ansible
/etc/ansible/ansible.cfg #主配置文件,主要设置一些ansible初始化的信息,比如日志存放路径、模块、插件等配置信息
/etc/ansible/hosts #主机清单文件,定义所管理的主机组及主机,可以在主配置文件中修改
主机清单文件配置格式
[webservers]
192.168.11.11
Bar.example.com
up.example.com:5309 #指定 SSH 端口 5309
web1 ansible_ssh_host=192.168.1.50 #设置主机别名为 web1
www[01:50].example.com #支持通配符匹配www01,www02,...,www50
db-[a:f].example.com #通配符匹配db-a,db-b,...,db-f
-----------------------------------------------------------------
为每个主机单独指定一些变量,这些变量可以在 playbooks 中使用:
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
------------------------------------------------------------------
为一个组指定变量,组内每个主机都可以使用该变量:
[atlanta]
host1
host2
[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
-----------------------------------------------------------------
组可以包含其他组:
[atlanta]
host1
host2
[raleigh]
host3
host4
[southeast:children]
atlanta
raleigh
[southeast:vars]
some_server=foo.southeast.example.com
halon_system_timeout=30
===================================
hosts文件支持一些特定指令:
ansible_ssh_host:指定主机别名对应的真实 IP
ansible_ssh_port:指定连接到这个主机的 ssh 端口,默认 22
ansible_ssh_user:连接到该主机的 ssh 用户
ansible_ssh_pass:连接到该主机的 ssh 密码,安全考虑还是建议使用私钥,或在命令行指定-k 选项输入
ansible_sudo_pass:sudo 密码
ansible_sudo_exe(v1.8+的新特性):sudo 命令路径
ansible_connection:连接类型,可以是 local、ssh 或 paramiko等
ansible_ssh_private_key_file:私钥文件路径
ansible_shell_type:目标系统的 shell 类型,默认为 sh,如果设置 csh/fish,那么命令需要遵循它们语法
ansible_python_interpreter:python 解释器路径,默认是/usr/bin/python,但是如要要连*BSD系统的话,就需要该指令修改 python 路径
Ansible的简单使用
基本命令格式:
ansible <pattern> -m <module_name> -a <arguments>
pattern : 主机清单里定义的主机组名 , 主机名 , IP , 别名等 all表示所有的主机 , 支持通配符 , 正则表达式
(:)- 多个组 , 组名之间用冒号隔开
*web* -组名或主机名中含web的
webservers[0] - webservers组中的第一台主机
以~开头 , 匹配正则
-m moddule_name :模块名称 , 默认为command
-a arguments : 传递给模块的参数
帮助信息查看:
ansible-doc -l #查看所有信息模块
ansible-doc module_name #查看模块帮助信息
配置过程: 在控制节点安装ansible --> 在控制节点生成密钥 , 把公钥传到所有的被控制节点 --> 编辑主机清单文件 , 加入被管控的节点
简单使用示例:
准备3台Linux系统主机[主机1:192.168.11.11 主机2:192.168.11.12 主机3:192.168.11.12]
控制节点[192.168.11.11]
生成密钥对 , 上传公钥给要管理的主机:
ssh-keygen #生成密钥
ssh-copy-id root@192.168.11.12 #上传公钥
ssh-copy-id root@192.168.11.13
ssh root@192.168.11.12[13] date #验证双机互信
编辑主机清单文件 vim /etc/ansible/hosts :
[gg] #组名
192.168.11.12 #成员
192.168.11.13
测试ansible的使用 :
ansible 主机组名或IP -m 模块名 -a '模块的选项和参数'
-m 指定模块,常见的模块有ping、shell、command、cron、user、group、yum等
-a 指定模块的选项参数,参数中state状态有present(现在就有,用于创建)、absent(缺席的,用于删除)两种
1.ping 上述gg组的所有成员
2.使用ansible指定shell模块对192.168.11.12进行查看IP的操作
ansible 192.168.11.12 -m shell -a 'ip a'
3.使用ansible对192.168.11.13查看192.168.11.13主机上/etc/passwd文件最后5行
4.用ansible给gg主机组中的所有主机新增ggg用户然后删除ggg用户:
ansible gg -m user -a "name='ggg' shell='/sbin/nologin' state='present'" #调用user模块来创建用户
ansible gg -m shell -a 'id ggg;tail -5 /etc/passwd'
ansible gg -m user -a "name='ggg' remove='yes' state='absent'" #调用user模块来创建用户
ansible gg -m shell -a 'id ggg;tail -5 /etc/passwd'
ansible常用模块
setup : 查看远程主机的基本信息 例:ansible qf -m setup
作用 : 收集可用的facts,收集每个节点的相关信息, 如: 架构信息,IP,时间,域名,网卡,MAC,主机名,CPU等信息
ping: 测试远程主机的运行状态
file: 设置文件属性 例:ansible 192.168.11.12 -m file "path='/ak/bk' state='directory'"
copy: 把主控端的文件复制到远程主机
shell: shell命令
ansible默认使用的模块是command,支持多数shell命令,但不支持某些shell变量及管道,如果要使用,用shell模块
user: 用户管理
cron: 计划任务管理
script: 将本地脚本传输到远程执行
service: 服务管理(el7:systemd)
lineinfile: 文件编辑
yum: 使用yum管理软件包
模块选项和详细使用可用 ansible-doc module_name 查看模块 , 例如:
查看user模块 , 可以看到user模块的选项和实例等;
Ansible--playbook
Playbooks 是 Ansible 管理配置、部署应用和编排的语言,可以使用 Playbooks 来描述你想在远程主机执行的策略或者执行的一组步骤过程等 ; 如果说 Ansible 模块是工作中的工具的话,那么 playbooks 就是方案 , Playbooks 采用 YAML 语法结构
Playbooks 组成
Target section : 定义将要执行 playbook 的远程主机组
Variable section : 定义 playbook 运行时需要使用的变量
Task section :定义将要在远程主机上执行的任务列表
Handler section : 定义 task 执行完成以后需要调用的任务
简单示例1:
[root@master ~]# cd /etc/ansible/
[root@master ansible]# vim test.yml #后缀为yml
---
- hosts: testhost
user: root
tasks:
- name: playbook_test
shell: touch /tmp/playbook.txt
注意:
ansible playbook 配置文件非常严谨 , 一个空格都会导致出错
hosts参数指定了对哪些主机进行操作;
user参数指定了使用什么用户登录远程主机操作;
tasks指定了一个任务,其下面的name参数同样是对任务的描述,在执行过程中会打印出来。
例:用absible给gg组的成员创建/tmp/playbook.txt文件
在主机192.168.11.12和主机192.168.11.13上可以验证结果 , 发现都已创建playbook.txt文件
简单示例2:
[root@master ansible]# vim create_user.yml
---
- name: create_user
hosts: testhost
user: root
gather_facts: false
vars:
- user: "msiyuetian"
tasks:
- name: create user
user: name="{{ user }}"
注意:
name参数对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值 ,可以省略;
gather_facts参数指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用到setup获取的信息时用到;
vars参数指定了变量,这里指字一个user变量,其值为test ,需要注意的是,变量值一定要用引号引住;
user指定了调用user模块,name是user模块里的一个参数,而增加的用户名字调用了上面user变量的值。
[root@master ansible]# ansible-playbook create_user.yml
简单示例3:关于剧本中的when条件语句的应用。
[root@master ansible]# cd /etc/ansible
[root@master ansible]# vim when.yml
---
- hosts: testhost
user: root
gather_facts: True
tasks:
- name: use when
shell: touch /tmp/when.txt
when: ansible_fqdn == "clone2.qf.com"
注意:只有当参数 facter_ipaddress 为 192.168.10.110 时才在该机器上新建指定文件;意思就是只对 testhost 组中特定的主机进行操作,忽略组内其他的主机。我们可以通过setup模块查看各个参数的值
[root@master ansible]# ansible-playbook when.yml
简单示例4:关于剧本中的handler语句的应用。
[root@master ansible]# vim handlers.yml
---
- name: handlers test
hosts: testhost
user: root
tasks:
- name: test copy
copy: src=/etc/passwd dest=/tmp/handlers.txt
notify: test handlers 此处的test handlers必须是handlers设置中的name的值
handlers:
- name: test handlers
shell: echo "www.qf.com" >> /tmp/handlers.txt
说明:只有 copy 模块真正执行后,才会去调用下面的 handlers 相关的操作,追加内容。所以这种比较适合配置文件发生更改后,需要重启服务的操作。
可以对比示例1 , 自行举例验证实验 !!
Ansible实例说明
目标:
使用ansible在主机192.168.11.11上给主机192.168.11.12和主机192.168.11.13部署apache服务器 , 然后进行测试
步骤:
查看服务是否安装:
给这两台主机安装apache所需要的软件:
给这两台主机启用apache服务 , 并查看状态:
给这两台主机设置主页:
在192.168.11.11编写一个/apache脚本 , 并发送给这两台主机:
在192.168.11.11上测试这两台apache服务:
window测试 :
从上图可以看出访问成功 , 同理 , 在浏览器访问192.168.11.13 , 出来的页面就是node13.com .