自动化运维工具之ansible

1、什么样的情形须要批量部署html

一、操做系统的安装node

常见的有collber,red hat satelite(redhat)系统专用。python

二、操做系统的配置linux

常见的有cfengine,puppet,chef,func。其中puppet最受欢迎nginx

三、批量程序的部署web

四、批量命令的运行查看状态信息shell

2、ansible介绍apache

ansible的架构大体以下vim

1

ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优势实现了批量操做系统配置、批量程序的部署、批量运行命令等功能。centos

运维工具常见的工做模式  一、agent模式: 基于ssl实现。代理工做在被监控端。像puppet。  二、agentless模式: 基于ssh服务实现工做在被监控端。监控端是ssh的客户端。

ansible是工做在agentless模式下具备幂等性。ansible在控制端只须要告诉监控端的指望状态就能够实现批量部署。

名词解释  幂等性不会重复执行相同的指令。例如不会重复安装软件  指望状态只须要告诉被监控端的指望状态

ansible是基于模块工做的ansible自己没有批量部署的能力。真正具备批量部署的是ansible所运行的模块ansible只是提供一种框架。架构包括

  • 链接插件connection plugins负责和被监控端实现通讯。

  • Host Inventory:指定操做的主机,是一个配置文件里面定义监控的主机

  • 各类模块核心模块command模块自定义模块

  • 借助于插件完成记录日志邮件等功能

  • PlayBooks:剧本执行多个任务时。并不是必需可让节点一次性运行多个任务

3、ansible的基本使用

安装软件yum install ansible -y # 对应的软件在 epel 仓库中也可本身手动编译  #源码地址 https://pypi.python.org/packages/source/a/ansible/ansible-1.5.tar.gz

2 

二、定义Host Inventory  # vim /etc/ansible/hosts  [webhosts]  172.16.10.22 ansible_ssh_user=root ansible_ssh_pass=guoting 172.16.10.33 ansible_ssh_user=root ansible_ssh_pass=guoting 解释  #ansible_ssh_user=root 是ssh登录用户  #ansible_ssh_pass=guoting 是ssh登录密码三、测试各个模块  # 注意每一个模块的用法可使用 ansible-doc MOD 来查看例如ansible-doc copy     ansible命令最经常使用的用法  ansible <Host-partten> -m MOE -a 'MOD_ARV'所支持的模块可使用ansible-doc -l来查看

ansible示例

一、查看时间信息。command、shell模块

3

二、在控制端添加添加用户。user模块

4

三、实现ssh秘钥认证。shell、copy模块

6


此时就能够实现基于ssh秘钥通讯了此时/etc/ansible/hosts能够修改以下

###### /etc/ansible/hosts  [webhosts]  172.16.10.22  172.16.10.33

7

四、安装软件和启动服务。yum、service模块

8

9

五、支持管道的命令。raw模块,相似于shell模块

wKioL1QaeV6QK9YUAACu77PB1cY454.jpg

4、YAML语言介绍

一、YAML简介

YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其余多种语言包括XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言另外Ingy dtNet与Oren Ben-Kiki也是这语言的共同设计者。  YAML Ain't Markup Language即YAML不是XML。不过在开发的这种语言时YAML的意思实际上是"Yet Another Markup Language"还是一种标记语言。其特性  YAML的可读性好  YAML和脚本语言的交互性好  YAML使用实现语言的数据类型  YAML有一个一致的信息模型  YAML易于实现  YAML能够基于流来处理  YAML表达能力强扩展性好     更多的内容及规范参见http://www.yaml.org。     ##########################YAML语法     YAML的语法和其余高阶语言相似而且能够简单表达清单、散列表、标量等数据结构。其结构Structure经过空格来展现序列Sequence里的项用"-"来表明  Map里的键值对用":"分隔。YAML文件扩展名一般为.yaml或者.yml。下面是一个示例。     name: John Smith  age: 41gender: Male  spouse:  name: Jane Smith  age: 37  gender: Female  children:  - name: Jimmy Smith  age: 17  gender: Male  - name: Jenny Smith  age 13  gender: Female     YAML 2 个重要的结构组成部分list和directory  ################################# list     列表的全部元素均使用“-”打头例如  # A list of tasty fruits  - Apple  - Orange  - Strawberry  - Mango     ##############################dictionary     字典经过key与valuef进行标识例如  ---  # An employee record  name: Example Developer  job: Developer  skill: Elite     也能够将key:value放置于{}中进行表示例如  ---  # An employee record  {name: Example Developer, job: Developer, skill: Elite}     多个映射关系组成一个字典一个列表能够包含多个字典。

