

Ansible自动化部署工具-组件及语法介绍 - 蓝胖子的编程梦
source link: https://www.cnblogs.com/hobbybear/p/17819628.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

大家好,我是蓝胖子,我认为自动化运维要做的事情就是把运维过程中的某些步骤流程化,代码化,这样在以后执行类似的操作的时候就可以解放双手了,让程序自动完成。避免出错,Ansible就是这方面非常好用的工具。它能将我们的安装软件,部署等过程进行代码编排,程序化我们的部署步骤。今天,我们就来看看它的工作模式以及编排的语法规则。
架构介绍#
Ansible 与主机之间沟通的模式是通过ssh协议,执行相关的命令。这其中涉及到Ansible 的组成架构的问题,学习一门技术或工具首先得对它的架构有所了解。 我们来看看Ansible的组成架构是什么样的。
组成架构#
inventory主机清单#
inventory清单定义了 Ansible 要管理的主机,当执行Ansible 任务时,需要指定主机清单,默认的主机清单配置是在/etc/ansible/hosts 里,执行命令的时候也可以通过-i 参数指定主机清单的位置。
主机清单的配置文件是INI格式的文件,如下所示, 我配置了一个叫test的机器组,它又两个机器,分别是159.138.99.123,159.138.99.121,同时可以通过[组名:vars]的形式在下面定义特点组名的变量,下面👇🏻 示例的配置文件 我就定义了两个变量ansible_ssh_private_key_file代表连接服务器时使用的密钥的位置,ansible_ssh_user代表连接服务器时的用户名。
[test]
159.138.99.123
159.138.99.121
[test:vars]
ansible_ssh_private_key_file=/Users/xiongchuanhong/.ssh/id_rsa
ansible_ssh_user=webserver
inventory 中的常用变量如下:
ansible_ssh_port: //定义连接主机的ssh端口
ansible_ssh_user: //定义连接到该主机的ssh用户
ansible_ssh_pass: //定义连接到该主机的ssh密码
ansible_sudo_pass: //定义sudo的密码
ansible_connection: //定义ansibles的连接类型,可以是local、ssh或paramiko ansible_ssh_private_key_file: //定义私钥文件路径
平时使用inventory组件时,我们可以在一个文件夹下创建不同的机器组,如下,我创建了一个hosts文件夹,并且新建了两个文件分别存放 生产环境的机器组和测试环境的机器组。文件的格式是INI格式。
(base) ➜ hosts tree .
.
├── prod
└── test
接着我们可以使用如下命令测试定义的机器组是否有效,-i 后接文件名或文件夹名,然后是机器组的名称,这里是test。如果inventory配置正确,那么会出现对应机器组的ip。
(base) ➜ hosts ansible -i test test --list-hosts
hosts (1):
159.138.99.123
159.138.99.121
Ansible 核心组件#
我将Ad-hoc组件和playbook,role这些组件都称为核心组件,因为它们对部署任务的编排有非常紧密的联系。在后面我会介绍它们比较详细的语法,这里就简单的提及一下它们之间的区别。
Ad-hoc 命令是直接使用命令行来执行Ansible的任务,命令行也能使用Ansible的模块,如下Ad-hoc命令 使用copy模块复制文件,-m 后面跟的是模块名称,-a后面跟的是模块需要执行的命令。
ansible <机器组名称> -m copy -a "src=/path/to/local/file dest=/path/to/remote/file"
📢📢 注意下,这里说的组件和模块的区别,在Ansible中封装了很多模块来方便我们完成对应的功能,可以用ansible-doc -l 去查看一共有哪些模块,关于模块的用法可以查看文档https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html#plugins-in-ansible-builtin 文档记录了ansible内置的模块已经用法。
playbook 适用于完成一些复杂的配置部署任务,虽然Ad-hoc能完成部分配置任务,但毕竟是命令行,playbook可以将配置任务文档化。如下通过在一个yaml文件里定义任务的执行步骤,然后用ansible-playbook 命令便可以执行site.yml 里配置的任务了。-i参数指定了inventory主机清单的位置。关于playbook的yml文件的语法会在接下来语法介绍时详细阐述。
ansible-playbook site.yml -i hosts/prolinkbox
role 组件针对于playbook编排任务的方式就更进一步,如果有很多不同业务需要编排部署任务,就会产生很多playbook的yml文件,不好维护。所以通过role组件定义了一些固定的目录规范存放任务相关的文件,涉及到任务编排的yml语法和playbook类似,基本没有变动。
各种插件#
除了上述提到的组件外,Ansible还有很多插件来让Ansible额外完成某些功能,比如日志,邮件功能,另外,Ansible默认的连接主机的方式是ssh,可以通过连接插件来来支持其他的连接方式。
至此,大致介绍了完了Ansible的组成架构,接着我们详细看下Ansible编排任务的语法是怎么样的,了解了语法后,便可以自己编写Ansible的任务了。
语法介绍#
Ad-hoc临时命令模式#
虽然我是极力建议使用Ansible编写对线上服务的部署任务时,尽量采用playbook方式,这样能文档化任务。但是一些简单的命令又想批量的在主机上运行,还是可以用到Ad-hoc方式执行。
我们简单的看看其使用规则,-m 参数 指定使用的模块,-a 参数指定模块使用到的命令。举几个简单的例子,
使用了shell模块,输出test机器组中每个linux服务器的主机名
(base) ➜ boxdev ansible -i hosts test -m shell -a 'hostname'
159.138.99.123 | CHANGED | rc=0 >>
hw-sg1-test-0001
使用了copy模块将本地的ReadMe.md 文件复制到了远程
(base) ➜ boxdev ansible -i hosts test -m copy -a "dest=./ReadMe.md mode=600 src=./ReadMe.md"
159.138.99.123 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "73072172dcf3a9e8fd75b72a96d859240c65a26f",
"dest": "./ReadMe.md",
"gid": 1001,
"group": "nemo",
"mode": "0600",
"owner": "webserver",
"path": "./ReadMe.md",
"size": 119,
"state": "file",
"uid": 1002
}
Ad-hoc 的使用十分简单,关键都是要掌握Ansible中有哪些模块,各个模块能有哪些参数,具体参考文档 https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html#plugins-in-ansible-builtin
playbook编排模式#
接下来,来看下playbook使用yml编排任务时的语法规则。如下是一个yml的示例文件,
---
- hosts: all
tasks:
- name: Install Nginx Package
yum: name=nginx state=present
- name: Copy Nginx.conf
template: src=./nginx.conf.j2 dest=/etc/nginx/nginx.conf
owner=root group=root mode=0644 validate=' nginx -t -c %s'
notify:
- ReStart Nginx Service
handlers:
- name: ReStart Nginx Service
service: name=nginx state=restarted
上面这个文件足以介绍playbook的基础语法了首先hosts代表使用到的机器组,all代表主机清单上全部的机器组。
tasks下面定义的是Ansible需要执行的任务,name代表人物的名称,接着就是Ansible的一些模块,像上面例子中就用到了yum模块,template模块。模块的用法以及需要定义哪些参数和使用Ad-hoc命令时一致。
在任务后面还可以跟notify 配置,它代表在该任务完成后可以执行的额外操作,操作定义在handlers里,如上面例子那样,在Copy Nginx.conf任务完成后,执行了ReStart Nginx Service的handler,这个handler被定义在下面handlers的配置里,也是引用Ansible的模块的方式,使用了service模块启动nginx服务。
总结#
你可以发现,其实用上Ansible并不难,关键就是熟练的掌握各种模块的用法,无她,唯手熟尔。关于playbook的语法还涉及到参数定义,role模式的写法,这些详细的语法会放到后面的章节在继续讲解,这一节先简单的知道Ansible是个什么东西,能看懂很简单的playbook配置文件即可。
Recommend
-
86
Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点。实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是Ansible...
-
82
一、Ansible介绍Ansible简单的说是一个配置管理系统(configurationmanagementsystem)。你只需要可以使用ssh访问你的服务器或设备就行。它也不同于其他工具,因为它使用推送的方式,而不是像puppet等那样使用拉取安装agent的方式。你可以将代码部署到任意数量的服务...
-
19
**Ansible自动化部署k8s集群**Ansible是一种IT自动化工具。它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部署,滚动更新。Ansible适用于管理企业IT基础设施。这里我通过Ansible来实现Kubernetesv1.16高可用集群自动部署(离线版)(但是还是需要网络...
-
19
引子 坦白讲,如果一个公司写业务逻辑的工程师在用ansible,很可能说明这个公司的基础设施不够完备。这个工具一般是集成在devops工具中,对小白用户不可见的。 但是一般来说一个快速发展的公司,一段时间内的发展和基...
-
26
介绍 更加简洁的自动化运维工具,不需要再客户端上安装, 基于python开发, 安装简单,centos上直接yum, 可以实现批量操作系统配置、批量程序的部署、批量运行命令。 Ansible常用命令参数 -a:制定模块...
-
25
一、PXE简介 PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,...
-
6
作者:the5fire | 标签: ansible 文档
-
4
使用 NodeJS + Redis + Ansible 实现分布式爬虫并且自动化批量部署上线。 本文章基于以下CC协议进行知识共享:署名(BY)-非商业性使用(NC)-禁止演绎(ND) 分布式爬虫之前在爬取一个网站的...
-
7
自动化运维工具Ansible(21)日志回调插件使用 原创 内置的回调插件 `log_plays` 会...
-
4
Ansible 多机自动化工具 初学笔记 此文档仅张聪明同学个人笔记;新负责KTH-RPL Cluster GPU的漫漫学习长路 English Docs:...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK