文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

一篇带给你 Ansible Playbook 介绍和使用

2024-12-01 02:20

关注

一、ansible介绍

Ansible Playbooks 提供了一个可重复、可重用、简单的配置管理和多机部署系统,非常适合部署复杂的应用程序。Ansible Playbook 是自动化任务的蓝图,这些任务是复杂的 IT 操作,在有限或没有人为参与的情况下执行。Ansible Playbook 在一组、组或分类的主机上执行,它们共同构成一个 Ansible 清单。

Ansible Playbook 本质上是框架,是预先编写的代码,开发人员可以使用 ad-hoc 或作为起始模板。Ansible Playbooks 经常用于自动化IT 基础设施(例如操作系统和Kubernetes平台)、网络、安全系统和开发人员角色(例如 Git)。

Ansible Playbooks 可帮助 IT 人员对应用程序、服务、服务器节点或其他设备进行编程,而无需从头开始创建所有内容的手动开销。Ansible Playbook 以及其中的条件、变量和任务可以无限期地保存、共享或重复使用。

二、ansible playbook 如何工作?

Ansible 模块执行任务。可以组合一个或多个 Ansible 任务来进行游戏。可以组合两个或多个剧本来创建 Ansible Playbook。Ansible Playbook 是针对主机自动执行的任务列表。主机组构成您的 Ansible 清单。

Ansible Playbook 中的每个模块都执行特定的任务。每个模块都包含元数据,这些元数据确定执行任务的时间和地点,以及执行任务的用户。还有数以千计的其他 Ansible 模块可以执行各种 IT 任务。

三、什么是 yaml?

YAML是一个可读性高的用来表达资料序列的格式,它实际上是一种标记语言。不论是在运维工作中还是开发工作中,yaml语言都是一个很普遍被使用的,比如:Kubernetes 中的部署清单文件、GitLab CICD、Python使用yaml格式做配置文件、json 格式的数据需要被转成 yaml 格式的数据等等。这里不对yaml语法做更多的介绍,详情可以自行和百度、谷歌合作了解。

四、yaml 语言的特性

五、ansible-playbook的核心组成部分

(1)ansible-playbook 的项目 目录结构

[root@ayunw ansible-project]# ll
total 28
-rw-r--r--. 1 root root 122 Jul 8 10:14 00_setup.yml
-rw-r--r--. 1 root root 84 Jul 7 14:42 01_publish_ssh_key.yml
-rw-r--r--. 1 root root 78 Jul 8 14:11 02_common.yml
-rw-r--r--. 1 root root 85 Jul 8 10:34 03_install_docker.yml
drwxr-xr-x. 3 root root 124 Jul 11 09:15 files
drwxr-xr-x. 2 root root 80 Jul 8 15:26 inventory
-rw-r--r--. 1 root root 778 Jul 7 15:16 README.md
drwxr-xr-x. 5 root root 57 Jul 7 18:30 roles

[root@ayunw ansible-project]# tree roles/ -L 3
roles/
├── docker
├── defaults
└── main.yml
├── handlers
└── main.yml
├── meta
└── main.yml
├── tasks
└── main.yml
├── templates
├── daemon.json.j2
└── docker-ce.repo.j2
└── vars
└── main.yml

以上是项目是docker批量安装。这个目录格式是我这边安装项目的目录规范。但并不是说每个目录下的main.yml​文件都存在内容,其实很多时候我们可能用不到default/main.yml和meta/main.yml。

(2)Hosts 远程主机列表

playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中。比如我们之前说的默认在/etc/ansible/hosts文件中:

[root@ayunw ansible-example]# cat /etc/ansible/hosts
[websrvs]
10.10.108.[30:33]

[dbsrvs]
10.10.108.30

[appsrvs]
10.10.108.[30:33]

(3)remote_user 远程用户

可用于Host和Task中,也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务。此外,还可以在sudo时使用sudo_user指定sudo时切换的用户。

[root@ayunw ansible-example]# cat demo-playbook.yml
- hosts: dbsrvs
remote_user: root
tasks:
- name: pingtest
ping:
remote_user: ayunw
sudo: yes # 默认sudo为root
sudo_user: root # sudo 为root

(4)Tasks 任务集

简单来说,Tasks 任务集其实就是使用多个ansible支持的模块组合起来的一组任务。可以理解为 ansible-playbook 中,一个name指定的就是一个task任务。各个task按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task。但是也可以使用异步模式。这个后面文章会说;

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。

每个task都应该有其name,用于playbook的执行结果输出,建议起一个见名知意的名称。

task的两种格式:

一种是key=value​的形式,另一种是key: value的形式。

注意: 后者冒号后面有一个空格。

[root@ayunw ansible-project]# cat install_httpd.yml
---
- hosts: dbsrvs
remote_user: root
tasks:
- name: install httpd #描述信息
yum: name=httpd #调用yum模块安装httpd服务

