您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 订阅
  捐助
运维自动化好帮手:ansible软件入门篇
   次浏览      
   2018-6-15
 
编辑推荐:
本文来源51cto,本文主要介绍自动化工具Ansible,以及对Ansible的详解,希望对您的学习有帮助。

一:关于自动化我们要知道的

1、自动化是什么?

IT运维自动化是一组将静态的设备结构转化为根据IT服务需求动态弹性响应的策略,目的就是实现IT运维的质量,降低成本。可以说自动化运维一定是IT运维高层面的重要属性之一。

2、为什么要使用自动化技术?

当公司规模扩大,从初期的几台服务器发展到庞大的数据中心时,自然而然的单靠人工就无法满足在技术、业务、管理等方面的要求,那么标准化、自动化、架构优化、过程优化等降低IT服务成本的因素越来越被人们所重视。

3、自动化的目的是什么?

自动化作为其重要属性之一已经不仅仅只是代替人工操作,更重要的是深层探知和全局分析,关注的是在当前条件下如何实现性能与服务最优化,同时保障投资收益最大化。

二:自动化工具——Ansible软件详解

1、是什么

基于python开发的,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

2、Ansible软件特点

①部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;

②默认使用SSH协议对设备进行管理;

③有大量常规运维操作模块,可实现日常绝大部分操作。

④配置简单、功能强大、扩展性强;

⑤支持API及自定义模块,可通过Python轻松扩展;

⑥通过Playbooks来定制强大的配置、状态管理;

⑦轻量级,无需在客户端安装agent,更新时,只需在操作机上 进行一次更新即可;

⑧提供一个功能强大、操作性强的Web管理界面和REST API接口 ——AWX平台。

3、Ansible基本架构图 && 核心组件说明

1.Ansible:Ansible核心程序。

2.HostInventory:记录由Ansible管理的主机信息,包括端口、密码 、ip等。

3.Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件 中,定义主机需要调用哪些模块来完成的功能。

4.CoreModules:核心模块,主要操作是通过调用核心模块来完成管 理任务。

5.CustomModules:自定义模块,完成核心模块无法完成的功能, 支持多种语言。

6.ConnectionPlugins:连接插件,Ansible和Host通信使用

4、ansible任务执行模式:单个命令、批量命令

①ad-hoc模式:使用单个模块,支持批量执行单条命令。 ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。

②playbook模式:是Ansible主要管理方式,也是Ansible功能强大的关 键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc进行操作的配置文件。

5、ansible执行流程 && 流程描述

1、加载自己的配置文件 默认/etc/ansible/ansible.cfg

2、查找对应的主机配置文件,找到要执行的主机或者组

3、加载自己对应的模块文件,如command

4、通过ansible将模块或命令生成对应的临时py文件,并将该文件传 输至远程服务器的

5、对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件

6、给文件+x执行

7、执行并返回结果

8、删除临时py文件,sleep 0退出

三:Ansible常用命令及用法

常用命令

1./usr/bin/ansible # Ansibe AD-Hoc 临时命令执行工具,常用于临时命 令的执行

2./usr/bin/ansible-doc # Ansible 模块功能查看工具

3./usr/bin/ansible-galaxy # 下载/上传优秀代码或Roles模块 的官网平台 ,基于网络的

4./usr/bin/ansible-playbook # Ansible 定制自动化的任务集编排工具

5./usr/bin/ansible-pull # Ansible远程执行命令的工具,拉取配置而非推 送配置(使用较少,海量机时使用,对运维的架构能力要求较高)

6./usr/bin/ansible-vault # Ansible 文件加密工具

7./usr/bin/ansible-console # Ansible基于Linux Consoble界面可与用户交互的命令执行工具

命令详解

1、ansible-doc

(1)命令格式

ansible-doc [options] [module...]

(2)options

-h:--help 显示命令参考API文档

-l:--list 列出可用模块

-M module_path:--module-path=module_path 指定模块路径

-s mode_name:--snippet 获取指定模块的使用帮助

