linux之ansible自动化 案例和playbook工具

------------恢复内容开始------------

1.ansible的概念

1.Ansible简介 目标

Ansible 是一个配置管理和应用部署工具,即在管理主机上操作一些命令就能在节点主机上进行相应的动作。 Python 编写,由模块化组成,即执行动作的实体, ansible 上都是靠着相应的模块执行动作,比如拷贝 copy 模块、执行 command 模块、shell 模块、文件 file 模块等。

 

Ansible 的目标有如下:

自动化部署应用

自动化管理配置

自动化的持续交付

自动化的(AWS)云服务管理

2.Ansible作用

ansible帮助完成一些批量任务,或者完成一些需要经常重复的工作

比如:同时在100台服务器上安装nginx服务,并在安装后启动它们。

比如:将某个文件一次性拷贝到100台服务器上。

比如:每当有新服务器加入工作环境时,你都要为新服务器部署某个服务,也就是说你需要经常重复的完成相同的工作。

这些场景中我们都可以使用到ansible。

3.Ansible特性

模块化:调用特定的模块,完成特定任务

Paramiko,PyYAML,Jinja2(模板语言)三个关键模块

支持自定义模块

基于Python语言实现

部署简单,基于python和SSH(默认已安装),agentless

安全,基于OpenSSH

支持playbook编排任务,YAML格式

幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况

4.Ansible架构  组成部分

 

 

 

 

 

Ansible主要组成 部分功能说明

 

ANSIBLE:

组合INVENTORY、 API、 MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具v

INVENTORY:

 

Ansible管理主机的清单/etc/anaible/hosts

MODULES:Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义,ansible-doc –l 可查看模块

PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用

API:供第三方程序调用的应用程序编程接口v

PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,将多个任务定义在剧本中,由Ansible顺序依次执行,通常是JSON格式的YML文件。

 

ansible工作原理

 

管理主机从 hosts 里读取主机清单,通过 playbook 按顺序同时对管理的主机进行相应的操作。

 

2.Ansible案例

 

1.准备工作 配置yum源  安装absible  配置文件 默认即可

1.增加 yum 源

cd /etc/yum.repos.d

ls

mkdir bak

mv *  bak

vim bases.repo

 

 

 

 

 

yum install -y epel-release

rpm -ql epel-release

 

 

 

 

 

2.安装ansible

yum install -y ansible

ansible --version

 

 

 

 

 

 

3.Ansible配置文件默认即可

vim /etc/ansible/ansible.cfg

 

 

 

 

 

2配置主机文件/etc/ansible/hosts 增加客户端主机  增加主机组

 

vim /etc/ansible/hosts

增加这  被监控的主机

 

192.168.10.20

 

增加 主机组

[webservers]

192.168.10.20

 

 

 

 

 

注意  如果web主机多为连续的    可以这样写

 

 

 

 

 

 

3.实现ssh无秘钥登录

ssh-keygen回车即可

ssh-copy-id 192.168.10.20

ssh 192.168.10.20

 

 

 

 

 

 

ansible 192.168.10.20 -a 'date'

 

 

 

 

 

ad-hoc命令部分

ansible host-pattern [-f forks] [-m module] [-a args]


-a 'Arguments',    --args='Arguments' 命令行参数
-m NAME,     --module -name=NAME 执行模块的名字默认使用 command 模块,如果执行单一命令可以不用 -m参数

 

 

4.1.Copy模块 常用模块

从本地copy文件分发到目录主机路径

参数说明:

src= 源文件路径 source

dest= 目标路径  destination

注意src= 路径后面带/ 表示带里面的所有内容复制到目标目录下,不带/是目录递归复制过去

content=自行填充的文件内容

owner 属主

group 属组

Mode权限

 

在服务端10.10上  拷贝文件

ansible all -m copy -a "src=/etc/passwd dest=/tmp/passwd mode=600"

 

 

 

 

 

10.20查看

 

 

4.2.fetch模块

从远程主机10.10 拉取文件到本地

需指定src和dest,dest只要指定一个接收目录,默认会在后面加上远程主机及src的路径

 

10.10   拉取  查看

