[转]自动化运维工具Ansible
简介:
ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
自动化运维工具Ansible详细部署
一、基础介绍
1、简介
(1)、连接插件connection plugins:负责和被监控端实现通信;
(3)、各种模块核心模块、command模块、自定义模块;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
2、总体架构
(1)、no agents:不需要在被管控主机上安装任何客户端;
(3)、modules in any languages:基于模块工作,可使用任意语言开发模块;
(5)、ssh by default:基于SSH工作;
(1)、以上内容大多是基于他人分享的基础上总结而来,学习借鉴之用;
二、Ansible基础安装与配置
1、Ansible基础安装
https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz
# cd Python-2.7.8
# make --jobs=`grep processor/proc/cpuinfo | wc -l`
# cd /usr/local/include/python2.7
# cd /usr/bin
# ln -s /usr/local/bin/python
## 修改yum脚本,使其指向旧版本的python,已避免其无法运行
#!/usr/bin/python --> #!/usr/bin/python2.6
(2)、setuptools模块安装
# tar xvzf setuptools-7.0.tar.gz
# python setup.py install
(3)、pycrypto模块安装
# tar xvzf pycrypto-2.6.1.tar.gz
# python setup.py install
(4)、PyYAML模块安装
# tar xvzf yaml-0.1.5.tar.gz
# ./configure --prefix=/usr/local
# make install
https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz
# cd PyYAML-3.11
https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz
# cd MarkupSafe-0.9.3
# tar xvzf Jinja2-2.7.3.tar.gz
# python setup.py install
(6)、paramiko模块安装
# tar xvzf ecdsa-0.11.tar.gz
# python setup.py install
https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz
# cd paramiko-1.15.1
https://pypi.python.org/packages/source/s/simplejson/simplejson-3.6.5.tar.gz
# cd simplejson-3.6.5
https://github.com/ansible/ansible/archive/v1.7.2.tar.gz
# cd ansible-1.7.2
(1)、SSH免密钥登录设置
# ssh-keygen -t rsa -P ''
# cat /root/.ssh/id_rsa_storm1.pub >> /root/.ssh/authorized_keys
# mkdir -p /etc/ansible
……
private_key_file = /root/.ssh/id_rsa_storm1
# vim /etc/ansible/hosts
10.223.55.100
10.223.38.226
10.223.39.216
# ansible storm_cluster -m command -a 'uptime'
说明:第一次运行时,需要输入一下“yes”【进行公钥验证】,后续无需再次输入。
## 再次运行
3、常用模块使用
## 用来查看远程主机的一些基本信息
(2)、ping
# ansible storm_cluster -m ping
## 设置文件的属性
force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
mode:定义文件/目录的权限
path:必选项,定义文件/目录的路径
src:被链接的源文件路径,只应用于state=link的情况
state:
file:即使文件不存在,也不会被创建
hard:创建硬链接
absent:删除目录、文件或者取消链接文件
示例:
# ansible storm_cluster -m file -a "src=/etc/resolv.conf dest=/tmp/resolv.conf state=link"
# ansible storm_cluster -m command -a "ls –al /tmp/resolv.conf"
# ansible storm_cluster -m file -a "path=/tmp/resolv.conf state=absent"
# ansible storm_cluster -m command -a "ls -al /tmp/resolv.conf"
说明:如上显示,代表文件或链接已经删除。
(4)、copy
相关选项如下:
content:用于替代“src”,可以直接设定指定文件的值
directory_mode:递归设定目录的权限,默认为系统默认权限
others:所有的file模块里的选项都可以在这里使用
## 将本地文件“/etc/ansible/ansible.cfg”复制到远程服务器
## 远程文件信息查看
(5)、command
相关选项如下:
free_form:要执行的linux指令
removes:一个文件名,当该文件不存在,则该选项不执行
# ansible storm_cluster -m command -a "uptime"
## 切换到某个shell执行指定的指令,参数与command相同。
## 先在本地创建一个SHELL脚本
#!/bin/sh
# ansible storm_cluster -m copy -a "src=/tmp/rocketzhang_test.sh dest=/tmp/rocketzhang_test.sh owner=root group=root mode=0755"
## 远程执行
(7)、更多模块
service:系统服务管理
yum:yum软件包安装管理
user:系统用户管理
#ansible-doc –l
http://www.ansible.cn/docs/
playbook的组成:playbook是由一个或多个“play”组成的列表,可以让它们联同起来按事先编排的机制执行;所谓task无非是调用ansible的一个module,而在模块参数中可以使用变量;模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致;
执行模型:task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在顺序运行某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在修改playbook后重新执行一次即可;
task组成:每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出;
notify指定handler的执行机制:“notify”这个action可用于在每个play的最后被触发,在notify中列出的操作称为handler,仅在所有的变化发生完成后一次性地执行指定操作。
==========================================================================================
==========================================================================================
2、 结合业务环境,初步实现基础监控,以取代目前调用自动化部署平台API的方式;
http://blog.xiaorui.cc/category/ansible/
https://github.com/ansible/ansible-examples
http://dl528888.blog.iyunv.com/2382721/d-4/p-1
http://edu.iyunv.com/course/course_id-2032.html
1、操作系统的安装
2、操作系统的配置
3、批量程序的部署
ansible的架构大致如下
ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。
连接插件connection plugins负责和被监控端实现通信。
各种模块核心模块command模块自定义模块
PlayBooks:剧本执行多个任务时。并非必需可以让节点一次性运行多个任务
三、ansible的基本使用
12安装软件yum install ansible -y # 对应的软件在 epel 仓库中也可自己手动编译#源码地址 https://pypi.python.org/packages/source/a/ansible/ansible-1.5.tar.gz
1234567891011122、定义Host Inventory# vim /etc/ansible/hosts172.16.10.22 ansible_ssh_user=root ansible_ssh_pass=guoting172.16.10.33 ansible_ssh_user=root ansible_ssh_pass=guoting解释#ansible_ssh_user=root 是ssh登陆用户#ansible_ssh_pass=guoting 是ssh登陆密码3、测试各个模块# 注意每个模块的用法可以使用 ansible-doc MOD 来查看例如ansible-doc copy ansible命令最常用的用法ansible -m MOE -a 'MOD_ARV'所支持的模块可以使用ansible-doc -l来查看
1、查看时间信息。command、shell模块
2、在控制端添加添加用户。user模块
3、实现ssh秘钥认证。shell、copy模块
此时就可以实现基于ssh秘钥通信了此时/etc/ansible/hosts可以修改如下
1234###### /etc/ansible/hosts172.16.10.22172.16.10.33
4、安装软件和启动服务。yum、service模块
四、YAML语言介绍
1、YAML简介
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556YAML是一个可读性高的用来表达资料序列的格式。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 Smithage: 41gender: Malespouse: name: Jane Smith age: 37 gender: Femalechildren: - 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 recordname: Example Developerjob: Developerskill: Elite 也可以将key:value放置于{}中进行表示例如---# An employee record{name: Example Developer, job: Developer, skill: Elite} 多个映射关系组成一个字典一个列表可以包含多个字典。
2、ymal中的变量
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748################################## 变量命名变量名仅能由字母、数字和下划线组成且只能以字母开头。 ################################## factsfacts是由正在通信的远程目标主机发回的信息这些信息被保存在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' }
3、Inentory文件的格式
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263inventory文件遵循INI文件风格中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中此外当如若目标主机使用了非默认的SSH端口还可以在主机名称之后使用冒号加端口号来标明。 www1.magedu.com:2222www2.magedu.comdb1.magedu.comdb2.magedu.comdb3.magedu.com 如果主机名称遵循相似的命名模式还可以使用列表的方式标识各主机例如www.example.comdb-.example.com #################### 主机变量可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如www1.magedu.com http_port=80 maxRequestsPerChild=808www2.magedu.com http_port=303 maxRequestsPerChild=909 ################### 组变量组变量是指赋予给指定组内所有主机上的在playbook中可用的变量。例如 www1.magedu.comwww2.magedu.com ntp_server=ntp.magedu.comnfs_server=nfs.magedu.com ################## 组嵌套inventory中组还可以包含其它的组并且也可以向组中的主机指定变量。不过这些变量只能在ansible-playbook中使用而ansible不支持。例如 httpd1.magedu.comhttpd2.magedu.com ngx1.magedu.comngx2.magedu.com apachenginx ntp_server=ntp.magedu.com ######################### inventory参数 ansible基于ssh连接inventory中指定的远程主机时还可以通过参数指定其交互方式常用的参数如下所示ansible_ssh_host # 要连接的主机名ansible_ssh_port # 端口号默认是22ansible_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。
4、playbooks
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中即可以让它们联同起来按事先编排的机制同唱一台大戏。 ###########################playbook基础组件1、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 2、任务列表和actionplay的主体部分是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 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
5、tags
123456789101112131415161718192021222324252627282930313233343536373839404142tags用于让用户选择运行或路过playbook中的部分代码。ansible具有幂等性因此会自动跳过没有变化的部分即便如此有些代码为测试其确实没有发生变化的时间依然会非常地长。此时如果确信其没有变化就可以通过tags跳过此些代码片断。 示例基于playbooks实现web服务的部署1、提供好Inventory文件# /etc/ansible/hosts基于秘钥认证172.16.10.22172.16.10.33 2、编辑 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 3、准备好配置文件 将web的配置放到指定目录 src=/root/httpd.conf 4、开始部署ansible-playbooks /root/web.yml
基于ansible Role实现批量部署lamp平台
至此,批量部署lamp平台就完成了。以上只是一个示例,具体情况,还需具体对待。
文章来源:http://guoting.blog.iyunv.com/8886857/1553451
页:
[1]