码迷,mamicode.com
首页 > 其他好文 > 详细

自动化运维工具Ansible架构部署应用及playbooks简单应用

时间:2016-08-08 01:13:29      阅读:347      评论:0      收藏:0      [点我收藏+]

标签:command   服务器   配置文件   接插件   fabric   

  在日常服务器运维中,我们经常要配置相同的服务器配置,前期我们都是一台一台的去配置,这种方法操作主要应对于服务器数量不多且配置简单的情况还可以继续这样操作,如果我们后期维护几百服务器或者几万服务器呢? 我应该怎样去快速配置服务器呢?如果需要手动的每台服务器进行安装配置将会给运维人员带来许多繁琐而又重复的工作同时也增加服务器配置的异常,至此自动化运维工具解决我们的瓶颈---Ansible工具。


Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1).连接插件connection plugins:负责和被监控端实现通信;
(2).host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3).各种模块核心模块、command模块、自定义模块;
(4).借助于插件完成记录日志邮件等功能;
(5).playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。


Ansible工作架构如下:

技术分享

ansible特性
(1).no agents:不需要在被管控主机上安装任何客户端;
(2).no server:无服务器端,使用时直接运行命令即可;
(3).modules in any languages:基于模块工作,可使用任意语言开发模块;
(4).yaml,not code:使用yaml语言定制剧本playbook;
(5).ssh by default:基于SSH工作;
(6).strong multi-tier solution:可实现多级指挥。


ansible优点
(1).轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
(2).批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
(3).使用python编写,维护更简单,ruby语法过于复杂;
(4).支持sudo。


1.Ansible环境安装(二进制rpm安装)

# yum -y install python-2.6.6-64.el6.x86_64.rpm
# yum -y install python-crypto2.6-2.6.1-2.el6.x86_64.rpm
# yum -y install python-httplib2-0.7.7-1.el6.noarch.rpm
# yum -y install python-jinja2-26-2.6-3.el6.noarch.rpm
# yum -y install python-keyczar-0.71c-1.el6.noarch.rpm
# yum -y install python-paramiko-1.7.5-2.1.el6.noarch.rpm
# yum -y install python-setuptools-0.6.10-3.el6.noarch.rpm
# yum -y install python-simplejson-2.0.9-3.1.el6.x86_64.rpm
# yum -y install python-six-1.9.0-2.el6.noarch.rpm
# yum -y install sshpass-1.05-1.el6.x86_64.rpm
# yum -y install ansible1.9-1.9.6-2.el6.1.noarch.rpm

2.Ansible配置应用

(1)服务部署架构如下:

node1.samlee.com 172.16.100.6 为:dbservers组
node2.samlee.com 172.16.100.7 为:dbservers组
nfs.samlee.com 172.16.100.9 为:public组
time1.samlee.com 172.16.100.12 为:public组
node3.samlee.com 172.16.100.11 为:webservers组
node4.samlee.com 172.16.100.12 为:webservers组
director.samlee.com 172.16.100.3 为ansible配置主机

(2)配置ansible端能基于密钥认证的方式联系各被管理的节点

--生成公钥/私钥
# ssh-keygen -t rsa -P ‘‘
--拷贝密钥文件至各管理节点
# ssh-copy-id -i .ssh/id_rsa.pub root@node1.samlee.com
# ssh-copy-id -i .ssh/id_rsa.pub root@node2.samlee.com
# ssh-copy-id -i .ssh/id_rsa.pub root@node3.samlee.com
# ssh-copy-id -i .ssh/id_rsa.pub root@node4.samlee.com
# ssh-copy-id -i .ssh/id_rsa.pub root@time1.samlee.com
# ssh-copy-id -i .ssh/id_rsa.pub root@nfs.samlee.com

(3)定义主机组

# vim /etc/ansible/hosts
[dbservers]
node1.samlee.com
node2.samlee.com
[webservers]
node3.samlee.com
node4.samlee.com
[public]
time1.samlee.com
nfs.samlee.com

(4)简单应用测试--测试远程主机运行状态及远程主机时间状态信息

--测试远程主机运行状态
# ansible all -m ping
--测试如下图所示:

技术分享

--测试远程主机时间状态信息
# ansible all -a ‘date‘
或
# ansible all -m command -a ‘date‘
--测试如下图所示:

技术分享


3.Ansible常用模块应用实例:

(1)copy:复制文件至远程主机

--查询模块使用选项
# ansible-doc -s copy
--copy模块相关选项如下:
backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no

content:用于替代“src”,可以直接设定指定文件的值

dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,
那么该路径也必须是个目录

directory_mode:递归设定目录的权限,默认为系统默认权限

force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标
主机的目标位置不存在该文件时,才复制。默认为yes

others:所有的file模块里的选项都可以在这里使用

src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,
它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,
如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

示例:

--将本地目录"/root/ansible" 复制至dbservers组远程服务器

# ansible dbservers -m copy -a "src=/root/ansible dest=/tmp"

技术分享

--将本地文件"/etc/ansible/ansible.cfg" 复制至webservers组远程服务器并授予指定文件权限

# ansible webservers -m copy -a "src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=roor=root group=root mode=0644"

技术分享


--远程信息查看/tmp/ansible目录

# ansible dbservers -m command -a "ls -l /tmp/ansible"

技术分享


--远程信息查看/tmp/ansible.cfg信息

# ansible webservers -m command -a "ls -al /tmp/ansible.cfg"

