Ansible playbooks 使用介绍
环境信息
- ansible-core 2.16
- Docker image python:3.12.3
Ansible Playbook 语法
Playbooks 使用 YAML 语法定义(描述)。一个 playbook
由一个或多个 play
依序组成。每个 play
运行一个或多个 tasks
,每个 task
也成为一个 module
Ansible playbook 示例:
--- |
一个 Ansible playbook 由一个或多个 plays
组成,每个 play
包含以下部分:
name
: 描述性的名称hosts
: 指定目标主机become
: 提升权限(默认是使用sudo
提升到root
用户)remote_user
: 用于连接到远程主机的账户。(如果 Inventory 中定义了远程连接的用户,会覆盖此处的配置)tasks
: 要执行的一系列任务列表vars
: 用于定义变量,便于管理和重用gather_facts
: 收集Facts
, 默认值为yes
tasks
是一个任务列表,每个任务执行特定的操作。任务包含以下元素:
name
: 描述任务的目的。module_name
: Ansible 模块名称,如apt
、service
等。module_options
: 模块的参数,以键值对的形式提供。when
: 条件语句,控制任务是否执行。loop
: 循环执行任务
执行以下命令运行 playbook.yml
ansible-playbook playbook.yml -f 10 |
常用选项说明
选项 | 说明 | 示例 |
---|---|---|
-f --forks |
指定并发执行的数量,默认为 5 | |
-v --verbose -vvvvvv |
打印 debug 信息,详细程度从 -v 到 -vvvvvv |
|
-C --check |
Check mode ,不执行任何实际操作,而是对要执行的操作进行验证 |
|
-D --diff |
- 只使用 --diff 会执行 play 定义的实际操作,并对所有受影响的文件或者模板显示其变更前后的具体差异- 和 --check 一起使用,不会执行 play 定义的实际操作,只显示变更前后的差异,可以在实际执行前,调试/预览将要进行的变更,防止意外配置变更或文件修改主要用于文件或者模板的变更,对于其他类型的任务(如包安装、服务管理、修改主机名等),不会显示具体的差异( 配合 --check 使用时,结果会显示为 skipping ,实际执行时结果为 changed )。 |
|
--list-hosts |
不执行任何实际操作,只列出符合 pattern 的目标主机 |
|
--list-tasks |
不执行任何实际操作,只列出将要执行的 task |
|
--syntax-check |
不执行任何实际操作,只检查 playbook 文件是否有语法错误 |
when 语句
在 Ansible playbook 中,when
关键字用于条件执行任务。它允许你根据特定的条件来决定是否执行某个任务。这个功能非常强大,可以帮助你在不同的主机、不同的环境或不同的配置下灵活地执行任务。
when
表达式基于 Jinja2 模板语言,其中的变量主要来自: [1]
when
关键字后面跟随一个条件表达式,当条件为真时,任务会执行;当条件为假时,任务会被跳过。
tasks: |
when
关键字支持多种表达式,包括:
简单条件:
基于变量 的条件:
when: variable == 'value'
- name: Install nginx only if nginx_install is true
apt:
name: nginx
state: present
when: nginx_install在这个示例中,
nginx_install
是一个布尔变量。当nginx_install
为真时,任务将执行。基于事实(facts) 的条件:
when: ansible_facts['os_family'] == 'Debian'
- name: Install nginx on Debian systems
apt:
name: nginx
state: present
when: ansible_facts['os_family'] == 'Debian'
逻辑操作:
- 与操作:
when: condition1 and condition2
当使用多个条件时,也先当于- name: Install nginx on Debian systems
apt:
name: nginx
state: present
when: ansible_facts['os_family'] == 'Debian' or ansible_facts['os_family'] == 'Ubuntu'and
操作tasks:
- name: Shut down CentOS 6 systems
ansible.builtin.command: /sbin/shutdown -t now
when:
- ansible_facts['distribution'] == "CentOS"
- ansible_facts['distribution_major_version'] == "6" - 或操作:
when: condition1 or condition2
- 非操作:
when: not condition
- 与操作:
列表和字典操作:
- 列表包含:
when: 'item' in mylist
- name: Ensure package is installed if it is in the list
apt:
name: "{{ item }}"
state: present
loop:
- nginx
- git
when: item in packages_to_install - 字典键存在:
when: 'key' in mydict
这个任务仅在- name: Run only if the key 'run_task' is present in mydict and its value is true
debug:
msg: "Running task"
when: mydict.get('run_task', False)mydict
中存在键run_task
且其值为真时执行。when: mydict.get('run_task', False)
中False
为默认值,如果mydict
字典中不存在run_task
键,mydict.get('run_task', False)
将返回False
。这种用法确保了在键不存在时,条件判断不会抛出错误。
- 列表包含:
复杂条件:
- 组合多个条件:
when: (condition1 and condition2) or condition3
- 组合多个条件:
以下是一个完整的示例
--- |
引用 Facts 变量值
Ansible-playbook 运行过程中,默认会收集目标主机的 Facts 信息。可以在 Playbook 定义中引用这些值 [2]
原始的 facts
信息可以通过 setup
模块获取
ansible <hostname> -m ansible.builtin.setup |
要在 playbook
或者 template
中引用,可以参考以下方法:
{{ ansible_facts['devices']['xvda']['model'] }} |
playbook 示例
修改主机名
以下示例展示修改主机名可使用的 playbook
,主机名称修改为 Inventory 中主机的主机名(Alias)
假设 Inventory 文件内容如下:
test_target1: |
Playbook 内容如下
--- |
相关模板变量说明
模板变量 | 说明 | 示例 |
---|---|---|
inventory_hostname |
引用 Inventory 中的主机名称(Alias) | {{ inventory_hostname }} |
相关模块使用参考
模块 | 参考链接 | 示例 |
---|---|---|
hostname |
hostname |
|
lineinfile |
lineinfile |
|
reboot |
reboot |
|
command |
command |