您现在的位置是:首页 >技术杂谈 >Linux Ansible创建任务并执行网站首页技术杂谈

Linux Ansible创建任务并执行

静下心来敲木鱼 2023-06-14 00:00:02
简介Linux Ansible创建任务并执行

目录

通过add-hoc执行anbise任务

通过Playbook剧本方式执行任务

Playbook包含的常用对象

Yaml语法

对Yaml格式自动对齐

Playbook语法检测与执行

Playbook任务实施

Playbook特权升级

Playbook常用模块

软件包管理模块

用户管理模块

存储模块管理

文件操作相关模块

其他任务模块

传统配置与Playbook模块配置比较

Ansible的执行过程

Ansible故障排除


Ansible实现管理的两种方式

通过add-hoc临时执行ansible任务(只可以执行一次)

通过playbook执行ansible任务(通过脚本执行,可以重复执行)

通过add-hoc执行anbise任务

add-hoc就是通过ansible命令来执行ansible任务,可以快速执行单个ansible任务,不需要将其保存下来再去执行,只是简单的在线操作,无需编写playbook剧本即可运行

一般测试、验证的时候会使用临时命令去执行

add-hoc格式

ansible 被管理节点 -m 模块名 -a ‘要执行的命令’ -i 资产清单

被管理节点必须存在于清单中

-m  用于指定某个ansible模块,并结合模块的参数来实现特定功能

-a   用于带引号的字符串形式来执行命令(可以单引号,可以双引号;如果命令也需要使用引号的化需要与之相反)

-i    指定使用的某个资产清单

add-hoc执行的例子

通过shell模块实现在所有的主机节点查看根的文件系统使用率

ansible all -m shell -a  "df -Th /"

通过user模块实现在所有主机上创建用户名admin1,uid为1500,家目录为/opt/admin1,shell环境为/sbin/nologin的用户

ansible all -m user -a “name=admin1 uid=1500 home=/opt/admin1 shell=/sbin/nologin”

通过copy模块在所有主机上创建文件/etc/admin1,内容为copy module create file,权限为0444

ansible all -m copy -a "content='copy module create file' dest=/etc/admin1 mode='0444'"

模块查询

如果不知道如何编写某个模块的临时命令,可以通过ansible-doc 模块名 来查看这个模块的信息

查看ansible是否有copy模块

ansible-doc -l | grep copy

查看copy模块的说明(有例子,可以根据例子编写临时命令)

ansible-doc copy


通过Playbook剧本方式执行任务

Add-hoc每次只可以执行一个任务,并且不可以重复任务

使用剧本方式可以声明配置,编排多机部署,可以重复利用,是最常用的方式

Playbook编写格式

Playbook使用YAML格式编写

每个playbook由一个列表中的一个或多个play组成(play有不同的对象组成)

Playbook包含的常用对象

hosts                 使用host来指示在哪些主机或主机组上运行tasks

remoute_user:   在远程主机上使用的用户(默认为ansible.cfg文件中remoute_user字段对应的用户)

tasks              任务列表,指定远端主机所要执行的任务(包含name和要执行的模块,name表示的类似注释的意思,时为了便于用户识别,是可选的)

variables         变量(后续介绍)

templates         包含了模板语法的文本文件(后续介绍)

roles                包含了要调用的角色(后续介绍)

handlers           由特定条件触发的任务(后续介绍)

Yaml语法

  1. 文件后缀名为.yml或yaml
  2. 文件的第一行需要以 “---” 开始,表明Ymal文件的开始
  3. 可以在同一行加#号,后面追加注释内容;类似于python
  4. 同一列表之中的元素需要保持相同的缩进
  5. Play中的hosts、roles、tasks等对象的表示方法都是以 key:[一个空格]value 的形式来写
  6. 当要在对象下要使用列表项时,使用- name或- xxx表示;多个项使用相同的缩进级别作为同一个列表的一部分

对Yaml格式自动对齐

当使用vim编写.yml或.yaml文件时,支持格式自动对齐;并且当tap建按下时,相当于执行一个双空格缩进

