运维工做:系统安装(物理机、虚拟机)--> 程序包安装、配置、服务启动 --> 批量操做 --> 程序发布 --> 监控php
稳定可用 ------- 标准化 --------- 自动化python
系统安装:nginx
一、物理机:PXE、Cobblerweb
二、虚拟机:Image Templatesshell
程序配置Configration:编程
一、puppet (ruby语言研发)vim
二、saltstack (python语言研发)ruby
三、chefbash
四、cfengine数据结构
五、ansible
批量操做Command and Control:
一、fabric(python语言研发)
二、func
三、ansible
程序发布:
一、人工智能(手动发布)
二、脚本
三、发布程序(运维程序)
程序发布的标准要求:
一、不能影响用户体验;
二、系统不能停机;
三、不能致使系统故障或形成系统彻底不可用;
发布路径:
/webapps/tuangou
/webapps/tuangou-1.1
/webapps/tuangou-1.2
灰度模型:
主机
用户
在调度器上下线一批主机(标记为维护模式) ----- 关闭服务 ------ 部署新版本 ------- 启动服务 ------- 在调度器上启用这一批主机;
运维工具的分类:
一、agent:puppet,func
二、agentless(ssh):ansible、fabric
ansible:能够实现系统安装(研发中)、程序配置、批量操做、发布程序(需自定义)
模块化,调用特定的模块,完成特定的任务;
基于Python语言实现,由Paramiko、PyYAML和Jinja2三个关键模块;
部署简单,agentless;
主从模式;
支持自定义模块;
支持Playbook;
幂等性;执行一次跟屡次结果一致;
安装ansible:epel,ansible
配置文件:/etc/ansible/ansible.cfg
主机清单:/etc/ansible/hosts
主程序:
ansible
ansible-playbook
ansible-doc
ansible的简单使用格式:
ansible HOST-PATTERN -f forks -m MOD_NAME -a MOD_ARGS
使用前提:
一、各节点先写入/etc/ansible/hosts里
二、各节点基于ssh密钥认证通讯
控制端(即ansible主机)
# ssh-keygen -t rsa -P ''
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@各节点
经常使用模块:
获取模块列表:ansible-doc -l
获取指定模块的帮助:ansible-doc -s MOD_NAME
一、command模块:在远程主机运行命令;
二、shell模块:在远程主机在shell进程下运行命令,支持shell特性,例如管道、重定向等;
三、copy模块:复制ansible主机的文件到各远程节点;
用法:
(1)src= dest=
(2)content= dest=
owner,group,mode
四、cron模块:管理各远程节点的cron任务;
用法:
name= job= state=present(建立)|absent(删除)
minute,hour,day,month,weekday,user
五、fetch模块:从各远程节点拉取文件到ansible本机;
六、file模块:设定远程各节点的文件属性;
用法:
(1)建立连接文件:path= src= state=link
(2)修改属性:path= owner= group= mode=
(3)建立目录:path= state=directory
七、hostname模块:管理远程各节点主机名
八、pip模块:安装远程各节点的python所需的库
九、yum模块:管理各节点的yum程序;
name=:程序包名,能够带版本号;
state=:安装(present|lastest),卸载(absent);
十、service模块:管理远程各节点的服务
name=:
state=:started启动,stopped中止,restarted重启
enabled=0|1:开机是否启动
runlevel=
十一、ping模块:ping远程各节点;
十二、user模块:管理远程各节点的用户
name=
system=yes|no
uid=
shell=
state=present|absent
home=:家目录
group=:基本组
groups=:额外组
remove:删除用户,同时删除家目录
1三、uri模块:访问远程各节点的http|https服务
1四、setup模块:收集远程各节点的facts信息;
1五、group模块:添加或删除组
name=
state=present|absent
gid=
system=:是否系统组
1六、script模块:把一个本地script传递到远程各节点执行
-a “/path/to/script_file”
1七、template模块:基于模板方式生成一个文件复制到远程主机
src=
dest=
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。
playbook的核心元素:
hosts:
tasks: 任务
variables: 变量
templates: 模板(包含了模版语法的文本文件)
handlers: 处理器(由特定条件触发的任务)
roles: 角色
案例:
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
playbook的基础组件:
hosts:运行指定任务的目标主机;
remote_user:在远程主机上执行任务的用户;
sudo_user:在须要用到sudo时指定的用户;
tasks:任务列表,自上而下
(1)action:module arguments
(2)module:arguments
注意:shell和command模块后面直接跟命令,而非key=value类的参数列表
handlers:任务,在特定条件下触发,接收到其余任务的通知时被触发;
(1)某任务的状态在运行后为changed时,可经过“notify”通知给相应的handlers;
(2)任务能够经过“tags”打标签,然后在ansible-playbook命令上使用-t指定进行调用;
运行playbook的方式:
(1)测试
ansible-playbook --check:只检测可能发生的改变,但不真正执行操做;
ansible-playbook --list-hosts:列出运行任务的主机;
(2)运行
variables: 变量;调用 {{ variable }}
一、facts:setup模块提供的;可直接调用
二、ansible-playbook命令的自定义变量:经过双括号进行调用:{{ 变量名 }};
三、经过roles传递变量;
四、Host Incentory:
(1)向不一样的主机传递不一样的变量;在/etc/ansible/hosts文件下,IP/HOSTNAME variable=value var2=value2
(b)向组中的主机传递相同的变量;在/etc/ansible/hosts文件下,[groupname:vars] var=value
在playbook中定义变量的方法:
vars:
- var1: value1
- var2: value2
inventory参数:用于定义ansible远程链接目标主机时使用的参数,而非传递给playbook的变量;
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
模板:templates;文本文件,嵌套有脚本(使用模板编程语言编写)
jinjar2:
一、字面量:
(1)字符串:使用单引号或双引号;
(2)数值:整数,浮点数;
(3)列表:[item1,item2];
(4)元组:(item1,item2);
(5)字典:{key1:value1,key2:value2,...};
(6)布尔型:true|false
二、算术运行:
+,-,*,/,//,%,**
三、比较操做:
==,!=,>,>=,<,<=
四、逻辑运算:
and,or,not
案例:nginx.yaml:在websrvs组安装nginx,并根据模板nginx.j2,启动nginx服务;
# vim nginx.yaml
其中nginx.j2 传递了2个变量
worker_processes {{ ansible_processor_vcpus-1 }}; #由setup模块提供的变量;
listen {{ http_port }} default_server;
http_port变量是由/etc/ansible/hosts文件传递;以下
条件测试:
when语句:在tasks中使用,jinja2的语法格式;
在tasks后添加when子句便可使用条件测试;when语句支持jinja2表达式语法。例如:
tasks:
- name: "shutdown Debian flavored systems"
command: /sbin/shutdown -h now
when: ansible_os_family == "Debian"
循环:迭代,须要重复执行的任务;
对迭代项的引用,固定变量名为“item”;然后在tasks中,使用with_items给定要迭代的元素列表;a、字符串,二、字典
a、例如:
- name: install some package
yum: name={{ item }} state=present
with_items:
- nginx
- memcached
- php-fpm
b、例如
- name: add some group
group: name={{ item }} state=present
with_items:
- group1
- group2
- group3
- name: add some users
user:name={{ item.name }} group={{ item.group }} state=present
with_items:
- { name: "user1" group: "group1" }
- { name: "user2" group: "group2" }
- { name: "user3" group: "group3" }
角色roles:roles就是经过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并能够便捷地include它们的一种机制。角色通常用于基于主机构建服务的场景中,但也能够是用于构建守护进程等场景中。
roles模块的路径能够在配置文件/etc/ansible/ansible.cfg里roles_path定义.
1
2
|
vim
/etc/ansible/ansible
.cfg
roles_path =
/etc/ansible/roles
:
/usr/share/ansible/roles
|
role内各目录中可用的文件:
tasks目录:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表;其余的文件须要在此文件中经过include进行包含;
files目录:存放由copy或script等模块调用的文件;
templates目录:template模块查找所须要模板文件的目录;
handlers目录:至少应该包含一个名为main.yml的文件,用于定义此角色用到的各handler;在handler中使用include包含的其它的handler文件也应该位于此目录中;
vars目录:至少应该包含一个名为main.yml的文件,用于定义此角色用到的变量;
meta目录:至少应该包含一个名为main.yml的文件,用于定义此角色的特殊设定及其依赖关系;ansible 1.3及其之后的版本才支持;
default目录:为当前角色设定默认变量时使用此目录;应当包含一个main.yml文件;
建立role的步骤
(1) 建立以roles命名的目录;
(2) 在roles目录中分别建立以各角色名称命名的目录,如webservers等;
(3) 在每一个角色命名的目录中分别建立files、handlers、meta、tasks、templates和vars目录;用不到的目录能够建立为空目录,也能够不建立;
(4) 在playbook文件中,调用各角色;
示例:建立nginx角色
#设置任务文件,注意,配置模板文件的src使用相对路径便可,目录的相对路径是:/usr/share/ansible/roles/nginx/templates/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
vim
/usr/share/ansible/roles/nginx/tasks/main
.yml
- name:
install
nginx package
yum: name=nginx state=latest
- name: copy nginx conf
file
tempalte: src=web.conf.j2 dest=
/etc/nginx/conf
.d
/web
.conf
notify: reload nginx
tags: cpfile
- name: create docroot
dir
file
: path={{ ngx_doc_root }} state=directory
tags: cpfile
- name: start nginx service
service: name=nginx enabled=
true
state=started
#设置变量,在vars目录下定义变量,变量不须要横杆引导
vim
/usr/share/ansible/roles/nginx/vars/main
.yml
ngx_port: 8888
ngx_server_name: www.sunny.com
ngx_doc_root:
/webdata
#设置触发后执行的操做
vim
/usr/share/ansible/roles/nginx/handlers/main
.yml
- name: reload nginx
service: name=nginx state=reloaded
#设置模板文件
vim
/usr/share/ansible/roles/nginx/templates/web
.conf.j2
server {
listen {{ ngx_port }};
server_name {{ ngx_server_name }};
location / {
root {{ ngx_doc_root }};
}
}
|
#调用模块
1
2
3
4
5
|
vim
/root/ansible/nginxrole
.yml
- hosts: dbsrvs
remote_user: root
roles:
- nginx
|
测试模块
1
|
ansible-playbook -C
/root/ansible/nginxrole
.yml
|
注意,因为测试没有实际安装nginx模块,所以测试时,启动服务会失败
执行模块
1
|
ansible-playbook
/root/ansible/nginxrole
.yml
|
执行tag cpfile对应的代码,若是文件web.conf.j2 发生变化,包括定义变量的文件发送变化,就会从新服务该文件到对应机器,同时,notify生效,重启nginx服务
1
|
ansible-playbook -t cpfile
/root/ansible/nginxrole
.yml
|
在执行命令中执行变量,注意,命令里的变量优先级比配置再模块vars下的优先级高
1
|
ansible-playbook -t cpfile -e
"ngx_port=8899"
/root/ansible/nginxrole
.yml
|
在playbook调用角色方法1:
- hosts: websrvs
remote_user: root
roles:
- nginx
- memcached
在playbook调用角色方法2:传递变量给角色
- hosts: websrvs
remote_user: root
roles:
- { role: nginx, username: nginx } 键role用于指定角色名称,后续的K/V用于传递变量给角色
还能够基于条件测试实现角色调用3;
roles:
- { role: nginx, when: ansible_distribution_major_version == '7' }
参考文档:www.ansible.com.cn