一、Host Inventory(主机清单)

1.1 简介
Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。
1.2 inventory 文件
默认路径为/etc/ansible/hosts
Ansible Inventory 文件是一个纯文本文件,用于定义 Ansible 执行命令的目标主机和组,以及这些主机和组的变量和属性。
Inventory 文件的构成包括:
1)主机与组
-
主机:一个主机就是目标机器,可以是 IP 地址、域名或在 SSH 配置中定义的别名,也可以使用
ansible_host指定。 -
组:可以将多个主机划分到同一个组中,并可以对组进行操作。
示例:
[WebServer]
192.168.1.10
192.168.1.11
192.168.1.12
[DatabaseServer]
192.168.1.20
192.168.1.21
注意:组名不能包含空格,并且主机和组名必须放在方括号中。
2)变量
-
主机变量:为单个主机指定变量,使用主机名或 IP 地址作为标识符,变量可以设置为一个或多个值。
示例:
[ServerA]
192.168.1.10 http_port=80 https_port=443
[ServerB]
serverb.example.com ansible_user=admin ansible_password=1234
- 组变量:在组名之后,使用
vars关键字设置变量,可以在组间共享变量。示例:
#所有主机指定 `ansible_ssh_user` 变量,这意味着每个主机都具有该变量。
#为每个主机定义唯一的 `name` 变量。
[WebServer]
192.168.1.10 name=webserver1
192.168.1.11 name=webserver2
192.168.1.12 name=webserver3
[DatabaseServer]
192.168.1.20 name=dbserver1
192.168.1.21 name=dbserver2
[all:vars]
ansible_ssh_user=centos
3)组的嵌套
将一个组嵌套到另一个组中,在 Inventory 文件中使用 :children 关键字。
示例:
#将 `WebServer` 和 `DatabaseServer` 组嵌套到 `Production` 组中。
[WebServer]
192.168.1.10
192.168.1.11
192.168.1.12
[DatabaseServer]
192.168.1.20
[Production:children]
WebServer
DatabaseServer
4)别名
使用 Alias(别名)来引用 Inventory 中的主机。
示例:
#为 `WebServer` 和 `DatabaseServer` 组定义别名,并将它们作为两个分离的组 `Web` 和 `Db` 的成员
#创建了一个名为 `Production` 的组,该组由这两个组的别名组成。
[WebServer]
192.168.1.10
192.168.1.11
192.168.1.12
[DatabaseServer]
192.168.1.20
[Web:children]
WebServer
[Db:children]
DatabaseServer
[Production]
@Web
@Db
1.2 inventory 中的变量
在 hosts 文件中为主机或组定义变量,在 playbook 中可以直接调用变量。
| Inventory变量名 | 含义 |
|---|---|
ansible_host |
ansible连接节点时的IP地址 |
ansible_port |
连接对方的端口号,ssh连接时默认为22 |
ansible_user |
连接对方主机时使用的用户名。不指定时,将使用执行ansible或ansible-playbook命令的用户 |
ansible_password |
连接时的用户的ssh密码,仅在未使用密钥对验证的情况下有效 |
ansible_ssh_private_key_file |
指定密钥认证ssh连接时的私钥文件 |
ansible_ssh_common_args |
提供给ssh、sftp、scp命令的额外参数 |
ansible_become |
允许进行权限提升 |
ansible_become_method |
指定提升权限的方式,例如可使用sudo/su/runas等方式 |
ansible_become_user |
提升为哪个用户的权限,默认提升为root |
ansible_become_password |
提升为指定用户权限时的密码 |
举个例子
1)首先定义一个 my_port 变量,其值为 http_port 变量;
2)然后使用 uri 模块检查 defined myserver 主机上特定端口的服务是否运行,并将结果存储在 result 变量中;
3)最后使用 debug 模块输出该服务的响应内容。
#编辑清单文件,定义变量
vim /etc/ansible/hosts
[webservers]
192.168.2.102 ansible_host=192.168.2.102 http_port=8080
#在 playbook 中,用 `vars` 字段来使用变量:
- name: Example playbook using inventory variable
hosts: webservers
tasks:
- name: Ping the web server
uri:
url: "http://{
{inventory_hostname}}:{
{http_port}}"
return_content: yes
register: result
- name: Show the response
debug:
var: result.content

二、Playbook 剧本

2.1 简介
Playbook 剧本是由一个或多个play组成的列表。
play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。
Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
Playbook 文件是采用YAML语言编写的。
2.2 Playbook的组成部分
1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行;
2)Variables:变量;
3)Templates:模板;
4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作;
5)Roles:角色。
2.3 如何编写Playbook?
2.3.1 基本格式
- 在单一文件第一行,用连续三个连字号“-” 开始,还有选择性的连续三个点号( … )用来表示文件的结尾;
- 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能;
- 使用#号注释代码;
- 缩进必须是统一的,不能空格和tab混用;
- 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的;
YAML文件内容是区别大小写的,key/value的值均需大小写敏感; - 多个key/value可同行写也可换行写,同行使用,分隔;
- v可是个字符串,也可是另一个列表;
- 一个完整的代码块功能需最少元素需包括 name 和 task;
- 一个name只能包括一个task;
- YAML文件扩展名通常为yml或yaml
xxx.yaml/xxx.yml
--- #表示开始
- name: #指定play的名称
hosts: #指定主机清单中定义的主机组名
remote_user: #指定远程主机的执行用户
grather_facts: ture|fales #指定是否要收集远程主机的facts信息
vars: #自定义变量,只能在当前play有效
- 变量1: 值1 #格式为key: value
- 变量2: 值2
tasks: #定义任务列表,默认从上往下依次执行
- name: #定义任务的名称
模块名: 模块参数
ignore errors: true #忽略任务的失败
- name: #可以定义多个任务
模块名: 模块参数
notify: 任务名 #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
##条件判断##
- name:
模块名: 模块参数
when: #定义条件表达式(== != > < >= <=),条件成立时执行此task任务,否则不执行任务
##循环##
- name:

本文围绕Ansible展开,介绍了Host Inventory主机清单,包括其对主机分组、文件构成及变量定义等。详细阐述了Playbook剧本,涵盖组成部分、编写方法、实例及知识点,如变量定义引用、条件判断等。还介绍了Playbook的模块,如Template、tags、Roles模块的使用方法和作用。
最低0.47元/天 解锁文章
1472

被折叠的 条评论
为什么被折叠?



