lig 发表于 2018-7-31 06:01:53

Ansible:自动化工具

  1 概述
  1. 关于Ansible
  Ansible是一个IT自动化工具,它能够配置系统、部署软件以及持续性部署、零宕机滚动升级等高阶的IT任务,是系统运维员、开发人员、IT管理者的自动化解决方案的不二选择。
  Ansible的特性之一是agentless,即不需要在受控机器上安装任何的客户端软件,而是通过使用SSH来进行通信和命令执行等。这样避免了额外开放端口(只使用SSH的22端口),提高了安全性,并且避免了“管理管理软件”的自动化配置管理软件的硬伤(如saltstack、puppet等)以及再利用了CPU循环。
  2. 与salt的区别
  与Salt强大的自动化管理和命令执行功能类似,Ansible也具有这些功能。但不同于Salt的master/minion的管理方式,Ansible基于非常安全的OpenSSH来管理受控端和进行通信、推送命令等,是一种无客户端的管理方式,从而避免了对其本身的管理,简化了自动化配置管理的执行过程。
  执行速度方面,由于Salt是使用0mq来作为其消息传递机制,其速度非常的快,而Ansible默认是依赖SSH作为传输层,其速度要慢于Salt。不过Ansible也支持所谓的Fireball Mode,Fireball Mode使用SSH来自启动一个短暂的0mq守护进程(ephemeral 0mq daemon),其速度几乎与Salt无异。
  安全性方面,由于0mq天生不支持加密,所以Salt使用自己的AES加密技术来保护有效载荷,然而在其最近的代码中发现了一个缺陷,这个缺陷会导致一些安全问题。Ansible由于使用安全的OpenSSH,其安全性得到有效的保证。考虑到Fireball Mode,Ansible的0mq AES加密的实现是通过keyczar而不是一个本地的解决方案,默认是不使能的,而且其连接由于是瞬时的,也提高了其安全性。
  2 安装配置
  1. 安装
  Ansible是基于Python开发的,可以直接使用easy_install/pip来安装:
  easy_install ansible
  或者:
  pip install ansible
  由于Ansible也会需要使用到以下模块,所以一并安装:
  pip install paramiko PyYAML jinja2 httplib2
  其中Ansible的playbook是YAML格式,所以需要PyYAML的支持。
  Ansible的代码也会托管在github上,所以也可以直接从Git资源库中克隆镜像到本地来安装使用
  git clone git://github.com/ansible/ansible.git
  cd ./ansible
  source ./hacking/env-setup
  对于特定的Linux发行版本,可以使用rpm(yum)或者dpkg(apt-get)等软件来安装:
  yum install ansible      #RHEL/CentOS/Fedora,需要配置好EPEL
  apt-get install ansible    #Debian/Ubuntu/LinuxMint
  emerge -avt ansible      #Gentoo/Funtoo
  ps:

