一,ansible概念
Ansible 是一种自动化工具,用于配置管理、应用程序部署和任务自动化。它基于 Python 开发,并且使用 SSH 协议与远程主机进行通信,无需在远程主机上安装额外的客户端软件。
下面是一些 Ansible 的核心概念:
-
主机清单(Inventory):主机清单是一个文本文件,包含您希望管理的所有主机的列表。它可以指定主机名、IP 地址、分组和其他变量等信息。
-
模块(Modules):Ansible 使用模块来执行特定任务。模块是 Ansible 的基本构建块,每个模块负责在目标主机上执行一个特定的操作,例如设置用户、安装软件包或执行命令等。
-
Playbook:Playbook 是一个用 YAML 语法编写的文件,定义了一组任务和配置项的顺序。它描述了应该在目标主机上执行的操作,如何执行这些操作以及执行操作的顺序。
-
任务(Task):任务是 Playbook 中的最小单位,用于指定需要在目标主机上执行的具体操作。每个任务通常会调用一个或多个模块来完成特定的工作。
-
角色(Roles):角色是将相关任务和配置组织在一起的一种方式。它可以用于封装和重用 Playbook 中的代码,使整个配置和部署过程更加模块化和可维护。
-
变量(Variables):变量用于存储和传递数据。您可以在 Playbook、主机清单或角色中定义变量,并在任务和模块中使用它们。这样可以使配置更加灵活和可配置。
通过定义主机清单、编写 Playbook 和使用相应的模块,您可以编排和自动化各种任务,包括系统配置、软件部署、服务管理等。Ansible 提供了简单而强大的工具和语法,使得管理和自动化大规模基础设施变得更加容易和可靠。
二,ansible主机清单
主机清单(Inventory)是 Ansible 中用于定义被管理主机列表的文件。它指定了要对哪些主机进行操作,可以包含主机名、IP 地址、分组和其他相关变量。
下面是有关 Ansible 主机清单的一些详解:
-
清单文件格式:主机清单通常使用 INI 或 YAML 格式编写。INI 格式更简单且易于阅读,而 YAML 格式更灵活且支持更复杂的数据结构。
INI 格式示例:
[web] webserver1 ansible_host=192.168.1.10 webserver2 ansible_host=192.168.1.11 [database] dbserver1 ansible_host=192.168.1.20
YAML 格式示例:
all: hosts: webserver1: ansible_host: 192.168.1.10 webserver2: ansible_host: 192.168.1.11 children: database: hosts: dbserver1: ansible_host: 192.168.1.20
-
主机分组:您可以使用方括号
[]
来创建主机组,并将相应的主机放入组中。这样可以根据需要对不同类型的主机进行分组,以便在 Playbook 中可以更方便地针对这些组执行任务。示例:
[web] webserver1 webserver2 [database] dbserver1
-
主机变量:您可以为每个主机指定额外的变量信息,如 IP 地址、端口号、用户名等。这些变量可以在 Playbook 中使用,以便根据不同的主机进行不同的操作配置。
示例:
[web] webserver1 ansible_host=192.168.1.10 ansible_user=ubuntu [database] dbserver1 ansible_host=192.168.1.20 ansible_user=root
-
动态清单:Ansible 还支持使用动态清单,从外部数据源动态生成主机列表。这对于自动化场景非常有用,例如从云服务提供商获取实时的主机列表。
示例:
ansible-inventory --list -i dynamic_inventory.py
上述命令将通过运行名为
dynamic_inventory.py
的脚本来获取动态清单。
通过合理编写和组织主机清单,您可以更好地管理和控制要在哪些主机上执行操作。Ansible 的目标是通过简单而强大的主机清单功能来提供灵活、可读性高的自动化配置管理。
三,ansible模块
Ansible 模块(Modules)是 Ansible 的基本构建块,用于执行特定的任务或操作。模块可以在远程主机上执行命令、配置系统设置、安装软件包等等。以下是有关 Ansible 模块的详解:
-
内置模块:Ansible 提供了大量的内置模块,可满足不同的自动化需求。这些模块被打包在 Ansible 中,并且无需额外安装即可使用。一些常用的内置模块包括:
-
shell
:在目标主机上执行 Shell 命令。 -
copy
:将文件复制到目标主机。 -
apt
(适用于 Debian 系统):用于管理 APT 软件包。 -
yum
(适用于 Red Hat 系统):用于管理 YUM 软件包。 -
service
:用于管理系统服务的状态。
-
-
自定义模块:除了内置模块外,Ansible 还支持编写自定义模块以满足特定的自动化需求。自定义模块可以使用任何编程语言编写,并以可执行脚本的形式提供给 Ansible 使用。通常,自定义模块需要与 Ansible 的执行环境进行交互,通过标准输入和输出来传递数据。
-
模块参数和返回值:每个模块都有自己特定的参数和返回值。模块参数用于传递给模块的输入数据,而模块返回值则提供给 Ansible 以便进行后续处理。模块的参数和返回值通常是通过 JSON 格式进行传递。
-
模块文档:每个 Ansible 模块都有相应的文档,详细说明了模块的功能、使用方法和参数说明。您可以通过
ansible-doc
命令来查看特定模块的文档。例如,要查看copy
模块的文档,可以执行以下命令:ansible-doc copy
。 -
模块示例:下面是一个使用
copy
模块复制文件的示例 Playbook:- name: Copy file to target hosts hosts: webserver1 tasks: - name: Copy file copy: src: /path/to/source/file dest: /path/to/destination/file
上述示例中,
copy
模块被用于将源文件复制到目标主机的指定位置。
使用不同的模块,您可以执行各种任务,从简单的命令执行到复杂的系统配置。Ansible 的模块化架构使得自动化配置变得灵活且易于扩展。确保熟悉可用的内置模块,并在需要时编写自定义模块以满足特定的需求。
四,ansible playbook
Ansible Playbook 是 Ansible 的核心组件之一,它是一个用于定义和管理自动化任务的文件。Playbook 由一个或多个任务组成,并以 YAML 格式编写。以下是有关 Ansible Playbook 的详解:
-
结构:Playbook 通常由以下几个部分组成:
-
name
:Playbook 的名称,用于标识和描述该 Playbook 的作用。 -
hosts
:要执行任务的目标主机或主机组。 -
vars
:变量定义,可以在 Playbook 中使用,用于传递输入数据。 -
tasks
:任务列表,其中定义了要在目标主机上执行的具体任务。 -
handlers
:处理程序,用于处理任务执行后触发的事件。 -
roles
:角色列表,用于按照特定的组织结构和功能将任务模块化。
-
-
任务:任务(task)是 Playbook 中的基本单元,用于定义要在目标主机上执行的操作。每个任务通常包含以下属性:
-
name
:任务的名称,用于描述任务的作用。 -
module
:要使用的 Ansible 模块,确定任务执行的具体操作。 -
args
:模块参数,指定模块执行时所需的输入参数。 -
when
:条件语句,用于根据满足特定条件来决定是否执行任务。
-
-
变量:Playbook 可以使用变量来传递数据和配置信息。变量可以在 Playbook 文件中定义,也可以从外部文件或动态数据源加载。变量可以用于设置主机参数、模块参数、任务控制等。
示例:
vars: http_port: 80 database_name: mydb tasks: - name: Install Apache apt: name: apache2 state: present - name: Configure Apache template: src: apache.conf.j2 dest: /etc/apache2/httpd.conf notify: - Restart Apache
-
处理程序:处理程序(handler)是用于处理任务完成后触发的事件的功能模块。处理程序通常与特定的任务相关联,并且只有在有任务触发时才会执行。
示例:
handlers: - name: Restart Apache service: name: apache2 state: restarted
-
角色:角色(role)是一种组织和复用 Playbook 的方式,通过将任务和变量组织在一起,可以更好地管理和维护自动化配置。角色可以包含多个任务、变量和处理程序,并可以在多个 Playbook 中重复使用。
示例:
- name: Web Server Configuration hosts: webserver roles: - common - apache
使用 Ansible Playbook,您可以将自动化任务以结构化和可维护的方式描述,并通过执行 Playbook 将其应用到目标主机上。Playbook 提供了强大的功能和灵活性,可用于自动化各种系统配置、应用部署和任务管理。确保熟悉 Playbook 的语法和组织结构,并利用角色的力量来实现高效的自动化配置管理。
6.debug
插件是一种回调插件,用于打印任务执行期间的调试信息。它可以用来输出变量的值、模块执行结果和其他相关信息。
要使用 debug
插件,你可以按照以下步骤配置:
- 在 playbook 目录下创建或编辑
ansible.cfg
文件。 - 将以下内容添加到
ansible.cfg
文件中:
[defaults] stdout_callback = debug
这将设置默认的回调插件为 debug
。
- 运行 playbook 时,
debug
插件会自动将任务执行期间的调试信息打印到终端上,包括变量的值、模块执行结果等。
下面是一个简单的 playbook 示例,演示了如何在 debug
插件下输出变量的值:
---
- name: Debug Plugin Example
hosts: localhost
gather_facts: falsetasks:
- name: Set variable
set_fact:
my_var: "Hello, World!"- name: Print variable value
debug:
var: my_var
在上述 playbook 中,set_fact
模块设置了一个 my_var
变量,并将其值设为 "Hello, World!"。然后,debug
模块使用 var
参数打印了 my_var
变量的值。
运行此 playbook 后,你将在终端上看到类似以下的输出:
TASK [Print variable value] *********************************************** ok: [localhost] => { "my_var": "Hello, World!" }
这表明 debug
插件成功地打印了变量的值。
请注意,如果你不想全局配置 stdout_callback
,你也可以直接在运行 playbook 时使用 -c
参数指定回调插件,例如:
ansible-playbook -c debug your_playbook.yml
这将仅在此次运行中使用 debug
回调插件。
Ansible 的 debug
模块并不支持 shell
参数。
可以尝试在 handlers
中执行 shell 命令并将其结果注册到变量 lldpjiancha
中,然后使用 debug
模块打印该变量的值。
但是需要注意的是,Ansible 的 handlers
并不支持像 command
这样的模块。handlers
主要用于定义处理任务的动作,并在特定条件下触发执行。它们通常用于响应其他任务的状态变化。
如果你想执行命令并打印其输出,你可以将其放在一个单独的任务中。请参考以下示例:
---
- name: Execute Shell Command and Print Output
hosts: localhost
gather_facts: falsetasks:
- name: Run shell command
shell: lldpctl show
register: lldpjiancha- name: Print lldpjiancha output
debug:
var: lldpjiancha.stdout_lines
在上述示例中,我将 shell
模块用于执行命令 lldpctl show
,并将其结果注册到变量 lldpjiancha
中。然后,debug
模块使用 var
参数来打印 lldpjiancha.stdout_lines
,即命令的输出结果。
运行此 playbook 后,你将会看到类似以下的输出:
TASK [Print lldpjiancha output] ******************************************** ok: [localhost] => { "lldpjiancha.stdout_lines": [ "Output line 1", "Output line 2", "..." ] }
这表示成功执行了命令,并打印了其输出行。
请确保将 lldpctl show
替换为你实际想要执行的 shell 命令。同时,请注意在使用 shell
模块时要注意安全性和潜在的风险。
五,ansible roles角色
Ansible 中的角色(Roles)是一种组织和复用 Playbook 的方法,它将相关的任务、变量、文件和模板组织在一个目录结构中。角色可以使 Playbook 更加模块化、可读性更好,并且方便与其他 Playbook 共享和重用。以下是有关 Ansible 角色的详细解释:
-
角色目录结构:一个典型的角色目录结构如下所示:
my_role/ ├── defaults/ │ └── main.yml ├── files/ ├── handlers/ │ └── main.yml ├── meta/ │ └── main.yml ├── tasks/ │ └── main.yml ├── templates/ └── vars/ └── main.yml
-
defaults/
:包含角色默认变量。这些变量会被其他位置的变量覆盖。 -
files/
:存放角色使用的文件,可以在 Playbook 中复制到远程主机。 -
handlers/
:角色使用的处理程序(Handlers),用于在适当的时候触发任务。 -
meta/
:角色的元数据,如作者信息、依赖关系等。 -
tasks/
:角色的主要任务定义文件。 -
templates/
:角色使用的模板文件。 -
vars/
:角色使用的变量文件。
-
定义角色:创建一个角色的常见方法是使用 Ansible Galaxy 命令行工具。运行
ansible-galaxy init my_role
可以创建一个基本的角色目录结构,然后在每个目录中添加相应的文件。 -
使用角色:在 Playbook 中使用角色时,可以通过
roles
关键字来引入和指定要使用的角色。您还可以在 Playbook 中为角色设置变量,并使用vars
关键字将其传递给角色。示例:
- name: Playbook using roles hosts: my_hosts roles: - my_role vars: my_variable: value
-
角色依赖:角色可以定义对其他角色的依赖关系,以确保它们在执行之前正确加载。在角色的
meta/main.yml
文件中,使用dependencies
关键字指定所依赖的角色。示例:
dependencies: - role: dependent_role
-
角色的优先级:当多个 Playbook 或包含角色的 Playbook 合并时,角色的执行顺序和变量优先级可能会受到影响。Ansible 角色有一个优先级顺序列表,其中包括获取角色的位置。默认情况下,该列表按以下顺序获取角色:
-
由
roles_path
配置的路径中的角色。 -
由
<playbook_dir>/roles/
目录中的角色。 -
由 Ansible Galaxy 预设的标准角色路径中的角色。
-
通过使用 Ansible 角色,您可以将任务、变量和文件组织起来,使 Playbook 更可读、可重用且易于维护。它们提供了一种结构化方法来管理和共享 Ansible 配置,并使得构建复杂系统配置更加简单。
六,ansible变量
Ansible 中的变量是用于存储和传递数据的容器,可以在 Playbook、模板或角色中使用。变量允许您动态地配置任务和模块,并使其更加灵活和可重用。以下是有关 Ansible 变量的一些重要信息:
-
变量类型:
-
主机变量(Host Variables):为单个主机定义的变量,可以在 inventory 文件中指定或通过动态数据源加载。它们具有最高优先级,并应用于特定主机上的所有任务。
-
组变量(Group Variables):为主机组定义的变量,可以在 inventory 文件中指定,并将应用于属于该组的所有主机。
-
Playbook 变量:在 Playbook 中定义的变量,可以在整个 Playbook 中访问。它们通常位于 Playbook 的顶层,也可以作为任务和角色的输入。
-
注册变量(Registered Variables):通过执行任务获取的结果存储在注册变量中,以供后续任务使用。
-
Facts 变量:Ansible 自动获取的关于目标主机的系统信息存储在 Facts 变量中,您可以使用这些变量进行条件判断、配置管理等。
-
-
变量的定义:变量可以通过多种方式定义,例如在 Playbook 中使用
vars
或vars_files
关键字,通过命令行传递-e
参数,从外部文件加载等。示例:
vars: my_variable: value tasks: - name: Task using variable debug: msg: "{{ my_variable }}"
-
使用变量:在 Playbook 或模板中,可以使用 Jinja2 模板语言来引用和操作变量。通过双花括号
{{ variable_name }}
引用变量的值。示例:
tasks: - name: Task using variable debug: msg: "The value is {{ my_variable }}"
-
条件判断:变量常用于条件判断,以决定是否执行任务或采取不同的行动。您可以使用
when
关键字和逻辑运算符来编写条件表达式。示例:
tasks: - name: Conditional task debug: msg: "Task executed" when: my_variable == "value"
-
外部变量文件:为了更好地组织和管理变量,您可以将变量定义存储在外部文件中,并在 Playbook 中引用。通过
vars_files
关键字指定要加载的变量文件。示例:
vars_files: - vars.yml tasks: - name: Task using variable from file debug: msg: "{{ external_variable }}"
通过使用 Ansible 变量,您可以实现可配置、灵活和可重用的自动化配置。了解变量的不同类型、定义方式和使用方法,可以帮助您更好地利用 Ansible 进行任务管理和系统配置。
七,ansible 命令
-
ansible
:执行一个或多个主机上的操作。示例:`ansible <host-pattern> -m <module> -a '<arguments>'`
-
ansible-playbook
:运行 Ansible Playbook。示例:`ansible-playbook <playbook.yml>`
-
ansible-galaxy
:管理 Ansible 角色和集合。示例:`ansible-galaxy <subcommand>`
-
ansible-vault
:管理 Ansible Vault 加密的文件。示例:`ansible-vault <subcommand>`
-
ansible-doc
:获取 Ansible 模块、插件和角色的文档。示例:`ansible-doc <module_name>`
-
ansible-config
:配置 Ansible 的全局设置。示例:`ansible-config <subcommand>`
-
ansible-console
:在交互式控制台中执行 Ansible 命令。示例:`ansible-console`
-
ansible-pull
:从远程 Git 存储库中拉取并执行 Ansible Playbook。示例:`ansible-pull -U <repository>`
-
基础命令
-a 模块参数
-e 指定要使用的并行进程的数量
-h,——help显示帮助信息并退出
-i 指定目录主机路径或以逗号分隔的主机列表
-l 子集 ——limit子集
-m 要执行的模块名
-o 一行压缩输出
-t TREE日志输出到该目录
-v verbose模式(-vvv表示更多,-vvvv表示启用连接调试)
-T 以秒为单位覆盖连接超时(默认= 10)
-c 连接要使用的连接类型(默认=smart)
-k 请求连接密码
-u 以该用户连接
ansible-playbook --tags=跟tagsname
表示执行指定playbook里的某一个tags
ansible-playbook --skip-tags=跟tagsname
表示不执行playbook里的某个tags
检测语法是否正确 ansible-playbook --syntax-check 跟yml名