ansible all -m fetch -a "src=/tmp/passwd dest=/tmp"

 

 

 

 

 

 

 

4.3.command模块

在远程主机上执行命令,属于裸执行;不进行shell解析;

ansible all -m command -a "ip a"

 

 

 

 

 

ansible all -m command -a "ip a| grep ens33"查看10.20主机的ens33网卡会报错

ansible all -m command -a "ip a|grep lo"

 

 

 

 

 

会报错   是因为command模块不是shell解析属于裸执行导致的

为了能达成以上类似shell中的解析,ansible有一个shell模块;

 

 

 

 

由下面 shell模块来执行 即可

 

4.4.shell模块

由于commnad只能执行裸命令(即系统环境中有支持的命令),至于管道之类的功能不支持,

shell模块可以做到

 

ansible all -m shell -a "ip a|grep lo"

 

 

 

 

 

 

4.5.file模块

设置文件属性(创建文件)

文件属性 :  文件名 文件大小  属主 属组  时间戳  权限 特殊位

 

文件类型

文件属性

文件类型

-

常规文件,即file

d

目录文件

b

block device 即块设备文件,如硬盘;支持以block为单位进行随机访问

c

character device 即字符设备文件,如键盘支持以character为单位进行线性访问

l

symbolic link 即符号链接文件,又称软链接文件

p

pipe 即命名管道文件

s

socket 即套接字文件,用于实现两个进程进行通信

 

常用参数:

path目标路径

state directory为目录,link为软件链接

group 目录 属组

owner 属主等,   其他参数通过ansible-doc -s file 获取

 

10.10创建目录

ansible all -m file -a "path=/tmp/xld state=directory"

 

 

 

 

 

10.10服务端  创建软件链接

ansible all -m file -a "src=/etc/fstab dest=/tmp/fstab.link state=link"

 

 

 

 

 

10.20查看

 

 

 

 

 

 

4.6.user模块:可以快速在被管控主机上批量添加用户

用户的7个字段

1.用户名

2.密码标识列

3.用户id

4.组id

5.备注

6.家目录

7.shell环境

Useradd增加用户

Usermod更改用户的属性 uid等  -G  -g

 

常用参数:

state=present   创建用户

home=     来指定用户家目录路径

system=true   创建系统用户

uid=  来指定用户uid

shell=     指定用户的默认shell

 

state=present创建用户

start=absent  删除用户

remove=true  删除用户家目录

 

创建用户

ansible all -m user -a 'name=xld state=present'

 

 

 

 

删除用户:

ansible all -m user -a 'name=xld state=absent'

 

 

 

 

 

删除家目录 ???

ansible all -m user -a 'name=xld remove=true'

 

 

 

 

 

10.20 验证

cat /etc/passwd

tail -l /etc/passwd

 

 

 

 

 

 

  

4.7.group模块

user类似,用于创建系统组

示例:

 

ansible all -m group -a  'name=go state=present gid=5001 system=true'

system=true   创建一个系统组

如果要删除该组,只需要将state=present改成state=absent就可以了

 

 

 

 

10.20查看

tail -l /etc/group

 

 

 

 

 

10.10删除组

ansible all -m group -a  'name=go state=absent gid=5001 system=true'

 

 

 

 

 

10.20查看,没有了

 

 

 

 

4.8.yum模块   yum安装软件包的模块

常用参数说明:

enablerepo,disablerepo表示启用与禁用某repo库

name 安装包名

state =present或者installed表示安装,

state =absentor或者 removed 表示删除

 

示例:通过安装epel扩展源并安装nginx

ansible all -m yum -a "name=epel-release state=installed"

ansible all -m yum -a "name=nginx state=installed"

 

ansible all  -a "systemctl start nginx"

ansible all  -a "systemctl status nginx"

 

 

 

 

 

 

 

 

10.20查看

systemctl status nginx

 

 

 

 

 

 

4.9.service模块 服务管理模块

常用参数:

name:服务名

state:服务状态

enabled: 是否开机启动 true|false

 

ansible all -m service -a "name=nginx state=stopped enabled=true"