--version:显示版本信息

2、ansible

(1)命令格式

①ansible [-f forks] [-m module_name] [-a args]

②ansible <host-pattern> [options] Options

(2)options

· -a MODULE_ARGS, --args=MODULE_ARGS :模块的参数,如果执行默认COMMAND的模块,即是命令参数 ,如:“date”,“pwd”等等 module arguments 模块

参数

· -m MODULE_NAME, --module-name=MODULE_NAME:执行模块的名字,默认使用"command" 模块,所以如果是只执行单一命令可以不用

· -M MODULE_PATH, --module-path=MODULE_PATH:要执行的模块的路径(default:/usr/share/ansible)

· -f FORKS, --forks=FORKS: 并行任务数(default:5)

· -C, --check:测试模式。测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化

· -c connection,--connection=CONNECTION:连接类型使用(default:smart)

· -v, --verbose(-vvv,-vvvv):显示命令执行的详细信息/超详细信息 (常和-C配合使用,用于运行前测试环节)

· -i INVENTORY, --inventory-file=INVENTORY:指定主机清单存放路径,默认为/etc/ansible/hosts

· -S, --su :使用 su 命令

· -R SU_USER, --su-user=SU_USER 指定SU的用户(default:root)

· -s, --sudo:以sudo方式运行(不需要密码)

· -U SUDO_USER, --sudo-user=SUDO_USER :sudo到哪个用户(default:root)

· -T TIMEOUT, --timeout=TIMEOUT:指定SSH默认超时时间(default:10s)

· -u REMOTE_USER, --user=REMOTE_USER:默认连接到远程主机哪个用户(default:root)

· -k, --ask-pass:登陆密码,提示输入ssh密码而不是假设基于密钥的验证

· -K, --ask-sudo-pass:提示密码使用sudo,sudo表示提权操作

· -B SECONDS, --background=SECONDS:后台运行超时时间

· -h,--help:查看帮助

· -o, --one-line:压缩输出,摘要输出,尝试将所有内容都在一行上输出。

· -private-key=PRIVATE_KEY_FILE:私钥路径,使用这个文件来验证连接

(3)常用模块

①ping 测试主机网络连通性

[root@server ~]# ansible all -m ping

172.17.214.75 | SUCCESS => {

"changed": false,

"ping": "pong"

}

172.17.214.74 | SUCCESS => {

"changed": false,

"ping": "pong"

}

②command执行命令

[root@server ~]# ansible webserver -m command -a 'ifconfig' 在webserver主机组上执行命令ifconfig

注意:命令模式下,'' 的用法 :'命令名称+用空格分隔的列表参数', 给定的命令将在所有指定节点上执行,但不支持shell命令模式,如下列几种:

$arg、"<"、">"、"|"、";"、"&"等shell命令,有其特定的命令:

1. chdir=dir_name:切换目录

2.executable:切换shell来执行命令(注意:命令要使用绝对路径表示)

3. free_form:要执行的linux命令,一般用-a选项代替

4.creates=file_name:文件存在,则命令不执行,只可用来做判断

5.removes=file_name:文件存在,则命令执行,也用来做判断

使用示例如下:

①[root@server ~]# ansible all -m command -a 'creates=/app/hehe.w ls'

172.17.214.74 | SUCCESS | rc=0 >>

skipped, since /app/hehe.w exists

172.17.214.75 | SUCCESS | rc=0 >>

skipped, since /app/hehe.w exists

因为两主机都存在此文件,所以ls命令不执行

②[root@server ~]# ansible all -m command -a 'removes=/app/hehe.w ls'

172.17.214.74 | SUCCESS | rc=0 >>

172.17.214.75 | SUCCESS | rc=0 >>

两主机文件存在,则执行此ls命令

3.shell 远程主机执行shell命令(支持管道、重定向等特殊符号)

[root@server ~]# ansible all -m shell -a 'cat /etc/passwd | grep "root"'

172.17.214.74 | SUCCESS | rc=0 >>

