问:

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图解:

image.png

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

image.png


用yum下载ansible软件

yum  install  ansible  --downloadonly  --downloaddir=/ansible7       #下载ansible , 并指定目录为/ansible7

ls  /ansible7                              #查看/ansible7目录

createrepo  /ansible7              #生成yum的repodata仓库数据库(metadata 元数据)文件夹和文件 

image.png


注解: 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

image.png  



删除网络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

image.png

image.png


查看ansible配置文件

rpm  -qc  ansible

image.png

/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     #验证双机互信

image.png

编辑主机清单文件 vim  /etc/ansible/hosts :

[gg]                            #组名

192.168.11.12            #成员

192.168.11.13 

image.png

测试ansible的使用 :

ansible    主机组名或IP   -m   模块名     -a   '模块的选项和参数'

-m   指定模块,常见的模块有ping、shell、command、cron、user、group、yum等
-a    指定模块的选项参数,参数中state状态有present(现在就有,用于创建)、absent(缺席的,用于删除)两种


   1.ping 上述gg组的所有成员

   image.png

   2.使用ansible指定shell模块对192.168.11.12进行查看IP的操作 

   ansible   192.168.11.12   -m  shell   -a   'ip  a'

   image.png

   3.使用ansible对192.168.11.13查看192.168.11.13主机上/etc/passwd文件最后5行

   image.png

   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'

   image.png




 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模块的选项和实例等;

image.png

image.png




 

 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文件

image.png

image.png

在主机192.168.11.12和主机192.168.11.13上可以验证结果 , 发现都已创建playbook.txt文件

image.png

image.png


简单示例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服务器 , 然后进行测试


步骤:

查看服务是否安装:

image.png

给这两台主机安装apache所需要的软件:

image.png

给这两台主机启用apache服务 , 并查看状态:

image.png

给这两台主机设置主页:

image.png

在192.168.11.11编写一个/apache脚本 , 并发送给这两台主机:

image.png

image.png

在192.168.11.11上测试这两台apache服务:

image.png

window测试 :

image.png

从上图可以看出访问成功 , 同理 , 在浏览器访问192.168.11.13 , 出来的页面就是node13.com .