频道栏目
首页 > 资讯 > 其他 > 正文

Ansible--自动化运维(一)-Salina-51CTO博客

20-05-14        来源:[db:作者]  
收藏   我要投稿

前言

天天说运维,究竟是干什么的?先看看工作流程呗。一般来说,运维工程师在一家企业里属于个位数的岗位,甚至只有一个。面对生产中成千上万台服务器,就几个运维人员,工作量也是非常大的。所以这有个自动化运维的工具ansible

ansible 是什么?

  ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。  ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。

ansible 特点

    部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;

    默认使用SSH协议对设备进行管理;

    有大量常规运维操作模块,可实现日常绝大部分操作;

    配置简单、功能强大、扩展性强;

    支持API及自定义模块,可通过Python轻松扩展;

    通过Playbooks来定制强大的配置、状态管理;

    轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;

    提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。

    ansible 架构图

      上图中我们看到的主要模块如下:

    Ansible:Ansible核心程序。HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。ConnectionPlugins:连接插件,Ansible和Host通信使用

    ansible 任务执行模式

      Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhocplaybook

      ad-hoc模式(点对点模式)  使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。

      playbook模式(剧本模式)  是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。

      ansible 执行流程

        简单理解就是Ansible在运行时, 首先读取ansible.cfg中的配置, 根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。

      ansible 命令执行过程

        加载自己的配置文件,默认/etc/ansible/ansible.cfg

        查找对应的主机配置文件,找到要执行的主机或者组;

        加载自己对应的模块文件,如 command;

        通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;

        对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;

        给文件 +x 执行权限;

        执行并返回结果;

        删除临时py文件,sleep 0退出;

        ansible 安装方式

          ansible安装常用两种方式,yum安装pip程序安装。下面我们来详细介绍一下这两种安装方式。

        使用 pip(python的包管理模块)安装

          首先,我们需要安装一个python-pip包,安装完成以后,则直接使用pip命令来安装我们的包,具体操作过程如下:

          yum?install?python-pip
          pip?install?ansible

          ansible 程序结构

          安装目录如下(yum安装):  配置文件目录:/etc/ansible/  执行文件目录:/usr/bin/  Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/  Help文档目录:/usr/share/doc/ansible-X.X.X/  Man文档目录:/usr/share/man/man1/

          Ansible 功能详解

          配置文件
          配置文件或指令描述
          /etc/ansible/ansible.cfg主配置文件,配置ansible工作特性
          /etc/ansible/hosts主机清单
          /etc/ansible/roles/存放角色的目录
          /usr/bin/ansible主程序,临时命令执行工具
          /usr/bin/ansible-doc查看配置文档,模块功能查看工具
          /usr/bin/ansible-galaxy下载/上传优秀代码或Roles模块的官网平台
          /usr/bin/ansible-playbook定制自动化任务,编排剧本工具
          /usr/bin/ansible-pull远程执行命令的工具
          /usr/bin/ansible-vault文件加密工具
          /usr/bin/ansible-console基于Console界面与用户交互的执行工具

          Ansible 配置文件
          Ansible?配置文件/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?#?默认并发数
          ??#sudo_user?=?root?#?默认sudo?用户
          ??#ask_sudo_pass?=?True?#每次执行ansible命令是否询问ssh密码
          ??#ask_pass?=?True??????#连接时提示输入ssh密码
          ??#remote_port?=?22?????#远程主机的默认端口,生产中这个端口应该会不同
          ??#log_path?=?/var/log/ansible.log?#日志
          ??#host_key_checking?=?False?#?检查对应服务器的host_key,建议取消注释。也就是不会弹出Are?you?sure?you?want?to?continue?connecting?(yes/no)?

          实验规划
          实验环境:VMware?Workstation?Pro?14(试用版)
          系统平台:CentOS?Linux?release?7.4.1708?(Core)???????内核??3.10.0-693.el7.x86_64最小化安装
          
          实验环境:VMware?Workstation?Pro?14(试用版)
          系统平台:CentOS?release?6.9?(Final)?????????????内核??2.6.32-696.el6.x86_64最小化安装
          主机名系统版本IP地址功能
          7-web-0Centos 7.4192.168.7.200Ansible主控端
          6-dns-1Centos 6.9192.168.7.254DNS服务器
          6-web-1Centos 6.9192.168.7.201服务器
          7-web-2Centos 7.4192.168.7.202服务器
          7-db-3Centos 7.4192.168.7.203服务器

          除了6-DNS-1以外,所有的主机的DNS均指向192.168.7.254

          正向区域设置#dig?-t?axfr?hunk.tech;?<<>>?DiG?9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6?<<>>?-t?axfr?hunk.tech;;?global?options:?+cmdhunk.tech.??????600?IN??SOA?6-dns-1.hunk.tech.?admin.hunk.tech.?24?720?600?86400?10800hunk.tech.??????????600?IN??NS??6-dns-1.hunk.tech.
          6-dns-1.hunk.tech.??600?IN??A???192.168.7.2546-web-1.hunk.tech.??600?IN??A???192.168.7.2017-db-3.hunk.tech.???600?IN??A???192.168.7.2037-web-0.hunk.tech.??600?IN??A???192.168.7.2007-web-2.hunk.tech.??600?IN??A???192.168.7.202hunk.tech.??????????600?IN??SOA?6-dns-1.hunk.tech.?admin.hunk.tech.?24?720?600?86400?10800

          Inventory 主机清单

          Ansible必须通过Inventory 来管理主机。Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置。

          语法格式:

          单台主机
          green.example.com????>???FQDN192.168.100.10???????>???IP地址192.168.100.11:2222??>???非标准SSH端口
          
          [webservers]?????????>???定义了一个组名?????
          alpha.example.org????>???组内的单台主机192.168.100.10?
          
          [dbservers]
          192.168.100.10???????>???一台主机可以是不同的组,这台主机同时属于[webservers]?
          
          [group:children]?????>??组嵌套组,group为自定义的组名,children是关键字,固定语法,必须填写。
          dns??????????????????>??group组内包含的其他组名
          db???????????????????>??group组内包含的其他组名
          
          [webservers]?
          www[001:006].hunk.tech?>?有规律的名称列表,
          这里表示相当于:
          www001.hunk.tech
          www002.hunk.tech
          www003.hunk.tech
          www004.hunk.tech
          www005.hunk.tech
          www006.hunk.tech
          
          [databases]
          db-[a:e].example.com???>???定义字母范围的简写模式,
          这里表示相当于:
          db-a.example.com
          db-b.example.com
          db-c.example.com
          db-d.example.com
          db-e.example.com
          
          以下这2条定义了一台主机的连接方式,而不是读取默认的配置设定
          localhost???????ansible_connection=local
          www.163.com?????ansible_connection=ssh????????ansible_ssh_user=hunk
          
          最后还有一个隐藏的分组,那就是all,代表全部主机,这个是隐式的,不需要写出来的。

          Inventory 参数说明
          ansible_ssh_host
          ??????将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
          
          ansible_ssh_port
          ??????ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用?ip:端口?192.168.1.100:2222ansible_ssh_user
          ??????默认的?ssh?用户名
          
          ansible_ssh_pass
          ??????ssh?密码(这种方式并不安全,我们强烈建议使用?--ask-pass?或?SSH?密钥)
          
          ansible_sudo_pass
          ??????sudo?密码(这种方式并不安全,我们强烈建议使用?--ask-sudo-pass)
          
          ansible_sudo_exe?(new?in?version?1.8)
          ??????sudo?命令路径(适用于1.8及以上版本)
          
          ansible_connection
          ??????与主机的连接类型.比如:local,?ssh?或者?paramiko.?Ansible?1.2?以前默认使用?paramiko.1.2?以后默认使用?'smart','smart'?方式会根据是否支持?ControlPersist,?来判断'ssh'?方式是否可行.
          
          ansible_ssh_private_key_file
          ??????ssh?使用的私钥文件.适用于有多个密钥,而你不想使用?SSH?代理的情况.
          
          ansible_shell_type
          ??????目标系统的shell类型.默认情况下,命令的执行使用?'sh'?语法,可设置为?'csh'?或?'fish'.
          
          ansible_python_interpreter
          ??????目标主机的?python?路径.适用于的情况:?系统中有多个?Python,?或者命令路径不是"/usr/bin/python",比如??\*BSD,?或者?/usr/bin/python?不是?2.X?版本的?Python.
          ??????我们不使用?"/usr/bin/env"?机制,因为这要求远程用户的路径设置正确,且要求?"python"?可执行程序名不可为?python以外的名字(实际有可能名为python26).
          
          ??????与?ansible_python_interpreter?的工作方式相同,可设定如?ruby?或?perl?的路径....

          上面的参数用这几个例子来展示可能会更加直观

          some_host?????????ansible_ssh_port=2222?????ansible_ssh_user=manager
          aws_host??????????ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
          freebsd_host??????ansible_python_interpreter=/usr/local/bin/pythonruby_module_host??ansible_ruby_interpreter=/usr/bin/ruby.1.9.3

