------------恢复内容开始------------
1.ansible的概念
1.Ansible简介 目标
Ansible 是一个配置管理和应用部署工具,即在管理主机上操作一些命令就能在节点主机上进行相应的动作。由在比如拷贝
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工作原理
管理主机从
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 模块,如果执行单一命令可以不用
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模块;
由下面
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 可用于声明配置,在可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤.并且可以同步或异步的发起任务。
我们使用而使用
在在
‘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是默认执行,用来获取远程主机的信息如,网络信息等。
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.j2是httpd配置文件
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.j2是httpd配置文件
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
生活是一种感受也是一种积累