Ansible-Inventory和playbook编写

文章目录


前言

Ansible作为自动化运维的核心工具,其高效管理离不开主机清单的灵活配置与变量定义。本文将系统解析inventory分组、变量应用及Playbook的模块化设计,助力构建可维护的自动化体系。


一、inventory主机清单和变量配置

1、常用inventory变量

2、inventory主机分组

Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。

如果是名称类似的主机,可以使用列表的方式标识各个主机。·

bash 复制代码
vim /etc/ansible/hosts
[webservers]
192.168.10.14:2222 #冒号后定义远程连接端口,默认是 ssh 的 22 端口
192.168.10.1[2:5]
[dbservers]
db-[a:f].example.org #支持匹配 a~f

3、常用用法

3.1、通过变量实现免密登入

bash 复制代码
[webservers]
192.168.10.106 ansible_port=22 ansible_user=root ansible_password=123456

无须输入密码,直接登入成功

3.2、组变量

组内主机共享变量

bash 复制代码
[webservers:vars]
ansible_user=root
ansible_password=123456
[all:vars]
ansible_port=22

批量实现免密操作

3.3、组嵌套

vi /etc/ansible/hosts

bash 复制代码
[webservers]
test1 ansible_port=22 ansible_user=root ansible_password=123456 http_port=8080 server_name=www.benet.com root_dir=/etc/httpd/htdocs
[dbservers]
test2 ansible_port=22 ansible_user=root ansible_password=123456 http_port=8080 server_name=www.benet.com root_dir=/etc/httpd/htdocs
[sjj:children]
webservers
dbservers

二、 Playbook 的介绍与结构

Ansible 的 Playbook 是一个包含多个 Play 的 YAML 文件,每个 Play 负责对指定的 主机组 执行一系列的任务。Playbook 通常由以下几部分组成:

  • Tasks:每个任务会调用一个模块来在目标主机上执行操作。
  • Variables:通过定义和使用变量,使 Playbook 更具灵活性和可重用性。
  • Templates:通过 Jinja2 模板动态生成配置文件。
  • Handlers:用于响应任务执行后的变更( notify 触发)。
  • Roles:把多个任务、变量、模板、文件、处理程序组织成模块化结构,便于复用。
    示例:
bash 复制代码
- name: first playbook
  gather_facts: false
  hosts: webservers
  remote_user: root
  tasks:
    - name: task1
      ping:
    - name: task2
      command: date
    - name: task3 install httpd
      yum: name=httpd state=latest
      ignore_errors: true
      notify: "restart httpd"
  handlers:
    - name: restart httpd
      service: name=httpd enabled=true state=restarted

三、playbook常用命令

bash 复制代码
ansible-playbook test1.yaml # 运行 playbook
ansible-playbook test1.yaml --syntax-check # 检查语法
ansible-playbook test1.yaml --list-task # 查看任务列表
ansible-playbook test1.yaml --list-hosts # 查看影响的主机
ansible-playbook test1.yaml --start-at-task='install httpd' # 从指定任务开始执行

如果要使用 SSH 密码 或 sudo 密码,可以使用以下选项:

bash 复制代码
ansible-playbook test1.yaml -k # 提示输入 SSH 密码
ansible-playbook test1.yaml -K # 提示输入 sudo 密码

四、变量和引用

变量在 Playbook 中非常有用,它们可以通过 vars 或命令行进行定义。

bash 复制代码
- name: second play
  hosts: dbservers
  remote_user: root
  vars:
    groupname: sjjgroup
    username: sjj
  tasks:
    - name: create group
      group: name={{ groupname }} gid=1010
    - name: create user
      user: name={{ username }} uid=1234 group={{ groupname }}
# 执行
ansible-playbook test2.yaml 


在命令行中,变量也可以通过 -e 参数传递:

例如:

ansible-playbook test1.yaml -e "username=httpd"

五、条件判断 when

在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。

bash 复制代码
- name: first playbook
  # gather_facts: false
  hosts: all
  remote_user: root
  tasks:
    - name: task1
      ping:
    - name: task2
      command: date
    - name: task3 install httpd
      yum: name=httpd state=latest
      ignore_errors: true
      notify: "restart httpd"
      when: ansible_default_ipv4.address == "192.168.10.107"
  handlers:
    - name: restart httpd
      service: name=httpd enabled=true state=restarted

或根据主机名来执行:

when: inventory_hostname == "<主机名>"

六、迭代:使用with_items 或 loop

Ansible 支持使用 with_items 或 loop 进行迭代。两者作用相同, loop 是较新的推荐用法

bash 复制代码
- name: play1
  hosts: webservers
  gather_facts: false
  tasks:
    - name: touch
      file:
        path: "/opt/{{item}}.log"
        state: touch
      loop: [1,2,3]

七、Templates 模块

Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。

Jinja2 模板引擎在 Ansible 中用来动态生成文件。即通过动态的模板文件,去更改原生文件

步骤一:创建jinja模板文件(.j2)

bash 复制代码
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2
vim /opt/httpd.conf.j2
Listen {{http_port}} #42行,修改
ServerName {{server_name}} #95行,修改
DocumentRoot "{{root_dir}}" #119行,修改

步骤二:定义变量并在主机清单中指定

