本文最后更新于 253 天前,其中的信息可能已经有所发展或是发生改变。
1. 什么是task。
task是playbook中的基本执行单元,调用模块执行操作。
- 每个task必须有name,用于输出结果。
- 每个 task 的目标在于执行一个 moudle。
2. 什么是playbook,其文件格式是什么,这种格式有什么优点。
Playbook 是 Ansible的配置,部署,编排语言,是希望远程主机执行命令的方案(希望他们怎么做并描述出来)。
它是由多个 play 组成的 YAML 格式文件,内容是一个以 ‘plays’ 为元素的列表,而内容是一个以 plays则由上文的task构成。后文有具体样式。
- 优点:
- 可读性强:结构清晰,适合复杂场景的编排。
- 幂等性:多次执行结果一致,避免重复操作冲突。
- 模块化:支持 roles 和 include 实现代码复用。
3. 除了这种配置文件的格式,你还了解哪些格式,分别有什么特点。
- INI 格式:用于 hosts 文件(Inventory),定义主机及组信息,语法简单但功能有限。
- JSON 格式:可通过 ansible-config 命令生成配置,适合程序化调用,但可读性较差。
- Jinja2 模板:用于动态生成配置文件(如 templates 模块),支持变量替换和逻辑判断。
4. playbook中的内容是顺序执行的还是并行的。
默认状态下是顺序执行的。
同一 Play 内的 Task 按定义顺序逐个执行,同一时间同一主机仅执行一个 Task。
如果需要并行控制则可以在命令行加上forks参数:
ansible-playbook playbook.yml -f 10
-f 10就是启用 10 个并发进程,假设有20台主机,加上这个配置后只需
5. 如果palybook中前面的task失败,会退出还是继续执行。如何按照自己需求进行改变
当task遇到失败时,立即终止 Playbook 执行。
如果一个 host 执行 task 失败,这个 host 将会从整个 playbook 的 rotation 中移除。
如果想要略过错误继续执行,可以在tasks里加入action:
ignore_errors: True
6. task中如何设置和使用变量。
变量名可以为字母,数字以及下划线.变量始终应该以字母开头。
task的变量可以分为
- 局部变量
- 在tasks的var字段里直接定义
– name:
vars:
task_port: 8080 - 全局变量
- 在play的var中定义,则所有的task共享- hosts: webservers
vars:
http_port: 80
tasks:
…
- 在play的var中定义,则所有的task共享- hosts: webservers
此外,变量还可以这样设置使用:
- 编写变量文件
- 编写vars下的文件,这里以aaa举例:
- 创建vars/aaa.yml
max_clients: 200- 在playbook中引用
– vars/aaa.yml
tasks:
…
- 编写vars下的文件,这里以aaa举例:
- 使用命令覆盖变量
- 加上参数
-eansible-playbook user.yml -e "USER=cc"
- 加上参数
7. 如何将task的执行结果赋值为变量
可以使用关键字register将task的执行结果赋值为字典变量。
register的格式如下:
register: 变量名(存储结果的变量名)- 可以这么用: – name: 查询用户列表
hosts: webservers
tasks:
– name: 查询用户列表
shell: cat /etc/passwd
register: etc_files #(输出的结果就存在这个变量里了)
– name: 输出结果
debug:
var: etc_files.stdout #(这是查看存储结果的方式)-debug:输出变量值var:指定哪个变量要输出
8. 如何对变量进行判断,比如大小,是否有内容等
可以使用基本比较运算符,逻辑运算符,when语句,条件判断语句等对变量进行判断,主要通过 Jinja2 模板引擎处理。
下边是大小数量判断:
- name: 判断账户数量是否大于10
hosts: all
tasks:
# 步骤1:获取账户数量)
- name: 获取账户数量
ansible.builtin.stat:
path: /etc/passwd
register: passwd_file
# 步骤2:计算账户数量(
- name: 计算账户数量
set_fact:
account_count: "{{ passwd_file.stat.size | default(0) | int // 25 }}"
vars:
line_size: 25 # 每个账户占25字节
# 步骤3:判断
- name: 执行账户数量检查
ansible.builtin.debug:
msg: "账户数量 {{ account_count }}超过10"
when: account_count > 10
如果要判断是否有内容,则:
- name: 变量存在时执行
ansible.builtin.debug:
msg: "变量 {{ var_name }} 已定义"
when: var_name is defined
ansible.builtin.stat: 文件状态检查模块
path:要检查的文件路径ansible.builtin.debug:文件调试输出模块
msg:自定义输出内容
9. 写一个playbook,分发一个压缩包解压到其他机器的/opt/任意目录下。
- name: 分发并解压压缩包
hosts: webservers
remote_user: root
tasks:
- name: 传输压缩包
copy: #从(src)本地复制到(dest)远程
src: /opt/nginx.tar.gz
dest: /tmp/
mode: 0644 #设置权限
- name: 解压到目标目录
unarchive:
src: /tmp/nginx.tar.gz
dest: /opt/
remote_src: yes
creates: /opt/nginx