root:x:0:0:root:/root:/bin/bash

172.17.214.75 | SUCCESS | rc=0 >>

root:x:0:0:root:/root:/bin/bash

4.copy 复制文件到远程主机

copy模块常见用法:

1、复制文件

-a "src= dest= "

2、生成指定内容的文件

-a "content= dest= "

copy模块常用选项:

①backup=<yes|no> :覆盖文件之前,备份原文件

②content:功能与重定向">"相同,文件存在则覆盖文件内容(default),不能存在则创建指定内容文件

③dest:文件或目录,必须为绝对路径

④src:文件或目录,相对路径|绝对路径。

⑤directory_mode:递归设置目录权限,默认为系统默认权限

⑥force yes|no :设为yes时,若目标主机包含该文件,则强制覆盖;若为no,则只有目标主机不存在该文件时才复制。(default:yes)

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

5.file 设置文件属性

常见用法:

1、创建目录

-a 'path= state=directory'

2、创建链接文件

-a 'path= src= state=link'

3、删除文件

-a 'path= state=absent'

4、常见选项:

①force yes|no:强制创建软链接。第一,源文件不存在,但稍后会创建;第二,目标软链接已存在,需要先取消之前的链接关系,创建新的软链接。

②group:定义文件/目录的属组 mode:定义文件/目录权限

③owner:定义文件/目录的属主 path:定义文件/目录路径(必选项)

④recurse:递归设置文件属性

⑤src:被链接的源文件路径,只应用于state=link

⑥dest:被链接的文件路径,只应用于state=link

⑦state:

directory:若目录不存在,则创建目录

file:文件不存在也不创建

link:创建软连接

hard:创建硬链接

touch:若文件不存在,则会创建一个新文件, 若存在,则更新时间戳

absent:删除文件、目录、链接文件

6.fetch 从远程某主机获取文件到本地

dest:本机用来存放拉过来的文件或目录的目录

src:远程文件。(只能为文件)

7.cron 管理计划任务

常见action:

cron backup=<yes|no>:创建一个crontab备份

cron_file=file_name:如果使用,使用这个cron.d,而不是单个用户

常见时间选项:

day= #日应该运行的工作( 1-31, *, */2, )

hour= # 小时 ( 0-23, *, */2, )

minute= #分钟( 0-59, *, */2, )

month= # 月( 1-12, *, /2, )

weekday # 周 ( 0-6 for Sunday-Saturday)

常用选项:

jod="" :指明执行的命令

name="":任务描述

reboot 任务在重启时运行。(不建议使用,建议使用special_time)

special_time="":特殊的时间范围,参数有:reboot(重启时),annually(每年),monthly(每月),weekly (每周),daily(每天),hourly(每小时)

state="":指定状态,常见状态有present(添加定时任务)、absent(删除定时任务)

user="":以哪个用户身份去运行

eg:每五分钟同步各主机时间

[root@server ~]# ansible all -m cron -a 'name="sync date per second 5 min" minute="*/5" job="/usr/sbin/ntpdate 172.17.0.1 &> /dev/null"'

[root@server ~]# ansible all -m shell -a 'crontab -l' #查看计划任务添加情况

8.yum 安装软件

name= #所安装的包的名称

state= #present(安装), latest(安装最新的), absent(卸载软件)。

update_cache #强制更新yum的缓存。

conf_file #设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。

disable_gpg_check #是否禁止GPG checking,只用于`present‘ or `latest’。

disablerepo #临时禁止使用yum库。 只用于安装或更新时

enablerepo #临时使用的yum库。只用于安装或更新时。

9.service 服务管理

arguments #命令行提供额外的参数

enabled=<true|false> #设置开机启动。

name= #服务名称

runlevel #开机启动的级别,一般不用指定。

sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。

state #started启动服务, stopped停止服务, restarted重启服务, reloaded重载配置

10.user 用户和账号管理

comment # 用户的描述信息

createhome # 是否创建家目录

force # 在使用state=absent时, 行为与userdel –force一致.