vim ~/.vimrc
autocmd FileType yaml setlocal ai ts=2 sw=2 et

Playbook语法检测与执行

在执行YAML文件前需要先对YAML文件的语法进行检测

ansible-playbook --syntax-check  yaml文件     检查yaml文件的语法格式是否正确

执行YAML文件

ansible-playbook  yaml文件                                  执行yaml文件

yaml文件执行步骤

  1. 收集facts
  2. 执行tasks
  3. 报告结果

绿色表示执行成功,系统保持原样

黄色表示执行成功,系统发生变化

红色表示执行失败

Playbook任务实施

实施一个任务(在servers主机上通过yum文件安装php和mariadb)

vim xxx.yml

---
- name: install
  hosts: servers
  tasks:
    - name: install php mariadb
      yum:
        name: php,mariadb
        state: present

实施多个任务(将/etc/issue文件内容更改为Development,将/etc/issue1文件内容更改为Test)

方式一:一个tasks下配置多个name

vim xxx.yml

---
- name: one
  hosts: all
  tasks:
    - name: copy development
      copy:
        content: "Development"
        dest: /etc/issue2
    - name: copy Test
      copy:
        content: "Test"
        dest: /etc/issue1

方式二:每个tasks下配置一个name,配置多个tasks

vim xxx.yml

---
- name: one
  hosts: all
  tasks:
    - name: copy development
      copy:
        content: "Development"
        dest: /etc/issue
- name: two
  hosts: all
  tasks:
    - name: copy Test
      copy:
        content: "Test"
        dest: /etc/issue1

Playbook特权升级

Playbook中的特权升级和ansible.cfg的配置一样

配置关于student用户的playbook特权升级(需要在被管理主机上为student配置sudo权限)--就是通过student用户在被管理节点执行任务

- name: one

  hosts: all

  remote_user: student

  become: true

  become_method: sudo

  become_user: root

  tasks:

    - name: copy development

      copy:

        content: "Development"

        dest: /etc/issue


Playbook常用模块

软件包管理模块

yum:                  进行软件包安装

name:软件包名称

state:latest(更新软件包)/ present(安装软件包)/ absent(删除)

yum_repository:部署软件仓库

name:         仓库名称

description: 描述信息

baseurl:      软件仓库的地址

gpgcheck:   yes(开启gpg校验)/ no(不开启gpg校验)

gpgkey:      gpg密钥的地址

enabled:     yes(启用此软件仓库)/ no(不启用此软件仓库)

rpm_key:           当yum设置了gpg_check=yes时,需要在受管主机上安装GPG密钥,通过rpm_key进行配置

state:          present(将密钥推到被管理主机)/ absent(删除)

key:            gpg密钥地址

用户管理模块

user  创建删除用户,修改用户属性

name:         名称

uid:               设置Uid

group:          设置用户所属的组

groups:         设置附加组

shell:           设置工作环境

password:   创建用户的时候 直接赋予密码

home:           设置家目录位置

comment:     设置备注说明

role:            设置用户的身份

remove:        yes (删除用户的时候直接把家目录、邮件空间全部删掉)

state:             present(创建) | absent(删除)

group 创建删除用户组

name:         名称

state:          present(创建) | absent(删除)

gid:             组ID

存储模块管理

parted   进行磁盘分区

device:          要进行分区的硬盘

number:        分区编号

part_start:     开始大小

part_end:      结束大小

state:            present(创建)/ absent(删除)

lvg         配置pv卷和vg卷组

vg:                vg卷组的名称

pvs:               使用的pv卷

state:             present(创建)/ absent(删除)

pesize:        物理范围的大小

lvol        配置lv逻辑卷

vg:                vg卷组的名称

lv:                 lv逻辑卷的名称

size:              设置逻辑卷的大小

state:            present(创建)/ absent(删除)

filesystem     进行文件格式化

fstype:           格式化的文件类型

dev:               需要格式化的磁盘

mount   进行文件挂载

path:             挂载点

src:               要挂载的文件

