ansible中用register保存任务结果为结构化字典变量,命名需符合规则;通过{{var.stdout}}等字段提取内容,set_fact可跨主机共享,debug: var=可调试变量结构。

在 Ansible 任务中使用 register 保存执行结果,核心是把某个任务的输出存进一个变量,后续任务就能直接引用它。这个变量不是简单字符串,而是一个结构化的字典,字段取决于所用模块和命令是否成功。
注册变量的基本写法
在任意 task 后面加 register: 变量名 即可。变量名需符合 Ansible 命名规则:只能含字母、数字、下划线,且必须以字母或下划线开头。
- 例如获取当前用户:
shell: whoami
register: current_user
- 执行后,
current_user就包含了完整执行信息,包括stdout(输出内容)、rc(返回码)、failed(是否失败)等字段。
提取并使用注册变量中的关键内容
注册变量本身是字典,不能直接当字符串用。常用字段有:
-
{{ 变量名.stdout }}:标准输出(单行或拼接后的字符串) -
{{ 变量名.stdout_lines }}:按行切分的列表,适合遍历或多行处理 -
{{ 变量名.rc }}:返回码,常用于条件判断 -
{{ 变量名.failed }}:布尔值,判断任务是否失败
比如打印端口监听状态:
shell: netstat -ntlp | head -5
register: port_result
- name: Show first line
debug:
msg: "{{ port_result.stdout_lines[0] }}"
跨主机共享注册变量
默认注册变量只在本主机生效。若要在其他主机上使用(如 master 上获取 token,node 上复用),需配合 set_fact 把值“提升”为全局 fact:
- 在 master 主机上注册并保存:
shell: kubeadm token create
register: token_out
- name: Save as fact
set_fact:
bootstrap_token: "{{ token_out.stdout }}"
- 在 node 主机上通过
hostvars[主机名].bootstrap_token引用:
shell: kubeadm join --token "{{ hostvars['master01'].bootstrap_token }}" ...
调试和验证注册变量内容
不确定变量结构时,用 debug: var=变量名 最直接:
debug:
var: current_user
输出会显示所有字段,包括 changed、cmd、start、stderr 等,方便排查为什么 stdout 为空或命令没执行。