- name: start httpd #同样是描述信息
service: name=httpd state=started enabled=yes #调用service模块启动httpd服务并设置开机自启
[root@ayunw ansible-project]# cat copy_files.yml
---
- hosts: dbsrvs
remote_user: root
tasks:
- name: install httpd
yum: name=httpd

- name: start httpd
service:
name: httpd
state: started
enabled: yes

以上示例中,我加了空行,存在空行和带有 ​​#​​ 注释的行不会影响 yaml 文件执行,看上去更加美观,而不是所有 task 挤在一起,看上去一团糟。

(5)Variables 变量

通常我们会将变量信息放在roles/vars/main.yml中,格式如下:

[root@ayunw ansible-project]# cat roles/docker/vars/main.yml
EMQXNAME: emq_perf

DEPEND_PKG:
- yum-utils
- device-mapper-persistent-data
- lvm2
- bridge-utils

DOCKER_PKG:
- containerd.io-1.6.6
- docker-ce-20.10.17
- docker-ce-cli-20.10.17

(6)Templates 模板

Templates 模板主要使用Jinjia2​模板语言,以 .j2结尾,里面其实就是一个配置文件,比如:

[root@ayunw ansible-project]# cat roles/docker/templates/daemon.json.j2
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "1g",
"max-file": "4"
},
"data-root": "/data/docker",
"storage-driver": "overlay2"
}

(7)handler 和 notify

这两个通常结合使用,比如某一个服务配置变更后,需要重启,那么就需要在配置变更后设置一个 notify,然后 handlers 就会在playbook退出之前执行重启服务的操作。如果定义了handler重启服务,而没有定义notify,那么所有task任务执行完成后,也会触发一次服务重启操作。

两个典型的示例:

示例来源于: https://docs.ansible.com/ansible/latest/user_guide/playbooks_handlers.html

示例一:​

---
- name: Verify apache installation
hosts: webservers
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: Ensure apache is at the latest version
ansible.builtin.yum:
name: httpd
state: latest

- name: Write the apache config file
ansible.builtin.template:
src: /srv/httpd.j2
dest: /etc/httpd.conf
notify:
- Restart apache

- name: Ensure apache is running
ansible.builtin.service:
name: httpd
state: started

handlers:
- name: Restart apache
ansible.builtin.service:
name: httpd
state: restarted

示例二:

tasks:
- name: Template configuration file
ansible.builtin.template:
src: template.j2
dest: /etc/foo.conf
notify:
- Restart apache
- Restart memcached

handlers:
- name: Restart memcached
ansible.builtin.service:
name: memcached
state: restarted

- name: Restart apache
ansible.builtin.service:
name: apache
state: restarted

(8)Tags 标签

我们可以在ansible-playbook的每一个task任务上打上 tag 标签,可以用于区分某一种类型的任务。如果你想要单独执行这个独有的tag标签的任务,就可以在使用ansible-playbook命令加上 -t 参数来指定 tag 执行剧本。如:

ansible-playbook -t ayunw install_docker.yml

​六、ansible-playbook 命令

命令格式:ansible-playbook ...[options]

常见的 options 选项:

-C --check       # 只检测可能会发生的改变,但不真正执行操作
--list-hosts # 列出运行任务的主机
--limit # 针对主机列表中的主机执行
-v -vv -vvv # 提示过程

示例:

ansible-playbook -C install_httpd.yaml

一个简单示例:

[root@ayunw ansible-project]# cat copy_files.yml
---
- hosts: dbsrvs
tasks:
- name: copy multi files
copy: src={{ item }} dest="/etc/yum.repos.d/" owner=root group=root mode=0644
with_items:
- "files/CentOS-Base.repo"
- "files/epel.repo"
# 更推荐的方式:
[root@ayunw ansible-project]# cat copy_files.yml
---
- hosts: dbsrvs
tasks:
- name: copy multi files
copy:
src: "{{ item }}"
dest: "/etc/yum.repos.d/"
owner: root
group: root
mode: 0644
with_items:
- "files/CentOS-Base.repo"
- "files/epel.repo"

执行剧本:

[root@ayunw ansible-project]# ansible-playbook -C cf.yml

PLAY [dbsrvs] *******************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************
ok: [10.10.108.30]

TASK [copy multi files] *********************************************************************************************************************************************************
ok: [10.10.108.30] => (item=files/CentOS-Base.repo)
ok: [10.10.108.30] => (item=files/epel.repo)

PLAY RECAP **********************************************************************************************************************************************************************
10.10.108.30 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

[root@ayunw ansible-project]# ansible-playbook copy_files.yml

以上内容就是针对ansible-playbook剧本的一个介绍和简单的使用。当然它的功能远不止于此。还有更多更高级的用法。

来源:运维开发故事内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