剧本
规划目录,将所有剧本全部放置在一起:mkdir /etc/ansible/ansible-playbook
编写剧本:vim rsync_server.yaml
检查剧本语法:ansible-playbook --syntax-check rsync_server.yaml
模拟执行剧本:ansible-playbook -C rsync_server.yaml
执行脚本:ansible-playbook rsync_server.yaml
# 剧本调试
在 ansible 剧本中,register
和 debug
是两个常用的功能
register
用于将任务的输出结果保存到一个变量中,这样后续的任务可以引用这个变量的值
- hosts: localhost
tasks:
- name: Check if a file exists
stat:
path: /etc/passwd
register: file_info
- name: Show file details
debug:
msg: "The file permissions are: {{ file_info.stat.mode }}"
#stat 模块检查 /etc/passwd 文件的状态
#register 将 stat 模块的结果保存到变量 file_info 中
#之后可以通过 {{ file_info.stat.mode }} 访问文件的权限
2
3
4
5
6
7
8
9
10
11
12
13
14
debug
模块用于在执行剧本时打印出变量的值或信息,常用于调试和输出日志
- hosts: localhost
tasks:
- name: Print a message
debug:
msg: "Hello, World!"
- name: Show the registered variable
debug:
var: file_info
#第一个 debug 任务简单打印 "Hello, World!"
#第二个 debug 任务显示已注册的 file_info 变量的所有内容
2
3
4
5
6
7
8
9
10
11
12
register
和 debug
的结合
可以先使用 register
存储任务的结果,然后使用 debug
模块来查看该结果,方便进行调试
- hosts: localhost
tasks:
- name: Ping the local host
ping:
register: ping_result
- name: Show the ping result
debug:
var: ping_result
#ping 模块执行后,结果被保存到 ping_result 中
#debug 模块打印出 ping_result 变量的值,帮助你查看 ping 的执行结果
2
3
4
5
6
7
8
9
10
11
12
# 剧本设置变量
变量设置后优先级:命令行变量设置 > 剧本中的变量设置 > 主机清单变量设置
局部变量
可以在剧本的 vars
块中定义变量,这些变量仅在该剧本中有效
这里定义了两个变量 my_variable
和 package_name
,在任务中使用 的格式来引用它们
- hosts: all
vars:
my_variable: "Hello World"
package_name: "httpd"
tasks:
- name: Install package
yum:
name: "{{ package_name }}"
state: present
2
3
4
5
6
7
8
9
通过 vars_files
引入外部变量文件
在 vars/main.yml
文件中
package_name: "httpd"
- hosts: all
vars_files:
- vars/main.yml
tasks:
- name: Install package
yum:
name: "{{ package_name }}"
state: present
2
3
4
5
6
7
8
全局变量
在剧本中使用 vars
块直接定义变量,这样定义的变量对所有主机都有效
- hosts: all
vars:
global_variable: "This is a global variable"
tasks:
- name: Print the global variable
debug:
msg: "{{ global_variable }}"
2
3
4
5
6
7
8
在这个例子中,global_variable
变量在所有 hosts
中都可以使用
你可以将变量存储在外部文件中,并通过 vars_files
引入
vars/global_vars.yml
文件内容
global_variable: "This is a global variable from file"
- hosts: all
vars_files:
- vars/global_vars.yml
tasks:
- name: Print the global variable
debug:
msg: "{{ global_variable }}"
2
3
4
5
6
7
8
你也可以通过 group_vars/all.yml
或 host_vars/all.yml
文件来定义全局变量
Ansible 会自动加载这些文件中的变量
group_vars
是 Ansible 的一种组织变量的机制,用于在多个主机或主机组之间共享变量
在 ansible 项目目录下,创建一个名为 group_vars
的目录
在 group_vars
目录下创建一个文件,比如 all.yml
,这样文件中的变量会对所有主机生效
在 group_vars/all.yml
文件中定义你希望所有主机都共享的变量。all
代表应用于所有主机的变量组
在主机文件中定义变量
可以在 Ansible 的主机文件中为特定主机或组定义变量
这样,每个主机有各自的 package_name
变量
[webservers]
192.168.1.1 ansible_user=root package_name=httpd
192.168.1.2 ansible_user=root package_name=nginx
2
3
通过命令行传递变量
可以在执行 Ansible 时通过命令行传递变量
ansible-playbook playbook.yml --extra-vars "package_name=httpd"
在剧本中:
- hosts: all
tasks:
- name: Install package
yum:
name: "{{ package_name }}"
state: present
2
3
4
5
6
临时变量
可以使用 set_fact
来定义任务内的临时变量
- hosts: all
tasks:
- name: Set a temporary variable
set_fact:
my_temp_variable: "temp_value"
- name: Use the temporary variable
debug:
msg: "{{ my_temp_variable }}"
2
3
4
5
6
7
8
9