第一条 Ansible 命令

很重要的一点,主机清单必须要先配置,由于这搭建了内部DNS服务器,所以,这里的主机使用了FQDN名称。

#cat?/etc/ansible/hosts?[web]
6-web-1.hunk.tech
7-web-0.hunk.tech
7-web-2.hunk.tech[group:children]dns
db

[dns]
6-dns-1.hunk.tech

[db]
7-db-3.hunk.tech192.168.7.[200:203]192.168.7.254
#ansible?dns?-m?ping???????#?使用ansible对dns组内的主机进行ping模块测试

image非常抱歉哦,竟然是失败的。为什么呢?Ansible是基于ssh进行工作的,那么当ssh一台远程主要的时候,是不是需要输入密码呢?可是这一条指令并没有提示输入口令呢

#ansible?dns?-m?ping?-k加上-k选项后,会提示输入ssh密码了。

image

另外,值得注意的是,当指令成功和失败都会有不同的颜色反映出来,配以changed :false,changed :SUCCESS,可以让我们非常清晰的知道执行的结果。

当主机数量多的时候,输入密码可不是一个好差事呢?前面的章节已经讲过主机之间可以使用基于密钥的SSH链接。为了更方便的管理主机,这个章节的实验都用这种方法。

基于key的免密码登录
#ssh-keygen#ssh-copy-id?6-web-1.hunk.tech#ssh-copy-id?6-DNS-1.hunk.tech#ssh-copy-id?7-web-0.hunk.tech#ssh-copy-id?7-web-2.hunk.tech#ssh-copy-id?7-db-3.hunk.tech