bash 复制代码
#修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量
vim /etc/ansible/hosts
[webservers]
192.168.10.14 http_port=8080 server_name=www.benet.com
root_dir=/etc/httpd/htdocs

步骤三:执行playbook

bash 复制代码
- name: first playbook
  # gather_facts: false
  hosts: dbservers
  remote_user: root
  tasks:
    - name: task1
      ping:
    - name: task2
      command: date
    - name: task3 install httpd
      yum: name=httpd state=latest
      ignore_errors: true
    - name: 11
      template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify: "restart httpd"
  handlers:
    - name: restart httpd
      service: name=httpd enabled=true state=restarted

端口已修改

八、tags模块

Tags 允许你指定只执行某些特定任务。通过命令行传入 --tags 参数来执行带有特定标签的任务。playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。

bash 复制代码
- hosts: webservers
  remote_user: root
  tasks:
  - name: Copy hosts file
    copy: src=/etc/hosts dest=/opt/hosts
    tags:
      - a
  - name: touch file
    file: path=/opt/testhost state=touch
    tags:
      - always # 始终执行
  - name: touch file
    file: path=/opt/hosts_3 state=touch
    tags:
      - c

执行:ansible-playbook webhosts.yaml --tags="c"

九、roles模块

1、roles介绍

Roles 数据中心有各种不同类型的主机。如web服务器、数据库服务器,基于开发环境的服务器。随着时间的推移,具有处理所有这些情况的任务和人员的Ansible playbook将变得庞大而复杂。

1)角色允许将复杂的剧本组织成独立的、更小的剧本和文件

2)角色提供了一种从外部文件加载任务、处理程序和变量的方法

3)角色也可关联和引用静态的文件和模板

4)角色可以编写成满足普通用途需求,并且能被重复利用

Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。

2、roles内各目录含义解释

  • files: 用来存放由 copy 模块或 script 模块调用的文件。
  • templates: 用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。
  • tasks: 此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用
  • include 包含其它的位于此目录的 task 文件。
  • handlers: 此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。
  • vars: 此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。
  • defaults: 此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。
  • meta: 此目录应当包含一个 main.yml 文件,用于定义此角色的特殊设定及其依赖关系。
    Roles 是将 Playbook 组织成模块化的结构,使其易于管理和重用。每个 Role 都有一套预定义的目录结构:

3、在一个 playbook 中使用 roles 的步骤:

  1. 创建以 roles 命名的目录:
    mkdir /etc/ansible/roles/ -p #yum装完默认就有
  2. 创建全局变量目录(可选):
bash 复制代码
mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all #文件名自己定义,引用的时候注意
  1. 在 roles 目录中分别创建以各角色名称命令的目录,如 httpd、mysql:
bash 复制代码
mkdir /etc/ansible/roles/httpd
mkdir /etc/ansible/roles/mysql
  1. 在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建
bash 复制代码
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
  1. 在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名:
bash 复制代码
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
  1. 修改 site.yml 文件,针对不同主机去调用不同的角色:
bash 复制代码
vim /etc/ansible/site.yml
---
- hosts: webservers
  remote_user: root
  roles:
    - httpd
- hosts: dbservers
  remote_user: root
  roles:
    - mysql
  1. 运行 ansible-playbook:
bash 复制代码
cd /etc/ansible
ansible-playbook site.yml

4、案例

创建项目目录

bash 复制代码
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml

编写httpd模块

bash 复制代码
vim /etc/ansible/roles/httpd/tasks/main.yml
- name: install apache
  yum: name={{pkg}} state=latest
- name: start apache
  service: enabled=true name={{svc}} state=started
  
//定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中
vim /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd
svc: httpd

编写mysql模块

bash 复制代码
vim /etc/ansible/roles/mysql/tasks/main.yml
- name: install mysql
  yum: name={{pkg}} state=latest
- name: start mysql
  service: enabled=true name={{svc}} state=started
vim /etc/ansible/roles/mysql/vars/main.yml
pkg:
  - mariadb
  - mariadb-server
svc: mariadb

编写roles

bash 复制代码
vim /etc/ansible/site.yml
---
- hosts: webservers
  remote_user: root
  roles:
    - httpd
    - mysql
cd /etc/ansible
ansible-playbook site.yml

总结

本文深入剖析了Ansible主机清单管理、Playbook编写及roles模块化实践。掌握这些核心机制能显著提升运维自动化水平,实现高效、可扩展的基础设施即代码管理。

相关推荐
m0_4887776514 小时前
Ansible-Playbook 剧本编写
ansible·playbook·剧本编写
hanyi_qwe1 天前
Ansible-Playbook 剧本编写
ansible
原神启动11 天前
Ansible(三)—— 使用Ansible自动化部署LNMP环境
android·自动化·ansible
可爱又迷人的反派角色“yang”1 天前
ansible剧本编写(三)
linux·网络·云计算·ansible
叽里咕噜怪2 天前
Ansible Playbook 从入门到精通:零基础玩转自动化部署与配置管理
网络·自动化·ansible
lin张2 天前
Ansible学习总结:从基础命令到Playbook实战
网络·学习·ansible
可爱又迷人的反派角色“yang”2 天前
ansible基本命令与剧本编写(二)
linux·运维·ansible
m0_485614672 天前
ansible基础命令
ansible
叫致寒吧2 天前
自动化运维工具 Ansible
运维·自动化·ansible