Ansible 使用SSH进行通信,不需要在目标服务器上安装代理
Ansible 的主要组件:
Ansible 控制节点:
- 运行Ansible的机器,用于管理其他节点。
节点(Node)/ 受管节点(Managed Node):
- 被控制节点管理的服务器或虚拟机。
Inventory:
- 一个包含所有受管节点列表的文件或动态生成的源。
Playbook:
- Ansible的主要配置、部署和管理代码,用YAML语言编写。
Roles:
- 一种特殊的文件结构,用于组织和重用Playbook中的代码。
Modules:
- Ansible执行具体功能的独立脚本,如文件操作、服务管理等。
Ansible 的基本使用步骤:
安装 Ansible:
- 在控制节点上安装Ansible。
配置Inventory:
- 创建或配置Inventory文件,列出所有受管节点。
编写Playbook:
- 编写YAML格式的Playbook来描述任务。
执行Playbook:
- 使用ansible-playbook命令执行Playbook。
使用Roles:
- 组织Playbook为可重用的Roles。
代码示例:
示例1:简单的Playbook
---
- name: "Hello World Playbook"
hosts: all
tasks:
- name: "Print a message"
ansible.builtin.debug:
msg: "Hello, World"
这个Playbook非常简单,它只包含一个任务,该任务使用debug
模块打印一条消息。
示例2:使用变量和Handlers
---
- name: "Use Variables and Handlers"
hosts: all
vars:
my_variable: "Value of my variable"
tasks:
- name: "Show variable"
ansible.builtin.debug:
msg: "Variable value is {
{ my_variable }}"
- name: "Trigger a handler"
ansible.builtin.command: "echo 'Do something'"
notify: my_handler
handlers:
- name: my_handler
ansible.builtin.debug:
msg: "Handler is triggered"
这个Playbook定义了一个变量,并在任务中使用它。notify
关键字用于触发Handlers,当任务发生变化时,Handlers会被执行。
示例3:使用模板
---
- name: "Use Template"
hosts: all
tasks:
- name: "Copy template file"
ansible.builtin.template:
src: "template.j2"
dest: "/path/to/destination/file"
这个Playbook使用template
模块将一个Jinja2模板文件复制到受管节点的指定位置。
示例4:使用Roles
创建Roles的目录结构通常如下:
my_role/
├── defaults/
│ └── main.yml
├── files/
├── handlers/
│ └── main.yml
├── meta/
│ └── main.yml
├── tasks/
│ └── main.yml
└── vars/
└── main.yml
在Playbook中使用Roles:
---
- name: "Use Roles"
hosts: all
roles:
- my_role
示例5:执行Playbook
执行Playbook的命令如下:
ansible-playbook my_playbook.yml
如果需要连接到受管节点的特定用户,可以使用-u
选项:
ansible-playbook my_playbook.yml -u username