二、ymal中的变量

################################## 变量命名  变量名仅能由字母、数字和下划线组成且只能以字母开头。     ################################## facts  facts是由正在通讯的远程目标主机发回的信息这些信息被保存在ansible变量中。要获取指定的远程主机所支持的全部facts可以使用以下命令进行  # ansible hostname -m setup 这个命令能够得到被监控端主机的各类信息将这些信息获得后保存到变量中。     ################################ 自定义变量  在 yaml 中可使用vars关键字来定义变量  vars:  var_name: value     ############################# 变量的引用  {{ var_name }}        ########################### 特殊的变量迭代  当有须要重复性执行的任务时可使用迭代机制。其使用格式为将须要迭代的内容定义为item变量引用并经过with_items语句来指明迭代的元素列表便可。     #######################################示例  例如在被控端添加 2 个用户     方式1通常作法  - name: add user testuser1  user: name=testuser1 state=present groups=wheel - name: add user testuser2  user: name=testuser2 state=present groups=wheel    方式2使用变量方式  - name: add several users  vars:  user1: testuser1  user2: testuser2  user: name={{ user1 }} state=present groups=wheel user: name={{ user2 }} state=present groups=wheel    方式3使用迭代方式  - name: add several users  user: name={{ item }} state=present groups=wheel with_items:   - testuser1   - testuser2  事实上with_items中可使用元素还可为hashes例如  - name: add several users  user: name={{ item.name }} state=present groups={{ item.groups }}  with_items:  - { name: 'testuser1', groups: 'wheel' }  - { name: 'testuser2', groups: 'root' }

三、Inentory文件的格式

inventory文件遵循INI文件风格中括号中的字符为组名。能够将同一个主机同时归并到多个不一样的组中此外当如若目标主机使用了非默认的SSH端口还能够在主机名称以后使用冒号加端口号来标明。     [webservers]  www1.magedu.com:2222  www2.magedu.com  [dbservers]  db1.magedu.com  db2.magedu.com  db3.magedu.com     若是主机名称遵循类似的命名模式还可使用列表的方式标识各主机例如  [webservers]  www[01:50].example.com  [databases]  db-[a:f].example.com     #################### 主机变量  能够在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如  [webservers]  www1.magedu.com http_port=80 maxRequestsPerChild=808 www2.magedu.com http_port=303 maxRequestsPerChild=909    ################### 组变量  组变量是指赋予给指定组内全部主机上的在playbook中可用的变量。例如     [webservers]  www1.magedu.com  www2.magedu.com     [webservers:vars]  ntpntp_server=ntp.magedu.com  nfsnfs_server=nfs.magedu.com     ################## 组嵌套  inventory中组还能够包含其它的组而且也能够向组中的主机指定变量。不过这些变量只能在ansible-playbook中使用而ansible不支持。例如     [apache]  httpd1.magedu.com  httpd2.magedu.com     [nginx]  ngx1.magedu.com  ngx2.magedu.com     [webservers:children]  apache  nginx     [webservers:vars]  ntpntp_server=ntp.magedu.com     ######################### inventory参数     ansible基于ssh链接inventory中指定的远程主机时还能够经过参数指定其交互方式经常使用的参数以下所示  ansible_ssh_host # 要链接的主机名  ansible_ssh_port # 端口号默认是22  ansible_ssh_user # ssh链接时默认使用的用户名  ansible_ssh_pass # ssh链接时的密码  ansible_sudo_pass # 使用sudo链接用户是的密码  ansible_ssh_private_key_file # 秘钥文件若是不想使用ssh-agent管理时可使用此选项  ansible_shell_type # shell的类型默认sh  #########################################################################################  ansible的循环机制还有更多的高级功能具体请参见官方文档http://docs.ansible.com/playbooks_loops.html。