group # 指定基本组 groups # 指定附加组,如果指定为(groups=)表示删除所有组

home # 指定用户家目录 move_home # 如果设置为home=时, 试图将用户主目录移动到指定的目录

name # 指定用户名

non_unique # 该选项允许改变非唯一的用户ID值

password # 指定用户密码

remove # 在使用state=absent时, 行为是与userdel –remove一致

shell # 指定默认shell

state # 设置帐号状态,不指定为创建,指定值为absent表示删除

system # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户

uid # 指定用户的uid

update_password # 更新用户密码

11.group 组管理,添加或删除组

gid #设置组的GID号

name= #组名

state #指定组状态,默认为创建(present),设置值为absent为删除

system #设置值为yes,表示为创建系统组

12.script 运行服务器端脚本

ansible all -m script -a '/root/test.sh'

13.setup 查看机器所有facts信息

facts是什么?

facts是一个内建变量。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。

※setup模块主要功能

setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。 setup模块下经常使用的一个参数是filter参数,具体使用示例如下(由于输出结果较多,这里只列命令不写结果):

setup常用命令格式:

#ansible web -m setup //查看主机所有变量

#ansible 10.212.52.252 -m setup -a 'filter=ansible_*_mb' //查看主机内存信息

#ansible 10.212.52.252 -m setup -a 'filter=ansible_eth[0-2]' //查看地接口为eth0-2的网卡信息

#ansible all -m setup --tree /tmp/facts //将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中,如下为命令执

行结果:

[root@server ~]# ls /tmp/facts/

172.17.214.74 172.17.214.75

四:Ansible playbook

1、playbook简介

(1)playbook是ansible用于配置,部署,和管理被控节点的剧本

(2)通过playbook的详细描述,执行其中一系列tasks来操控节点

(3)演员:计算机

剧本:playbook

2、playbook使用场景

(1)ad-doc适合执行单条命令,当命令较多时,需要playbook

(2)playbook有自己的语法格式

(3)可以将常用的命令集合编写为playbook

3、playbook编写详解

(1)语法格式

①开头:文件的第一行应该以 ”—” (三个连字符)开始,表明YMAL文件的开始。
②注释:在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
③列表元素:YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。
eg:- apple - banana - orange 等价于python列表 ["apple","banana","orange"]
④常用对象指定:play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":"分隔表示,"

(2)playbook组件详解

①Hosts:运行指定任务的目标主机
(a)主机清单默认为/etc/ansible/hosts,也可自己指定文件,通过-i file_name指定
(b) ansible --list-hosts 显示哪些主机参与到task的执行中
②remote_user:远程主机上执行任务的用户
③sudo_user:切换远程主机上执行任务的用户
④tasks: 任务列表,配合各模块使用才有功能。
module_name: modile arguments
注意:shell和command模块后可直接跟命令,而非key=value参数列表
⑤handlers 任务,在特定条件下被触发,接收到其他任务的通知时被触发
格式:
tasks:
- name: restart httpd service
service: name=httpd states=stopped
notify: httpd_manager
handlers:
- name: httpd_manager
service: name=httpd states=started

⑥变量 Variables
方法1)facts:可直接调用
注意:可使用setup模块直接获取目标主机的facters;
方法2)用户自定义变量
(a)命令行定义:ansible-playbook *.yml -e var1=value1
eg:①定义变量名
tasks:
- name: stop httpd service
service: name={{ service_name }} states=stopped ##定义变量service_name
②命令行引用变量
ansible-playbook web.yml -e service_name=httpd ##关闭httpd服务
(b).yml文件中定义:
vars:
- var1: value1
- var2: value2
注意:vars位置为hosts之下,tasks之外,与tasks等级相同
方法3)通过roles传递变量
方法4)Host Inventory 主机清单文件自中定义
(a) 向不同主机传递不同的变量:
ip/hostname var1=value1 var2=value2
(b)向组中的主机传递相同变量
[group_name:vars] //原样输入即可
var1=value1 //指定变量及变量值