ansible all -m service -a "name=nginx state=started enabled=true"

 

 

 

 

 

10.10上查看10.20的nginx服务状态

ansible all -m command  -a "systemctl status nginx"

 

 

 

 

 

10.20上查看

 

 

 

 

10.10启动

 

 

 

 

 

10.20查看

 

 

 

 

 

4.10.script模块  把本地的脚本传到远端执行;前提是到远端可以执行

 

10.10服务端  写一个测试 脚本

 

vim test.sh

#!/bin/bash

echo "hello world" >/tmp/ansible.txt

 

 

 

 

 

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

或者

ansible webservers -m script -a "/root/test.sh"

 

 

 

 

  

10.20验证

 

 

 

 

 

3.Playbook工具

playbook简介:

Playbooks 与 adhoc 相比,是一种完全不同的运用 ansible 的方式,是非常强大的。

 

playbooks 是一种简单的配置管理系统与多机器部署系统的基础.与现有的其他系统有不同之处,且非常适合于复杂应用的部署。

安装部署一个httpd服务,需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,他的实质就是一个文件有着特定的组织格式,它采用的语法格式是YAML(Yet Another Markup Language)YAML语法能够简单的表示散列表,字典等数据结构。

 

YAML基本语法

 

列表:每一个列表成员前面都要有一个短横线和一个空格

 

fruits:

- Apple

- Orange

- Strawberry

- Mango

 

列表和字典可以混合使用

-  martin:

name: Martin D'vloper

job: Developer

skills:

- python

- perl

- pascal

 

注意  冒号 小横杠   后面要有空格

 

Playbooks 可用于声明配置, playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,回有序的执行特别指定的步骤.并且可以同步或异步的发起任务

 

我们使用 ad-hoc 时,主要是使用 /usr/bin/ansible 程序执行任务。而使用 playbooks 时,更多是将之放入源码控制之中,用之推送你的配置或是用于确认你的远程系统的配置是否符合配置规范。

 

play 之中,一组机器被映射为定义好的角色。 ansible 中,play 的内容,被称为 tasks,即任务。在基本层次的应用中,一个任务是一个对 ansible 模块的调用。

‘plays’ 好似音符,playbook 好似由 ‘plays’ 构成的曲谱,通过 playbook,可以编排步骤进行多机器的部署,比如在 webservers 组的所有机器上运行一定的步骤, 然后在 database server 组运行一些步骤,最后回到 webservers 组,再运行一些步骤,诸如此类。

 

 

1.playbook的核心元素

hosts : playbook配置文件作用的主机

remote_user:在远程主机上执行任务的用户

tasks: 任务列表

variables: 变量

templates:包含模板语法的文本 文件,使用jinja2语法。

handlers :由特定条件触发的任务

roles :用于层次性、结构化地组织playbook。

roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等

 

整个playbook是以task为中心表明要执行的任务

hosts和remote_user表明在哪些远程主机以何种身份执行。

src=

 

templates

它是一个模块功能,与copy不同的是它的文本文件采用了jinga2语法template只能在palybook中使用(使用了Jinjia2格式作为文件模版,进行文档内变量的替换的模块。相当于copy)

 

2.playbook运行方式

ansible-playbook --check 只检测   可能会发生的改变,但不真执行操作

ansible-playbook --list-hosts 列出  运行任务的主机

ansible-playbook --syntax-check playbook.yaml 语法检测

ansible-playbook -t TAGS_NAME playbook.yaml 只执行TAGS_NAME任务

ansible-playbook yam文件.yaml 运行

 

3.通过playbook安装管理httpd服务-案例version1

yum install -y httpd

grep ^Listen /etc/httpd/conf/httpd.conf 查看监听端口

 

 

 

 

 

vim httpd01.yml

 

- hosts: webservers

remote_user: root

tasks:

- name: install httpd

yum: name=httpd state=present

- name: install configure file

copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/

- name: start httpd service

service: name=httpd state=started

 

 

 

 

 

 

检测测试playbook

ansible-playbook --check httpd01.yml

 

 

 

 

 

注意

gather facts是默认执行,用来获取远程主机的信息   ip,hostname,网络信息等。

