运维之ansible

运维工做:系统安装(物理机、虚拟机)--> 程序包安装、配置、服务启动 --> 批量操做 --> 程序发布  --> 监控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

1

其中nginx.j2   传递了2个变量

worker_processes {{ ansible_processor_vcpus-1 }};                  #由setup模块提供的变量;

listen {{ http_port }} default_server;

 

http_port变量是由/etc/ansible/hosts文件传递;以下

2

 

 

 

条件测试:

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

相关文章
相关标签/搜索