[*]  受控端需要安装Python 2.4及以上版本,如果低于2.5,需要安装python-simplejson
[*]  远程受控机器上使能了SELinux的,在使用copy/file/template等相关的函数前,需要安装libselinux-python模块。如果是使用yum等软件来安装的Ansible就不需要上述操作
  2. 配置
  SSH authorized_keys文件:Ansible主机和各个受控端之间由于是通过SSH进行通信,为避免频繁的输入密码,可事先打通无密码SSH登录,将认证写入到主机的authorized_keys文件中
  ansible.cfg文件:Ansible会执行以下的顺序来查找其配置文件:
  ANSIBLE_CONFIG    环境变量指定的位置
  ansible.cfg    当前目录下
  .ansible.cfg    用户家目录下
  /etc/ansible/ansible.cfg
  Inventory文件:Inventory文件用来定义要管理的主机,默认保存为/etc/ansible/hosts,如果不存在,需要手动创建。格式为ini格式,hosts文件采用分组模式,分组也可以嵌套使用:
  
  localhost
  
  vm1
  vm2
  vm3
  vm4
  分组嵌套:
  
  vm1
  vm2
  
  vm3
  vm4
  通过数字和字母模式来指定一系列连续主机:
  .sysu      #等价于1.sysu,2.sysu,3.sysu
  .sysu      #a.sysu,b.sysu,c.sysu
  3. 验证使用
  Ansible使用/usr/bin/ansible来执行一些命令,验证Ansible是否能正常工作:
  ansible all -m ping -u root
  vm1 | success >> {
  "changed": false,
  "ping": "pong"
  }
  localhost | success >> {
  "changed": false,
  "ping": "pong"
  }
  vm2 | success >> {
  "changed": false,
  "ping": "pong"
  }
  .......
  4. 使用Ad-Hoc执行简单任务
  Ansible中的临时命令的执行是通过Ad-Hoc来完成,能够快速执行,而且不需要保存执行的命令,例如:
  ansible -i ~/hosts all -m command -a ‘who’ -u root
  主要参数如下:
  -u username   指定ssh连接的用户名,即执行后面命令的用户
  -i inventory_file    指定所使用的inventory文件的位置,默认为/etc/ansible/hosts
  -m module      指定使用的模块,默认为command
  -f 10      指定并发数
  --sudo [-k]      当需要root权限执行的化,-k参数用来输入root密码
  查看远端机器vm1的uptime:
  vm1 | success | rc=0 >>
  10:54:25 up1:07,1 user,load average: 0.00, 0.00, 0.00
  Ansible的更多模块可以查看以下文档:modules
  5. 使用playbook管理复杂任务
  类似于Salt的状态管理(sls),Ansible通过playbook来定义一个脚本或者配置文件,通过这个YAML格式的文件,Ansible可以执行需反复执行、较为复杂的任务。
  playbook是Ansible真正强大的地方,是Ansible的配置、部署、流程化语言,它允许使用变量、条件、循环以及模板,也能通过角色以及包含指令来重用既有内容。
  示例:cat playbook.yml
  ---
  - hosts: vnode      #hosts中定义的主机
  remote_user: root    #远程执行的用户,如果和当前用户一致,则无需指定
  tasks:
  - name: whoami
  copy:src=~/hosts dest=~/hosts.deny
  notify:
  - clear copy
  handlers:
  - name:clear copy
  shell:'mv ~/hosts.dest hosts.del'      #假装删除
  注解:

[*]  tasks定义了playbook中要执行的任务,包括任务名name以及具体的任务内容
[*]  notify:类似于Salt的require,表示当前面的任务完成后且有相应的变化时调用后面定义的handler
[*]  handlers:与notify结合使用,被调用的handler的具体定义
  Include:
  Ansible通过playbook的定义来管理一系列的复杂任务,当工作越来越复杂时,将会产生大量的YAML文件。通过include语句,Ansible能够重用这些文件,并在这些文件中形成一定的组织关系。类似于c等语言的include声明语句,ansible的include语句能够在某个task中包含另外的yml文件,从而达到复用的效果,简化了Playbook的结构。
  示例:cat tasks/foo.yml
  - name: placeholder foo
  command: /bin/foo
  通过include将上述yml包含在bar.yml中:
  tasks:
  - include:tasks/foo.yml
  include也可以被使用在handlers部分,比如要定义如何重启apache服务:
  cat handlers/handlers.yml
  - name:restart apache
  service:name=apache state=restarted
  在主playbook文件的底部添加以下语句来包含上述的handlers:
  handlers:
  - include:handlers/handlers.yml
  Roles:
  Ansible通过Roles来更加高效的组织Playbook。通过角色定义,Roles能够实现自动加载某些vars_files,tasks,handlers,而且能够非常简单的实现在不同用户间的群组内容的共享。
  Ansible主要是通过一个inventory来定义role和主机之间的匹配,通过一个ini风格的配置文件来管理所有的主机,通过一个
group_vars下与主机组同名的文件来管理变量,或者host_vars下与主机同名的文件来管理变量(和pillar类似),然后按照固定的目录
结构在角色名目录下创建好files, handlers, tasks, templates,
vars(角色级别的变量)等目录;最后通过ansible命令再跟一系列的参数指定好inventory, playbooks,
user等来触发对所有主机的配置。
  通过Roles组织起来的Ansible项目结构示例:
site.yml  
webservers.yml
  
fooservers.yml
  
roles/
  
   common/
  
   files/
  
   templates/
  
   tasks/
  
   handlers/
  
   vars/
  
   meta/
  
   webservers/
  
   files/
  
   templates/
  
   tasks/
  
   handlers/
  
   vars/
  
   meta/
  playbook中表示为:
---  
- hosts: webservers
  
roles:
  
   - common
  
   - webservers
  更多详细细节可参考官方文档:Roles and Include statements
  ——游响云停
页: [1]
查看完整版本: Ansible:自动化工具