TASK [install httpd]   创建task时,name后面的字符串

changed: [192.168.137.106]  changed表明此安装包没有安装,会执行安装命令

PLAY RECAP 这是总结

 

运行playbook

ansible-playbook httpd01.yml

 

 

 

 

 

 

验证10.10 查看服务启动时的端口

ansible webservers -m shell -a "ss -lant |grep 80"

 

 

 

 

 

 

 

 

4.安装部署httpd服务-案例version2

 

copy命令拷贝配置文件时,无法对配置文件进行修改,不够灵活。

 

 

案例  使用template拷贝文件,并使用主机变量设置httpd端口号

 

vim /etc/ansible/hosts

 

 

 

 

 

egrep -v "^$|^#" /etc/ansible/hosts

 

 

 

 

 

cp /etc/httpd/conf/httpd.conf  /etc/httpd/conf/httpd.conf.j2

vim /etc/httpd/conf/httpd.conf.j2

 

 

 

 

 

cd /etc/httpd/conf/

grep ^Listen httpd.conf.j2

 

 

 

 

 

vim httpd02.yml

 

 

- hosts: webservers

remote_user: root

tasks:

- name: install httpd

yum: name=httpd state=present

- name: install configure file

template: src=/etc/httpd/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf

- name: start httpd service

service: name=httpd state=started

 

 

 

 

注意   template 为源

 

 

检查playbook

ansible-playbook --check httpd02.yml

 

 

 

 

 

运行playbook

ansible-playbook httpd02.yml

ansible webservers -m shell -a "ss  -ltn|grep :80"

 

 

 

 

 

 

由此可以看出playbook中只将文件拷贝过去了,并没有重启服务,所以我们可以看到端口监听的依然是80而不是8088。在配置文件  增加 修改时触发一个任务,这就是handlers的用法,重新修改playbook文件。

 

重新修改YAML文件

 

vi httpd02.yml

 

- hosts: webservers

remote_user: root

tasks:

- name: install httpd

yum: name=httpd state=present

- name: install configure file

notify: restart httpd service

template: src=/etc/httpd/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf

- name: start httpd service

service: name=httpd state=started

handlers:

- name: restart httpd service

service: name=httpd state=restarted

 

 

 

 

 

 

执行之前,需要10主机上的Listen端口改为8088

因为刚执行的,虽然没重启,但是文件复制过去了。

增加handlers重启服务即可

 

ansible-playbook --check httpd02.yml

ansible-playbook httpd02.yml

 

 

 

 

 

ansible webservers -m shell -a "ss -ltn |grep :80"

 

 

 

 

注意

TASK [install configure file]

RUNNING HANDLER [restart httpd service]这两个是执行的任务

 

playbook执行了两个任务,一个是拷贝文件,一个是重启服务。

此时监听的端口不是80  而是8088

 

修改配置文件并重启服务 这是一个非常常见的操作

它只需执行两个task   但我们把所有的任务都执行一遍,这会降低效率, 可以使用tags来指定执行那个任务

 

5.案例 version03 指定执行任务

注意,修改了端口号

vim /etc/ansible/hosts

 

 

 

 

 

egrep -v '(^$|^#)' /etc/ansible/hosts

 

 

 

 

 

 

修改playbook文件

 

vim httpd03.yml

 

- hosts: webservers

remote_user: root

tasks:

- name: install httpd

yum: name=httpd state=present

- name: install configure file

notify: restart httpd service

tags: reinstall configure file

template: src=/etc/httpd/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf

- name: start httpd service

service: name=httpd state=started

handlers:

- name: restart httpd service

service: name=httpd state=restarted

 

 

 

 

 

 

检测

ansible-playbook --check httpd03.yml

 

 

 

 

 

执行playbook

ansible-playbook --tags="reinstall configure file" httpd03.yml

 

 

 

 

 

ansible webservers -m shell -a "ss -ltn |grep :80"

 

 

 

 

playbook只执行了拷贝文件,以及拷贝文件触发的重启服务事件。

服务开启的是8080端口。

 

4.Ansible之roles使用