四、playbooks

playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先经过ansible中的task定义好的角色。  从根本上来说所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中便可以让它们联同起来按事先编排的机制同唱一台大戏。     ###########################playbook基础组件  一、Hosts和Users     playbook中的每个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。  hosts用于指定要执行指定任务的主机其能够是一个或多个由冒号分隔主机组。  remote_user则用于指定远程主机上的执行任务的用户。     不过remote_user也可用于各task中。也能够经过指定其经过sudo的方式在远程主机上执行任务其可用于play全局或某任务。  此外甚至能够在sudo时使用sudo_user指定sudo时切换的用户。     - hosts: webnodes  remote_user: mageedu  tasks:  - name: test connection ping:  remote_user: mageedu sudo: yes     二、任务列表和action  play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的全部主机上执行即在全部主机上完成第一个任务后再开始第二个。  在运行自下而下某playbook时若是中途发生错误全部已执行任务都将回滚所以在更正playbook后从新执行一次便可。  task的目的是使用指定的参数执行模块而在模块参数中可使用变量。模块执行是幂等的这意味着屡次执行是安全的由于其结果均一致。  每一个task都应该有其name用于playbook的执行结果输出建议其内容尽量清晰地描述任务执行步骤。若是未提供name则action的结果将用于输出。     定义task的可使用“action: module options”或“module: options”的格式推荐使用后者以实现向后兼容。  若是action一行的内容过多也中使用在行首使用几个空白字符进行换行。     tasks:  - name: make sure apache is running  service: name=httpd state=running    在众多模块中只有command和shell模块仅须要给定一个列表而无需使用“key=value”格式例如  tasks:  - name: disable selinux  command: /sbin/setenforce 0若是命令或脚本的退出码不为零可使用以下方式替代  tasks:  - name: run this command and ignore the result  shell: /usr/bin/somecommand || /bin/true  或者使用ignore_errors来忽略错误信息  tasks:  - name: run this command and ignore the result  shell: /usr/bin/somecommand  ignore_errors: True      三、handlers     用于当关注的资源发生变化时采起必定的操做。     “notify”这个action可用于在每一个play的最后被触发这样能够避免屡次有改变发生时每次都执行指定的操做取而代之仅在全部的变化发生完成后一次性地执行指定操做。在notify中列出的操做称为handler也即notify中调用handler中定义的操做。     - name: template configuration file  template: src=template.j2 dest=/etc/foo.conf  notify:  - restart memcached  - restart apache      handler是task列表这些task与前述的task并无本质上的不一样。     handlers:  - name: restart memcached  service: name=memcached state=restarted - name: restart apache  service: name=apache state=restarted

五、tags

tags用于让用户选择运行或路过playbook中的部分代码。ansible具备幂等性所以会自动跳过没有变化的部分即使如此有些代码为测试其确实没有发生变化的时间依然会很是地长。此时若是确信其没有变化就能够经过tags跳过此些代码片段。     示例基于playbooks实现web服务的部署  一、提供好Inventory文件  # /etc/ansible/hosts基于秘钥认证  [webhosts]  172.16.10.22  172.16.10.33     二、编辑 palybooks 剧本  # vim /root/web.yaml  - name: web service  remote_user: root  hosts: webhosts  vars:  packages: httpd  tasks:  - name: install httpd yum: name={{ packages }} state=present tags: install  - name: configuration httpd  copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf  tags: conf  notify:  - restart httpd  - name: service httpd start  service: name=httpd enabled=no state=started tags: start  - name: add centos and hadoop user  user: name={{ item }} state=absent tags: adduser  with_items:  - centos  - hadoop  handlers:  - name: restart httpd  service: name=httpd state=restarted    三、准备好配置文件  将web的配置放到指定目录 src=/root/httpd.conf     四、开始部署  ansible-playbooks /root/web.yml

结果示例

11

查看端口

12

此时若是配置文件发生变化

13

至此基本使用配置完成

相关文章
相关标签/搜索