fstype:           文件格式

state:            mounted(永久挂载)/ present(临时挂载) / unmounted(取消挂载)

文件操作相关模块

copy模块     主要用于将文件复制到某个地方,写入内容到文件中

src:               源文件

content:      需要写入的文件内容(将文件内容清空后写入 此时不需要src元素,只需要dest元素)

dest:             目的文件

owner:          文件所有者

group:          文件所属组

mode:           文件的权限

setype:        文件的安全上下文

file模块 创建目录、文件、链接文件等

path:             创建的文件/目录

state:          touch(文件)/ directory(目录)/ link(链接文件—不使用path元素,使用src和dest元素)

owner:          文件/目录所有者

group:          文件/目录所属组

mode:         文件/目录权限

setype:        文件/目录的安全上下文

lineinfile模块      主要是用于替换文件中的内容

path:             文件路径

regexp:         使用正则表达式来匹配要修改的内容

line:              替换后的内容

owner:          文件所有者

group:          文件所属组

mode:           文件的权限

setype:        文件的安全上下文

其他任务模块

cron              配置计划任务

name:           计划任务名称

minute:         分钟

hour:             时间

user:           执行用户

job:               执行的命令

firewalld       配置防火墙

zone:            配置的防火墙区域

service:       服务名称

port:           端口号

permanent:   yes(永久执行)

immediate:    yes(立即执行)

state:            enabled(放行)/ disabled(阻塞)

service   配置服务的运行、停止

name:           服务名称

state:            started / stopped / restarted

enabled:       开机自启动

debug模块  将指定的值输出到终端显示出来

var: 变量名                               将变量所对应的值显示到终端

msg:自定消息(任意)          将自定义消息显示到终端


传统配置与Playbook模块配置比较

Cron计划任务配置

传统配置
crontab -u greg -e
 30 17 * * * /bin/echo "hello"
systemctl restart crond

通过cron模块配置
  cron:
    name: "greg cron"
    minute: "30"
    hour: "17"
    job: /bin/echo "hello"
    user: greg

创建lv逻辑卷并进行临时挂载

传统配置
pvcreate /dev/vdb
vgcreate -s 16m vgdata /dev/vdb
lvcreate -L 1G -n lvdata vgdata
mkfs.xfs /dev/vgdata/lvdata
mkdir -p /opt/lvdata
mount  /dev/vgdata/lvdata  /opt/lvdata

通过lvg、lvol、filesystem、mount模块配置
lvg:
    vg: vgdata
    pvs: /dev/vdb
    pesize: 16m

lvol:
    vg: vgdata
    lv: lvdata
    size: 1g

filesystem:
    fstype: xfs
    dev: /dev/vgdata/lvdata

mount:
    path: /opt/lvdata
    src:  /dev/vgdata/lvdata
    state: present
    fstype: xfs

Ansible的执行过程

  1. 加载自己的配置文件(默认为/etc/ansible/ansible.cfg)
  2. 查找资产清单(Inventory)对应的主机或主机组
  3. 加载对应的模块(yum、user、lvol等)
  4. 通过ansible将模块或临时命令 生成对应的临时py文件;并将该文件传输至被管理节点(目录为 被管理节点执行用户下的 $HOME/.ansible/tnp/ansible-tmp-数字/XXX.py文件)
  5. 给文件配置执行权限,执行并返回结果到管理节点
  6. 删除被管理节点上的临时py文件

Ansible故障排除

配置ansible日志

vim /etc/ansible/ansible.cfg

log_path = /var/log/ansible  指定ansible日志存放路径

使用debug模块显示任务执行结果

通过debug模块的msg或var字段,结合register输出任务执行结果

 

在执行playbook时获取详细的信息

ansible-playbook  yml文件  -v | -vv | -vvv | -vvvv

-v          显示任务结果

-vv       显示任务结果、任务配置(推荐)

-vvv       显示被管理主机连接信息

-vvvv     增加连接插件相关的额外详细程度选项(包含受管主机上用于执行脚本的用户和所执行的插件)

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。