您的位置:首页 > 运维架构 > 网站架构

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

2016-08-07 17:05 1316 查看
在日常服务器运维中,我们经常要配置相同的服务器配置,前期我们都是一台一台的去配置,这种方法操作主要应对于服务器数量不多且配置简单的情况还可以继续这样操作,如果我们后期维护几百服务器或者几万服务器呢? 我应该怎样去快速配置服务器呢?如果需要手动的每台服务器进行安装配置将会给运维人员带来许多繁琐而又重复的工作同时也增加服务器配置的异常,至此自动化运维工具解决我们的瓶颈---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: samlee
tasks:
- name: test connection
ping:
remote_user: samlee
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息