1.Ansible Playbook基本概述
ansible有两种执行模式,一种是用完即扔的ad-hoc模式,另一种是类似于shell 脚本的playbook模式,这里我们介绍第二种。
playbook 剧本是由一个或多个“play”组成的列表
play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。
Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
2.Ansible Playbook如何工作
Ansible 模块执行任务。可以组合一个或多个 Ansible 任务来进行。可以组合两个或多个剧本来创建 Ansible Playbook。Ansible Playbook 是针对主机自动执行的任务列表。主机组构成您的 Ansible 清单。
Ansible Playbook 中的每个模块都执行特定的任务。每个模块都包含元数据,这些元数据确定执行任务的时间和地点,以及执行任务的用户。还有数以千计的其他 Ansible 模块可以执行各种 IT 任务。
3.什么是yaml
Ansible Playbook是使用YAML格式编写的自动化任务描述文件。YAML(YAML Ain’t Markup Language)是一种简洁、人类可读的数据序列化格式,非常适合用于描述数据结构和配置信息。
在Ansible中,Playbook是用于定义自动化任务的主要组件。Playbook由一系列任务组成,每个任务描述了要执行的具体操作。Playbook使用YAML格式来定义任务、变量、条件、循环、错误处理等内容。
使用YAML格式编写Playbook具有以下优点:
易于阅读和编写:YAML使用缩进和特定的符号来表示层次结构,使得Playbook的结构清晰可见。YAML的简洁语法使得Playbook易于阅读和编写,可读性强。
人类可读性:YAML的语法规则简单明了,提供了一种简洁、直观的方式来描述数据结构。这使得Playbook文件对人类来说更加可读和易于理解。
适合版本控制:YAML使用文本文件存储,易于与版本控制系统集成。这使得Playbook文件可以轻松地进行版本管理和协作开发。
灵活性:YAML支持多种数据类型和结构,可以表示复杂的数据结构和配置信息。这使得Playbook可以灵活地定义各种任务和操作。
总的来说,Ansible Playbook使用YAML格式编写,利用YAML的简洁、人类可读的特性来描述自动化任务。YAML的易读性和灵活性使得Playbook文件易于编写、理解和维护
Ansible Playbook是一个用于定义自动化任务的YAML文件。它允许您描述一系列任务,以及在哪些主机上执行这些任务。下面是Ansible Playbook YAML的一些重要概念和功能的详细介绍:
1. Playbook结构: Ansible Playbook使用YAML格式,以树状结构组织任务和配置。一个Playbook可以包含一个或多个play,每个play可以包含多个task。
2. Play: Play是一组相关的任务,它们在一组主机上执行。每个play都有一个名称、主机列表、变量和任务列表。
3. Task: Task是一个要在远程主机上执行的操作单元。每个task都有一个名称、模块和模块参数。
4. 模块(Module): 模块是Ansible的核心组件,它们提供了各种功能,如软件包管理、文件操作、服务管理等。您可以在Playbook中使用模块来执行任务。
5. 变量(Variable): 变量是存储数据的容器,可以在Playbook中使用。您可以在Playbook中定义变量,并在任务中引用它们。变量可以用于存储主机信息、配置选项、任务参数等。
6. 条件语句(Conditional Statement): 条件语句允许您根据条件来执行不同的任务。您可以在Playbook中使用条件语句来根据特定的条件执行任务。
7. 循环(Loop): 循环允许您在Playbook中迭代执行任务。您可以在Playbook中使用循环来重复执行任务,或遍历列表、字典等数据结构。
8. 注册变量(Registered Variable): 注册变量允许您将任务的输出存储到变量中,以便在后续任务中使用。您可以在任务中使用register关键字来注册变量。
9. 模板(Template): 模板允许您在Playbook中使用动态生成的文件。模板文件可以包含变量和表达式,Ansible会根据模板文件生成最终的文件。
10. 错误处理(Error Handling): Ansible Playbook提供了一些机制来处理错误。您可以使用failed_when关键字来定义任务失败的条件,并使用ignore_errors关键字来忽略错误。
11. 包含(Include): 您可以将多个Playbook组合在一起,以便复用和组织任务。使用include关键字可以将一个Playbook包含到另一个Playbook中。
以上是Ansible Playbook YAML的一些重要概念和功能。Ansible Playbook还提供了许多其他功能,如处理文件、处理文本、使用外部变量文件等
yaml 语言的特性
Ansible Playbook使用YAML语言作为其描述文件的格式。下面是一些Ansible Playbook中使用的YAML语言的特性:
层次结构:YAML使用缩进来表示层次结构,使用空格缩进来表示子项。这使得Playbook的结构清晰可见,易于阅读和理解。
键值对:YAML使用冒号(:)来分隔键和值。键是一个字符串,值可以是字符串、整数、浮点数、布尔值、null值等。
列表:YAML使用短横线(-)来表示列表项。可以在一个键下定义一个列表,每个列表项可以是一个值或一个字典。
字典:YAML使用冒号(:)来表示字典的键值对。可以在一个键下定义一个字典,字典的键可以是字符串,值可以是字符串、整数、浮点数、布尔值、null值等。
变量:YAML支持变量的定义和引用。可以在Playbook中定义变量,并在任务中使用{{ 变量名 }}来引用变量的值。
条件语句:YAML支持条件语句,可以使用if、elif和else来定义条件判断。条件语句可以根据变量的值来执行不同的任务。
循环:YAML支持循环语句,可以使用循环来重复执行任务。可以使用with_items关键字来定义循环,并在任务中使用{{ item }}来引用循环变量的值。
模板:YAML支持使用Jinja2模板语言来动态生成文件内容。可以在Playbook中使用模板来根据变量的值来生成不同的配置文件。
错误处理:YAML支持定义任务执行时发生错误时的处理方式。可以使用ignore_errors关键字来忽略错误,或使用failed_when关键字来定义任务失败的条件。
这些是Ansible Playbook中使用的一些常见的YAML语言特性。通过使用这些特性,可以编写出灵活、可读性强的自动化任务描述文件
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好
4.Ansible Playbook与AD-Hoc的关系
Ansible Playbook和Ad-Hoc是Ansible的两种主要用法,它们之间存在一些关系和区别。
1. Ansible Playbook: Ansible Playbook是一种使用YAML语法编写的自动化任务描述文件。它允许您定义复杂的任务流程、变量、条件逻辑、循环和错误处理等。Playbook通常用于执行长期、复杂的自动化任务,可以在多个主机上执行多个任务。
2. Ad-Hoc命令: Ad-Hoc命令是一种在命令行上直接执行的单个Ansible任务。它使用简单的命令行语法,不需要编写和维护Playbook文件。Ad-Hoc命令通常用于执行简单和临时的任务,例如快速检查主机状态、执行一次性命令或在少数主机上执行任务。
关系: Ansible Playbook和Ad-Hoc都是使用Ansible进行自动化的不同方式。它们都使用相同的底层机制和模块来执行任务。Playbook可以包含Ad-Hoc命令,并且Ad-Hoc命令可以在Playbook中使用。Playbook通常用于管理复杂的自动化流程,而Ad-Hoc命令则更适合于快速执行简单任务。
区别: Ansible Playbook和Ad-Hoc在语法、用法和功能上有一些区别
Playbook使用YAML语法,具有更丰富的功能,可以定义复杂的任务流程和逻辑。Ad-Hoc命令使用简单的命令行语法。
Playbook可以在多个主机上执行多个任务,具有更高的灵活性和扩展性。Ad-Hoc命令通常只在单个主机或少数主机上执行单个任务。
Playbook可以使用变量、条件语句、循环和错误处理等功能。Ad-Hoc命令通常不支持这些高级功能。
Playbook可以被保存、版本控制和重复使用。Ad-Hoc命令是即时执行的,不需要保存和维护。
总之,Ansible Playbook和Ad-Hoc是Ansible的两种主要用法,它们在功能和用法上有所不同,但都可以用于自动化任务。选择使用哪种方式取决于任务的复杂性、持久性和灵活性要求。
5.Ansible Playbook书写格式
Ansible Playbook使用YAML语法进行编写,以下是一般的Ansible Playbook的书写格式:
--- - name: Playbook Name hosts: target_hosts become: yes become_user: root vars: variable_name: variable_value tasks: - name: Task Name module_name: parameter1: value1 parameter2: value2
解释一下上述格式的各个部分:
—:这是YAML文档的开始标志。
name:Playbook的名称,用于标识和描述Playbook。
hosts:指定要在哪些主机上执行任务,可以是单个主机、主机组或使用模式匹配。
become:指定是否切换到特权用户执行任务,默认为no。
become_user:指定切换到的特权用户,默认为root。
vars:指定Playbook中使用的变量。
tasks:指定要执行的任务列表。
name:任务的名称,用于标识和描述任务。
module_name:要执行的Ansible模块的名称。
parameter1, parameter2:模块的参数,可以根据模块的要求进行设置。
此外,Ansible Playbook还支持其他功能,如条件语句、循环、错误处理、模板等。您可以在Playbook中使用这些功能来实现更复杂的自动化任务。
缩进:YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成, 不能使用tabs
冒号:以冒号结尾的除外,其他所有冒号后面所有必须有空格
短横线:表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一列表
注意:在编写Ansible Playbook时,请注意缩进和正确的YAML语法。Ansible对于缩进和格式要求非常严格,因为它是基于YAML语法的。错误的缩进和格式可能会导致Playbook执行失败
6.Ansible Playbook的指令详细信息
当使用Ansible Playbook时,有许多常用的指令可用于执行不同的任务。以下是一些常用的指令的详细说明:
name:用于给任务或角色命名,以便描述任务的目的或作用。这个指令对于代码的可读性非常重要。
- name: Install Apache apt: name: apache2 state: present
hosts:用于指定要在哪些主机上执行任务或角色。可以使用主机组或单个主机来定义。
- hosts: webservers tasks: - name: Install Apache apt: name: apache2 state: present
become:以特权用户(例如root)身份执行任务。这个指令允许你在执行需要特权的操作时切换用户身份。
- hosts: webservers become: true tasks: - name: Install Apache apt: name: apache2 state: present
vars:用于定义变量,以便在Playbook中重复使用。这个指令可以帮助你在不同的任务中共享数据。
- hosts: webservers vars: http_port: 80 tasks: - name: Install Apache apt: name: apache2 state: present
include:用于包含其他Playbook或任务文件。这个指令可以帮助你将复杂的Playbook拆分成更小的模块。
- include: tasks/install_apache.yml
when:根据条件判断是否执行任务。这个指令允许你根据主机属性或其他条件来选择执行特定的任务。
- name: Install Apache on Ubuntu apt: name: apache2 state: present when: ansible_distribution == 'Ubuntu'
register:将任务的输出保存到变量中,以供后续任务使用。这个指令允许你捕获命令执行的结果并在后续任务中使用。
- name: Check if Apache is installed command: dpkg -s apache2 register: apache_status - name: Print Apache status debug: var: apache_status.stdout_lines
notify:在任务状态改变时触发通知。这个指令通常用于重新启动服务或执行其他操作。
- name: Restart Apache service: name: apache2 state: restarted notify: Restart Apache
这些是一些常用的Ansible Playbook指令,可以根据具体的需求和场景进行使用。Ansible提供了丰富的指令和模块,可以满足各种自动化任务的需求
在Ansible Playbook中,handlers是一种特殊类型的任务,它们在特定的条件下触发。Handlers通常用于在任务执行后执行特定的操作,例如重新启动服务或执行其他操作。
Handlers的定义和使用如下所示:
handlers: - name: Restart Apache service: name: apache2 state: restarted tasks: - name: Install Apache apt: name: apache2 state: present notify: Restart Apache
在上面的示例中,我们定义了一个名为Restart Apache的handler,它使用service模块重新启动Apache服务。然后,在安装Apache的任务中,我们使用notify指令将该handler与任务关联起来。这意味着当安装Apache的任务执行完成后,将触发Restart Apache handler。
Handlers会在Playbook的所有任务执行完成后进行处理。如果多个任务触发了相同的handler,handler只会执行一次。这样可以确保在需要时只执行一次特定的操作,而不会重复执行。
Handlers还可以使用listen指令来监听特定的事件,并在事件发生时触发。例如,可以使用listen指令来监听文件的变化,并在文件发生更改时执行特定的操作。
handlers: - name: Restart Apache service: name: apache2 state: restarted listen: "File changed" tasks: - name: Update config file template: src: config.j2 dest: /etc/apache2/config.conf notify: "File changed"
在上面的示例中,我们定义了一个名为Restart Apache的handler,并使用listen指令来监听名为File changed的事件。然后,在更新配置文件的任务中,我们使用notify指令将File changed事件与该任务关联起来。这意味着当配置文件发生更改时,将触发File changed事件,并执行Restart Apache handler。
Handlers是Ansible Playbook中非常有用的功能,可以帮助你在需要时执行特定的操作,例如重新启动服务或执行其他任务
7.Ansible Playbook的使用
使用机器要在hosts文件里写上IP
剧本
创建目录
[root@ansible ~]$ mkdir -p /server/playbook
写剧本
[root@ansible /server/playbook]$ cat 01cs.yml --- - hosts: all tasks: - name: show name command: hostname
测试结果
[root@ansible /server/playbook]$ ansible-playbook 01cs.yml -C
执行playbook,注意观察执行返回的状态颜色
绿色(Green):表示任务成功执行
黄色(Yellow):表示任务已经执行过,但可能有一些变化或警告
红色(Red):表示任务执行失败
蓝色(Blue):表示任务已经被跳过,因为条件不满足或者已经被标记为跳过
紫色(Purple):表示任务已经被忽略,因为之前的任务已经失败
无颜色(No color):表示任务正在执行中
使用ansible playbook安装并配置nfs服务
剧本
[root@ansible /server/playbook]$ cat 02nfs.yml --- - hosts: 172.16.1.78 tasks: - name: install nfs yum: name: rpcbind,nfs-utils state: installed - name: nfs copy copy: src: ./exports.j2 dest: /etc/exports backup: yes - name: mkdir dir file: path: /data-nfs state: directory owner: nfsnobody group: nfsnobody - name: start rpcbind systemd: name: rpcbind state: started enabled: yes - name: start nfs systemd: name: nfs state: started enabled: yes - name: mount mount: src: 172.16.1.78:/data-nfs path: /mnt fstype: nfs state: mounted
文件(需要提前准备好文件)
[root@ansible /server/playbook]$ cat exports.j2
/data-nfs 172.16.1.0/24(rw,all_squash)
执行剧本
-C先测试
[root@ansible /server/playbook]$ ansible-playbook 02nfs.yml
挂载web服务器
[root@ansible /server/playbook]$ cat 03web-nfs.yml --- - hosts: web tasks: - name: web-nfs mount: src: 172.16.1.78:/data-nfs path: /code/backup fstype: nfs state: mounted
使用ansible安装并配置nginx服务
剧本
[root@ansible /server/playbook]$ cat 04nginx.yml --- - hosts: 172.16.1.78 tasks: - name: nginx Repo yum_repository: name: nginx description: nginx repo baseurl: http://nginx.org/packages/centos/$releasever/$basearch/ enabled: yes gpgcheck: yes gpgkey: https://nginx.org/keys/nginx_signing.key - name: install nginx yum: name: nginx state: installed - name: file copy: content: "ansible.playbook.com" dest: /usr/share/nginx/html/index.html - name: copy nginx copy: src: ./www.ansible.com.conf dest: /etc/nginx/conf.d/www.ansible.com.conf backup: yes - name: state nginx systemd: name: nginx state: started enabled: yes
执行剧本
[root@ansible /server/playbook]$ ansible-playbook 04nginx.yml
配置文件
[root@ansible /server/playbook]$ cat www.ansible.com.conf
server {
listen 80;
server_name www.ansible.com;
location / {
root /usr/share/nginx/html/;
index index.html index.php;
}
}
nginx配置文件发生变化重启
[root@ansible /server/playbook]$ cat 04nginx.yml --- - hosts: 172.16.1.78 tasks: - name: nginx Repo yum_repository: name: nginx description: nginx repo baseurl: http://nginx.org/packages/centos/$releasever/$basearch/ enabled: yes gpgcheck: yes gpgkey: https://nginx.org/keys/nginx_signing.key - name: install nginx yum: name: nginx state: installed - name: file copy: content: "ansible.playbook.com" dest: /usr/share/nginx/html/index.html - name: copy nginx copy: src: ./www.ansible.com.conf dest: /etc/nginx/conf.d/www.ansible.com.conf backup: yes notify: Restart Nginx - name: state nginx systemd: name: nginx state: started enabled: yes handlers: - name: Restart Nginx systemd: name: nginx state: restarted
NFS配置文件发生变化重启使用多个handlers
[root@ansible /server/playbook]$ cat 02nfs.yml --- - hosts: 172.16.1.78 tasks: - name: install nfs yum: name: rpcbind,nfs-utils state: installed - name: nfs copy copy: src: ./exports.j2 dest: /etc/exports backup: yes notify: - Restart NFS - Remount NFS - name: mkdir dir file: path: /data-nfs state: directory owner: nfsnobody group: nfsnobody - name: start rpcbind systemd: name: rpcbind state: started enabled: yes - name: start nfs systemd: name: nfs state: started enabled: yes - name: mount mount: src: '172.16.1.78:/data-nfs' path: /mnt fstype: nfs state: mounted handlers: - name: Restart NFS systemd: name: nfs state: restarted - name: Remount NFS mount: src: '172.16.1.78:/data-nfs' path: /mnt fstype: nfs state: remounted