1.Roles作用

主要作用是复用playbook,例如我们安装软件会安装时间同步服务,那么每个playbook都要编写ntp task。可ntp task写好,用的时候调用即可ansible中将其组织成role,他有着固定的组织格式。以便playbook调用。

 

2.relos介绍

 

特定的层级目录结构   进行组织   形式 tasks、variables、handlers、templates、files等;

相当于函数的调用把各个功能切割成片段来执行

 

3.1.案例  层级目录结构

role存放的路径在配置文件/etc/ansible/ansible.cfg中定义

roles_path = /etc/ansible/roles

 

playbook中调用role

第一种:

- hosts: HOSTS

remote_user: root

roles:

- ROLE_NAME1

- ROLE_NAME2

 

第二种:除了字典第一个元素指明调用的role,后面是传递给role的变量

- hosts: HOSTS

remote_user: root

roles:

- { role: ROLE_NAME1, VARIABLE1: VALUE1, ...}

 

3.2. 以远程安装httpd为例,使用role示例

1). 目录结构:

httpd是playbook调用时role的名称

http.conf.c6.j2httpd配置文件

 

cd /etc/ansible/roles/

mkdir httpd

cd httpd/

mkdir tasks templates handlers

yum -y install tree

tree

 

 

 

 

 

 

 

 

role_name/:我们定义的role的名字

file/:     用于存放copy或script等模块调用的函数  文件

tasks/:用于定义各种task任务此目录一定要有main.yml

handlers/:用于定义各种handlers触发器此目录一定要有main.yml;

vars/:用于定义variables,此目录一定要有main.yml;

templates/:存储由template模块调用的模板文本;jinja2语法格式  {{  }}

default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

 

1). 编写tasks文件

cd /etc/ansible/roles/httpd/tasks

 

vim main.yml

 

- name: install httpd package

yum: name=httpd state=present

- name: install configure file

template: src=/etc/ansible/roles/httpd/templates/httpd.conf.c6.j2 dest=/etc/httpd/conf/httpd.conf

notify: restart httpd service

- name: start httpd service

service: name=httpd state=started enabled=true

 

 

 

 

 

此处不用写task,执行时是在tasks目录下role组件能够自动识别

 

 

2). 编写handlers文件

cd /etc/ansible/roles/httpd/handlers

 

vim main.yml

 

- name: restart httpd service

service: name=httpd state=restarted

 

 

 

 

 

3). 复制  使用 httpd的模板文件

注意 http.conf.c6.j2httpd配置文件

 

cd /etc/ansible/roles/httpd/templates

cp /etc/httpd/conf/httpd.conf.j2  ./

mv httpd.conf.j2  httpd.conf.c6.j2

vim httpd.conf.c6.j2

 

 

 

 

 

 

rep -C 3 ^Listen httpd.conf.c6.j2

 

 

使用httpd_port变量设置httpd_port端口号,此变量来自vars目录下申明的变量

 

4). 编写变量vars

 

cd /etc/ansible/roles/httpd/vars

 

vim main.yml

 

httpd_port: 8088

 

 

 

 

 

cd /etc/ansible/roles/

tree

 

 

 

 

5). 编写 playbook文件   主 yml文件

vim httpd_role.yml

 

- hosts: webservers

remote_user: root

roles:

- { role: httpd }

 

 

 

 

 

6). 测试playbook文件

ansible-playbook --check httpd_role.yml   检测

 

 

 

 

 

ansible-playbook httpd_role.yml    执行

 

 

 

 

 

ansible webservers -m shell -a "ss -tnlp|grep :80"

可以看到httpd监听的端口为8088

 

 

 

 

5.简答 & 实验

 

5.1简答题

Ansible常用哪些模块?

Ansible的host文件如何编写?

Ansible 的playbook文件有那几部分构成?

5.2 实验题x

Ansible安装

Ansible ad-hoc常用命令

编写playbook,实现批量部署nginx

基于role和template实现自动化部署httpd

 

 

 

 

 

 

 

 

posted @ 2020-08-10 18:51  浅唱I  阅读(787)  评论(0编辑  收藏  举报