您现在的位置是:首页 >技术杂谈 >Linux Ansible创建任务并执行网站首页技术杂谈
Linux 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语法
- 文件后缀名为.yml或yaml
- 文件的第一行需要以 “---” 开始,表明Ymal文件的开始
- 可以在同一行加#号,后面追加注释内容;类似于python
- 同一列表之中的元素需要保持相同的缩进
- Play中的hosts、roles、tasks等对象的表示方法都是以 key:[一个空格]value 的形式来写
- 当要在对象下要使用列表项时,使用- 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文件执行步骤
- 收集facts
- 执行tasks
- 报告结果
绿色表示执行成功,系统保持原样
黄色表示执行成功,系统发生变化
红色表示执行失败
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的执行过程
- 加载自己的配置文件(默认为/etc/ansible/ansible.cfg)
- 查找资产清单(Inventory)对应的主机或主机组
- 加载对应的模块(yum、user、lvol等)
- 通过ansible将模块或临时命令 生成对应的临时py文件;并将该文件传输至被管理节点(目录为 被管理节点执行用户下的 $HOME/.ansible/tnp/ansible-tmp-数字/XXX.py文件)
- 给文件配置执行权限,执行并返回结果到管理节点
- 删除被管理节点上的临时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 增加连接插件相关的额外详细程度选项(包含受管主机上用于执行脚本的用户和所执行的插件)