现在就不会再提示密码的问题了。

#ansible?all?-m?ping6-web-1.hunk.tech?|?SUCCESS
7-web-0.hunk.tech?|?SUCCESS7-web-2.hunk.tech?|?SUCCESS
7-db-3.hunk.tech?|?SUCCESS?
6-dns-1.hunk.tech?|?SUCCESS?
192.168.7.201?|?SUCCESS?
192.168.7.200?|?SUCCESS

是不是很简单呀,Ansible用的指令也不是太多,可以使用man ansible和官方网站去查询。http://docs.ansible.com/ansible/latest/

Ansible常用命令语法
ansible?<host-pattern>?[-m?module_name]?[options]
指令?匹配规则的主机清单?-m?模块名?选项--version?显示版本-a?模块参数(如果有)-m?module?指定模块,默认为command-v?详细过程?–vv?-vvv更详细--list-hosts?显示主机列表,可简写--list-k,?--ask-pass?提示连接密码,默认Key验证-K,--ask-become-pass?提示使用sudo密码-C,?--check?检查,并不执行-T,?--timeout=TIMEOUT?执行命令的超时时间,默认10s-u,?--user=REMOTE_USER?执行远程执行的用户-U,?SUDO_USER,?--sudo-user?指定sudu用户-b,?--become?代替旧版的sudo?切换
ansible-doc:?显示模块帮助
ansible-doc?[options]?[module...]-a?显示所有模块的文档-l,?--list?列出可用模块-s,?--snippet?显示指定模块的简要说明

例子:#ansible-doc?ping由于ansible的模块有1378个(2.4.2.0),并且一直在持续更新。因此,这个指令必须要掌握的。#ansible-doc?-l?|wc?-l1378

Ansible 主机 匹配列表

通配符
注意用单引号
*??匹配任意字符#ansible?'*'?-m?ping???等同于?#ansible?all?-m?ping#ansible?'*dns*'?-m?ping6-dns-1.hunk.tech?|?SUCCESS

??匹配单个字符#ansible?'192.168.7.20?'?-m?ping192.168.7.201?|?SUCCESS
192.168.7.203?|?SUCCESS
192.168.7.202?|?SUCCESS
192.168.7.200?|?SUCCESS

:?或者#ansible?'192.168.7.201:192.168.7.254'?-m?ping192.168.7.201?|?SUCCESS
192.168.7.254?|?SUCCESS

:&?并且??(逻辑与)#ansible?'test3:&test'?--list

??hosts?(1):
????192.168.7.254

:!?逻辑非。在test3组内,但是并不在test组内#ansible?'test3:!test'?--list???????>?用到感叹号的时候,记得引号为单引号,否则会被bash解析为历史命令

??hosts?(2):
????192.168.7.200
????192.168.7.203

使用正则表达式
~表示后面是正则匹配,注意~后面不能有空格#ansible?'~[67]-(db|dns).*\.hunk.*'?--list

??hosts?(2):
????6-dns-1.hunk.tech
????7-db-3.hunk.tech