⑦tags:为单个执行命令打标签
1)修改yml文件
tasks:
- name: restart httpd service
service: name=httpd states=stopped
tags: restart-httpd
2)命令行引用tags,运行单独task
absible-playbook web.yml -t restart-httpd ”-t“ 引用tag,运行指定命令

 

4、playbook运行方法

(1)试运行
ansible-playbook --check/-C #测试运行yml文件,不执行真正操作,用来查看是否有错误
ansible-playbook --list-hosts #列出执行task所用主机
ansible-playbook
(2)直接运行
ansible-playbook *.yml

5、playbook字典

语法示例:
- name: add some users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
- { name:'user11',group:'group11' }
- { name:'user22',group:'group22' }

6、playbook条件测试

(1)条件测试:when
用法:在task中使用,jinja2的语法格式
eg:
tasks:
- name: install conf file to centos7
template: src=files/nginx.conf.c7.j2
when: ansible_distribution_major_version == "7"
- name: install conf file to centos6
template: src=files/nginx.conf.c6.j2
when: ansible_distribution_major_version == "6"
(2)循环:迭代,需要重复执行的任务
用法:①对迭代项的引用,固定变量名为 "item"
②而后,要在task中使用with_items给定要迭代的元素列表
eg:
- hosts: web
remote_user: root
tasks:
- name: uninstall web packages
yum: name={{ item }} state=absent
with_item:
- httpd
- php
- php-mysql
- php-fpm

7、roles 角色定制

(1)功能
roles 用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等。roles就是通过分别将变量(vars)、文
件(file)、任务(tasks)、模块 (modules)及处理器(handlers)放置于单独的目录中,并可以便捷 地include它们的一种机制。角色一般用于基于主机构建
服务的场 景中,但也可以是用于构建守护进程等场景中。要使用 roles只需要在playbook中使用include指令即可。

(2)角色集合
①mysql/
②httpd/
③nginx/
④files/: 存储由copy或script等模块调用的文件;
⑤tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml 进行“包含”调用;
⑥handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由 main.yml进行“包含”调用;
⑦vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由 main.yml进行“包含”调用;
⑧templates/:存储由template模块调用的模板文本;
⑨meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的 文件需要由main.yml进行“包含”调用;
⑩default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

(3)角色定制操作步骤
①在role目录下生成对应的目录结构
mkdir -pv ./{nginx,mysql,httpd}/{files,templates,

vars,tasks,handlers,meta,default}
②定义/tasks/main.yml的配置文件
- name: cp
copy: src=nginx-1.10.2-1.el7.ngx.x86_64.

rpm dest=/tmp/nginx-1.10.2- 1.el7.ngx.x86_64.rpm
- name: install
yum: name=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm

state=latest
- name: conf template: src=nginx.conf.j2

dest=/etc/nginx/nginx.conf
tags: nginxconf
notify: new conf to reload
name: start service
service: name=nginx state=started enabled=true
③修改变量文件
vars/main.yml 添加变量nginx_port: “8888”
④定义handlers文件
handlers/main.yml
- name: new conf to reload
service: name=nginx state=restarted
⑤定义/etc/ansible/nginx.yml的playbook文件
- hosts: nginx
remote_user: root
roles:
- nginx
⑥可以通过roles传递变量
- hosts: nginx
remote_user: root
roles:
- { role: nginx, nginxport: 12345 }
⑦也可以配置多个角色
roles:
# - { role: nginx, nginxport: 12345 }
- { role: memcached

 

   
次浏览       
相关文章

DevOps转型融入到企业文化
DevOps 能力模型、演进及案例剖析
基于 DevOps 理念的私有 PaaS 平台实践
微软开发团队的DevOps实践启示
相关文档

DevOps驱动应用运维变革与创新
运维管理规划
如何实现企业应用部署自动化
运维自动化实践之路
相关课程

自动化运维工具(基于DevOps)
互联网运维与DevOps
MySQL性能优化及运维培训
IT系统运维管理