技术分享


(2)cron:计划任务管理

示例:

--定义配置所有主机节点每3分钟更新系统时间

# ansible all -m cron -a ‘name="custom job" minute=*/3 hour=* day=* month=* weekday=* job="/usr/sbin/ntpdate 172.16.100.10"‘

技术分享


--查询所有主机定义crontab的计划任务信息

# ansible all -a ‘crontab -l‘

技术分享


(3)group:系统用户组管理

示例:

--在所有被管理节点主机创建用户组为mysql GID=306 为系统组

# ansible all -m group -a "gid=306 system=yes name=mysql"

技术分享


--查询所有主机的用户组信息

技术分享



(4)user:系统用户管理

示例:

--给所有主机添加用户,指定用户名为:samlee,指定用户主组mysql,设定用户uid为520 ,设定备注信息为:samlee。

# ansible all -m user -a "name=samlee group=mysql uid=520 comment=‘samlee‘ state=present"

技术分享


--查询所有主机的用户信息

# ansible all -a "tail -1 /etc/passwd"

技术分享


(5)yum:yum软件包安装管理

示例:

--使用yum方式给所有主机安装corosync工具

# ansible all -m yum -a "state=present name=corosync"

技术分享

--查询所有主机节点安装的corosync

# ansible all -a "rpm -q corosync"

技术分享


(6)service:系统服务管理

示例:

--使用service方式控制所有所有主机httpd服务开机自启动

# ansible all -m service -a "state=started name=httpd enabled=yes"

技术分享

--查询所有主机节点httpd服务启动状态及级别

# ansible all -a "chkconfig --list httpd"
# ansible all -a "service httpd status"

技术分享

技术分享


4.YAML
4.1 YAML介绍
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy dt Net与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。


4.2 YAML语法
YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用"-"来代表,Map里的键值对用":"分隔。下面是一个示例。

name: John Smith
age: 41
gender: 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文件扩展名通常为.yaml,如example.yaml。


5.Ansible playbooks
playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。

简单案例应用测试: 定义playbook文件实现--1.添加用户组:samgroup不为系统组 组ID为:666 --2.添加用户samuser为普通用户 组GID为:666 用户UID为:666 --3.同时检测被管理节点系统时间

(1)创建demo.yaml文件如下:

# vim /root/demo.yaml
- hosts: all
  remote_user: root
  tasks:
    - name: add a group
      group: gid=666 name=samgroup system=no
    - name: add a user
      user: name=samuser group=samgroup uid=666 comment=‘samuser‘ state=present
    - name: excute a command
      command: /bin/date

(2)分发执行至各被管理节点

# ansible-playbook /root/demo.yaml

(3)验证各管理节点

# ansible all -a "tail -1 /etc/passwd"

验证如下图所示:

技术分享

通过以上案例的应用我们清楚知道在后期运维工作可以通过定义YAML剧本文件方式自动化执行任务,下面我们对YAML相关选项进行应用解析:

简单案例应用测试: 定义playbook文件实现--1.批量安装httpd服务至各管理节点 --2.统一部署各管理节点httpd.conf配置文件修改web端口为8080同时实现配置文件变动后重启httpd服务。

(1)准备模板配置httpd.conf并修改监听端口为:8080

# cp -p /etc/httpd/conf/httpd.conf /root/
# vim /root/httpd.conf 
Listen 8080

(2)创建webset.yaml文件如下:

# vim /root/webdemo.yaml 
- hosts: all
  remote_user: root
  tasks:
    - name: ensure apache latest version
      yum: state=latest name=httpd
    - name: apache configure file
      copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf force=yes
      notify:
        - restart httpd
  handlers:
    - name: restart httpd
      service: name=httpd state=restarted

(3)分发执行至各被管理节点

# ansible-playbook /root/webdemo.yaml

(4)验证各管理节点

# ansible all -a "ss -tnl"

验证如下图所示:

技术分享


5.1 playbook基础组件
5.1.1 Hosts和Users   
    playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组;remote_user则用于指定远程主机上的执行任务的用户。如上面示例中的
        -hosts: webnodes
         remote_user: root

    不过,remote_user也可用于各task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户。

        - hosts: webnodes
          remote_user: mageedu
          tasks:
            - name: test connection
              ping:
              remote_user: mageedu
              sudo: yes

5.1.2 任务列表和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        

5.1.3 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


案例应用配置heartbeat集群:

# vim /root/heartbeat.yaml
- hosts: hbhosts
  remote_user: root
  tasks:
    - name: ensure heartbeat latest version
      yum: name=heartbeat state=present
    - name: authkeys configure file
      copy: src=/root/hb_conf/authkeys dest=/etc/ha.d/authkeys
    - name: authkeys mode 600
      file: path=/etc/ha.d/authkeys mode=600
      notify:
        - restart heartbeat
    - name: ha.cf configure file
      copy: src=/root/hb_conf/ha.cf dest=/etc/ha.d/ha.cf
      notify: 
           - restart heartbeat
  handlers:
      - name: restart heartbeat
        service: name=heartbeat state=restarted


本文出自 “Opensamlee” 博客,请务必保留此出处http://gzsamlee.blog.51cto.com/9976612/1835383

自动化运维工具Ansible架构部署应用及playbooks简单应用

标签:command   服务器   配置文件   接插件   fabric   

原文地址:http://gzsamlee.blog.51cto.com/9976612/1835383

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!