问:node
Q1.请问你如何去高效率管理已开机的且有系统的10000台计算机?例如,给这10000台计算机安装vsftpd软件。
A.采用ssh来批量远程管理或采用ansible、puppet(由google公司开发)、saltstack等自动化部署工具来远程管理这10000台服务器。python
Q2.如何采用ansible来远程管理这10000台服务器?
A.只须要在linux工程师的我的电脑上安装ansible软件,并添加须要管理的10000台计算机的IP地址信息到这台电脑上,在这台电脑上用ssh-keygen生成秘钥对(私钥和公钥),用ssh-copy-id root@192.168.11.$i将公钥id_rsa.pub发送到这10000台计算机上。最后用ansible来远程管理这1万台计算机。linux
一 . Ansible简介
web
ansible基于python开发 , 集合了众多运维工具(puppet , cfengine , chef , func , fabric)的优势 , 实现了批量系统配置 , 批量程序部署 , 批量运行命令等功能 ; ansible是基于模块工做的 , 自己没有批量部署的能力 , 真正具备批量部署的是ansible所运行的模块 ,ansible只是提供一种框架 .正则表达式
几种运维工具比较shell
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 多任务配置文件,非必需apache
Ansible特性vim
no agents : 不须要在被管主机上安装任何客户端 , 更新时 , 只须要在操纵机上进行一次更新便可centos
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 .