这里写一条正则的坑,我们在用bash脚本的时候,匹配数字可以使用[0-9]或[[:digit:]],在用Ansible的时候,我们来看下不同的效果吧

#cat?/etc/ansible/hosts?[web]
6web-1.hunk.tech
7web-0.hunk.tech
7web-2.hunk.tech

[group:children]
dns
db

[dns]
6-dns-1.hunk.tech

[db]
7-db-3.hunk.tech
[test2]
192.168.7.[200:203]
192.168.7.254
[test]
192.168.7.254

[test3]
192.168.7.200
192.168.7.254
192.168.7.203

DNS都是可以正确解析出来的,不要怀疑
6-dns-1.hunk.tech.??600?IN??A???192.168.7.254
6-web-1.hunk.tech.??600?IN??A???192.168.7.201
7-db-3.hunk.tech.???600?IN??A???192.168.7.203
7-web-0.hunk.tech.??600?IN??A???192.168.7.200
7-web-2.hunk.tech.??600?IN??A???192.168.7.202#ansible?'~^[[:digit:]]'?--list?????有人说这种写法会报错,可是主机都是centos7.4,版本都是一样
??hosts?(7):?????????????????????????这里匹配出7台主机
????192.168.7.200
????192.168.7.201
????192.168.7.202
????192.168.7.203
????192.168.7.254
????6-dns-1.hunk.tech
????7-db-3.hunk.tech#ansible?'~^[0-9]'?--list
??hosts?(10):???????????????????????这里匹配出10台主机
????6web-1.hunk.tech
????6-dns-1.hunk.tech
????7-db-3.hunk.tech
????7web-0.hunk.tech
????7web-2.hunk.tech
????192.168.7.254
????192.168.7.201
????192.168.7.200
????192.168.7.203
????192.168.7.202#ansible?'~^[[:digital:]]'?--list
??hosts?(10):???????????????????????这里匹配出10台主机
????6web-1.hunk.tech
????7web-0.hunk.tech
????7web-2.hunk.tech
????192.168.7.200
????192.168.7.201
????192.168.7.202
????192.168.7.203
????192.168.7.254
????6-dns-1.hunk.tech
????7-db-3.hunk.tech

分享2个正则表达式的网址https://en.wikipedia.org/wiki/Regular_expression#POSIX_basic_and_extended

python2的https://docs.python.org/2/library/re.html

不同软件对正则的表达都不一样,还是用那些通用性强的吧。

[0-9]纯数字[a-zA-Z0-9]数字和字母

Ansible 的命令执行过程

以 ansible db -m command -a 'ls -l /' -vvv 这条命令为例,根据显示的信息时行解读

1.?加载自己的配置文件,默认/etc/ansible/ansible.cfg
????Using?/etc/ansible/ansible.cfg?as?config?file2.匹配主机清单
????Parsed?/etc/ansible/hosts?inventory?source?with?ini?plugin3.?加载指令对应的模块文件,如command,生成.py的文件到本机的临时目录,这个目录就是在/etc/ansible/ansible.cfg定义的
????Using?module?file?/usr/lib/python2.7/site-packages/ansible/modules/commands/command.py
????PUT?/tmp/tmp4JvsLH?TO?/root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py4.?通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件,
????这个目录就是在/etc/ansible/ansible.cfg定义的
????(?umask?77?&&?mkdir?-p?"`?echo?/root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861?`"?....)
????sftp>?put?/tmp/tmp4JvsLH?/root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py\n'

5.?给文件+x?权限
????'chmod?u+x?/root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/?/root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py?&&?sleep?0'

6.?执行并返回结果
????'/usr/bin/python?/root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py;7.?删除临时py文件,sleep?0退出
????rm?-rf?"/root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/"?>?/dev/null?2>&1?&&?sleep?08.断开远程主机连接????'Shared?connection?to?7-db-3.hunk.tech?closed.\r\n')

执行结果状态

? 绿色:执行成功并且不需要做改变的操作

? 黄色:执行成功并且对目标主机做变更

? 红色:执行失败

可以在配置文件中定义
[colors]#highlight?=?white#verbose?=?blue#warn?=?bright?purple#error?=?red#debug?=?dark?gray#deprecate?=?purple#skip?=?cyan#unreachable?=?red#ok?=?green#changed?=?yellow#diff_add?=?green#diff_remove?=?red#diff_lines?=?cyan

转载链接:https://blog.51cto.com/191226139/2066936

相关TAG标签
上一篇:Aigtek电压,ATS-2000V系列高精度电压源-qq5df1da57335fe的博客-51CTO博客
下一篇:容器技术-运维邦-51CTO博客
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站