Ansible

    ansible

    知识点思维导图:https://flowus.cn/share/7875c0e1-ebbd-4dad-aa7e-f40e6ed6c6d3

    什么是andsble?

    ansible是一款自动化运维工具,基于Python开发,可以实现

    批量系统配置

    批量程序部署

    批量运行命令等功能

    • ansible进行远程管理的两个方法:

      • adhoc临时命令。就是在命令行上执行管理命令。

      • playbook剧本。把管理任务用特定格式写到文件中。

    • 无论哪种方式,都是通过模块加参数进行管理。

    ansible产品特色

    基于SSH架构 模块丰富

    社区活跃 支持自定义模块

    支持异构IT架构 部署简单,容易上手

    ansible环境部署

    1.修改/etc/hosts

    控制节点ip 主机名

    被控节点ip 被控节点主机名

    如:

    2.配置ssh密钥

    ssh-keygen ssh-copy-id

    主机A :

    ssh-keygen

    ssh-copy-id 主机B 输入主机B的密码

    主机A即可免密ssh连接主机B

    • 使用一套ansible软件,有可能需要管理多种环境。如在同一台管理主机上管理开发环境和生产环境。

    • 通过创建不同的工作目录,来实现相应的管理需求。

    • 将某一环境下的主机写入到对应工作目录的主机清单文件。

    • 进入对应的工作目录执行管理任务,就可以管理相应环境的主机。

    3.创建ansible工作目录,目录名自己定义,不是固定的。

    4.创建配置文件。默认的配置文件是/etc/ansible/ansible.cfg,但是一般不使用它,而是在工作目录下创建自己的配置文件

    5.创建主机清单文件。写在[]里的是组名,[]下面的是组内的主机名

    ansible配置文件

    adhocl临时命令

    语法

    ansible模块

    • 在ansible中,通过模块来完成某一特定任务。

    • 学习模块,主要知道实现某种功能,需要哪个模块。

    • 模块的使用方式都一样。主要是查看该模块有哪些参数。

    command模块

    • ansible默认模块,用于在远程主机上执行任意命令

    • command不支持shell特性,如管道、重定向。

    shell模块

    • 与command模块类似,但是支持shell特性,如管道、重定向。

    script模块

    • 用于在远程主机上执行脚本

    file模块

    • 可以创建文件、目录、链接等,还可以修改权限、属性等

    • 常用的选项:

      • path:指定文件路径

      • owner:设置文件所有者

      • group:设置文件所属组

      • state:状态。touch表示创建文件,directory表示创建目录,link表示创建软链接,absent表示删除

      • mode:设置权限

      • src:source的简写,源

      • dest:destination的简写,目标

    copy模块

    • 用于将文件从控制端拷贝到被控端

    • 常用选项:

      • src:源。控制端的文件路径

      • dest:目标。被控制端的文件路径

      • content:内容。需要写到文件中的内容

    fetch模块

    • 与copy模块相反,copy是上传,fetch是下载

    • 常用选项:

      • src:源。被控制端的文件路径

      • dest:目标。控制端的文件路径

    lineinfile模块

    • 用于确保存目标文件中有某一行内容

    • 常用选项:

      • path:待修改的文件路径

      • line:写入文件的一行内容

      • regexp:正则表达式,用于查找文件中的内容

    replace模块

    • lineinfile会替换一行,replace可以替换关键词

    • 常用选项:

      • path:待修改的文件路径

      • replace:将正则表达式查到的内容,替换成replace的内容

      • regexp:正则表达式,用于查找文件中的内容

    文件操作综合练习

    • 所有操作均对webservers组中的主机生效

    • 在目标主机上创建/tmp/mydemo目录,属主和属组都是adm,权限为0777

    • 将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600

    • 替换目标主机/tmp/mydemo/hosts文件中的db1为database1

    • 将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录

    user模块

    • 实现linux用户管理

    • 常用选项:

      • name:待创建的用户名

      • uid:用户ID

      • group:设置主组

      • groups:设置附加组

      • home:设置家目录

      • password:设置用户密码

      • state:状态。present表示创建,它是默认选项。absent表示删除

      • remove:删除家目录、邮箱等。值为yes或true都可以。

    group模块

    • 创建、删除组

    • 常用选项:

      • name:待创建的组名

      • gid:组的ID号

      • state:present表示创建,它是默认选项。absent表示删除

    yum_repository

    • 用于配置yum

    • 常用选项:

      • file: 指定文件名

      • 其他选项,请与文件内容对照

    yum模块

    • 用于rpm软件包管理,如安装、升级、卸载

    • 常用选项:

      • name:包名

      • state:状态。present表示安装,如果已安装则忽略;latest表示安装或升级到最新版本;absent表示卸载。

    service模块

    • 用于控制服务。启动、关闭、重启、开机自启。

    • 常用选项:

      • name:控制的服务名

      • state:started表示启动;stopped表示关闭;restarted表示重启

      • enabled:yes表示设置开机自启;no表示设置开机不要自启。

    逻辑卷相关模块

    • 逻辑卷可以动态管理存储空间。可以对逻辑卷进行扩容或缩减。

    • 可以把硬盘或分区转换成物理卷PV;再把1到多个PV组合成卷组VG;然后在VG上划分逻辑卷LV。LV可以像普通分区一样,进行格式化、挂载。

    • 关闭虚拟机web1,为其添加2块20GB的硬盘

    • LINUX下KVM虚拟机新加的硬盘,名称是/dev/vdb/dev/vdc

    • vmware虚拟机新加的硬盘,名称是/dev/sdb/dev/sdc

    • 如果选nvme硬盘,名称可能是/dev/nvme0n1/dev/nvme0n2

    lvg模块
    • 创建、删除卷组,修改卷组大小

    • 常用选项:

      • vg:定义卷组名。vg:volume group

      • pvs:由哪些物理卷构成。pvs:physical volumes

    lvol模块

    • 创建、删除逻辑卷,修改逻辑卷大小

    • 常用选项:

      • vg:指定在哪个卷组上创建逻辑卷

      • lv:创建的逻辑卷名。lv:logical volume

      • size:逻辑卷的大小,不写单位,以M为单位

    filesystem模块

    • 用于格式化,也就是创建文件系统

    • 常用选项:

      • fstype:指定文件系统类型

      • dev:指定要格式化的设备,可以是分区,可以是逻辑卷

    mount模块

    • 用于挂载文件系统

    • 常用选项:

      • path:挂载点。如果挂载点不存在,自动创建。

      • src:待挂载的设备

      • fstype:文件系统类型

      • state:mounted,表示永久挂载

    Playbook剧本

    • 常用于复杂任务的管理,以及管理经常要完成的任务

    • playbook也是通过模块和它的参数,在特定主机上执行任务

    • playbook是一个文件,该文件中需要通过yaml格式进行书写

    YAML

    • YAML Ain't a Markup Language:YAML不是一个标记语言

    yaml语法规范

    1. yaml文件的文件名,一般以yml或yaml作为扩展名

    2. 文件一般以---作为第一行,不是必须的,但是常用

    3. 键值对使用冒号:表示,冒号后面必须有空格。

    4. 数组使用-表示,-后面必须有空格。

    5. 相同的层级必须有相同的缩进。如果缩进不对,则有语法错误。每一级缩进,建议2个空格。

    6. 全文不能使用tab,必须使用空格。

    配置vim适应yaml语法

    编写playbook

    • 一个剧本(即playbook),可以包含多个play

    • 每个play用于在指定的主机上,通过模块和参数执行相应的任务

    • 每个play可以包含多个任务。

    • 任务有模块和参数构成。

     

    • |>的区别:|它保留换行符,>把多行合并为一行

    • playbook示例

    硬盘管理

    • 常用的分区表类型有:MBR(主引导记录)、GPT(GUID分区表)

    • MBR最多支持4个主分区,或3个主分区加1个扩展分区。最大支持2.2TB左右的硬盘

    • GPT最多支持128个主分区。支持大硬盘

    parted模块
    • 用于硬盘分区管理

    • 常用选项:

      • device:待分区的设备

      • number:分区编号

      • state:present表示创建,absent表示删除

      • part_start:分区的起始位置,不写表示从开头

      • part_end:表示分区的结束位置,不写表示到结尾

    知识点思维导图:https://flowus.cn/share/7875c0e1-ebbd-4dad-aa7e-f40e6ed6c6d3

    playbook

    模块

    ansible变量

    facts变量

    • facts翻译过来就是事实。

    • facts变量是ansible自带的预定义变量,用于描述被控端软硬件信息。

    • facts变量通过setup模块获得。

    • facts变量是一个大的由{}构成的键值对字典。在{}中,有很多层级的嵌套。可以通过参数过滤出第一个层级的内容。

    • 常用的facts变量

      • ansible_all_ipv4_addresses:所有的IPV4地址

      • ansible_bios_version:BIOS版本信息

      • ansible_memtotal_mb:总内存大小

      • ansible_hostname:主机名

    • 在playbook中使用变量

    自定义变量

    • 引入变量,可以方便Playbook重用。比如装包的playbook,包名使用变量。多次执行playbook,只要改变变量名即可,不用编写新的playbook。

    • ansible支持10种以上的变量定义方式。常用的变量来源如下:

      • inventory变量。变量来自于主机清单文件

      • facts变量。

      • playbook变量。变量在playbook中定义。

      • 变量文件。专门创建用于保存变量的文件。推荐变量写入单独的文件。

    补充模块

    firewalld模块

    • 用于配置防火墙的模块

    • 常用选项:

      • port:声明端口

      • permanent:永久生效,但不会立即生效

      • immediate:立即生效,临时生效

      • state:enabled,放行;disabled拒绝

    • 防火墙一般默认拒绝,明确写入允许的服务。

    • 有一些服务有名字,有些服务没有名字。但是最终都是基于TCP或UDP的某些端口。比如http服务基于TCP80端口。服务名和端口号对应关系的说明文件是:/etc/services

    • 配置服务器的防火墙,一般来说只要配置开放哪些服务或端口即可。没有明确开放的,都默认拒绝。

    • 应用

      • 在webservers组中的主机上安装并启动nginx

      • 客户端访问服务器的nginx服务

      • 在webservers组中的主机上安装并启动firewalld

      • 客户端访问服务器的nginx服务

      • 在webservers组中的主机上开放nginx服务

    template模块

    • copy模块可以上传文件,但是文件内容固定

    • template模块可以上传具有特定格式的文件(如文件中包含变量)

    • 当远程主机接收到文件之后,文件中的变量将会变成具体的值

    • template模块上传的文件,使用的语法叫Jinja2。

    • 常用选项:

      • src:要上传的文件

      • dest:目标文件路径

    进阶语法

    错误处理

    • 当Playbook中包含很多任务时,当某一个任务遇到错误,它将崩溃,终止执行

    • 可以指定某一个任务如果出现错误,则忽略它

    • 通过全局设置,无论哪个任务出现问题,都要忽略

    触发执行任务

    • 通过handlers定义触发执行的任务

    • handlers中定义的任务,不是一定会执行的

    • 在tasks中定义的任务,通过notify关键通知handlers中的哪个任务要执行

    • 只有tasks中的任务状态是changed才会进行通知。

    when条件

    • 只有满足某一条件时,才执行任务

    • 常用的操作符:

      • \==:相等

      • !=:不等

      • >:大于

      • <:小于

      • <=:小于等于

      • >=:大于等于

    • 多个条件或以使用and或or进行连接

    • when表达式中的变量,可以不使用{{}}

    regitster注册变量

    Ansible的“register”模块是用于捕获和保存任务执行结果的,它允许将其他任务的输出作为变量使用。register是一个关键字,可以将任务执行的结果赋值给指定的变量名称。这个变量可以在后续任务中使用。 register模块可以捕获各种类型的输出,包括stdout、stderr、rc、changed等。它可以与其他模块一起使用,例如“when”条件、“loop”循环等。

     

    cowsay:

    知识点思维导图:https://flowus.cn/share/7875c0e1-ebbd-4dad-aa7e-f40e6ed6c6d3

    任务块

    • 可以通过block关键字,将多个任务组合到一起

    • 可以将整个block任务组,一起控制是否要执行

    rescue和always

    • block和rescue、always联合使用:

      • block中的任务都成功,rescue中的任务不执行

      • block中的任务出现失败(failed),rescue中的任务执行

      • block中的任务不管怎么样,always中的任务总是执行

    loop循环

    • 相当于shell中for循环

    • ansible中循环用到的变量名是固定的,叫item

    role角色

    • 为了实现playbook重用,可以使用role角色

    • 角色role相当于把任务打散,放到不同的目录中

    • 再把一些固定的值,如用户名、软件包、服务等,用变量来表示

    • role角色定义好之后,可以在其他playbook中直接调用

    role练习

    1. 创建名为pkgs的角色。用于装包。包名使用变量pkg代表

    2. 创建inst_nginx.yml,调用pkgs角色,安装nginx

    3. 创建inst_mysql.yml,调用pkgs角色,安装mysql

    ansible加解密文件

    • ansible加解密文件使用ansible-vault命令

    • 使用ansible管理远程主机,存储敏感数据时(如,文件中包含密码),应该将其加密

    • 执行playbook时,通过--ask-vault-password选项提示输入密码

     

    sudo命令

    • 一般用于普通用户执行需要root权限的命令

    • 在web1上配置zhangsan拥有sudo权限

    特殊的主机清单变量

    • 如果远程主机没有使用免密登陆,如果远程主机ssh不是标准的22端口,可以设置特殊的主机清单变量

    • ansible_ssh_user:指定登陆远程主机的用户名

    • ansible_ssh_pass:指定登陆远程主机的密码

    • ansible_ssh_port:指定登陆远程主机的端口号

    知识点思维导图:https://flowus.cn/share/7875c0e1-ebbd-4dad-aa7e-f40e6ed6c6d3

     

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注

    目录