Ansible-playbook剧本

发布于:2024-05-09 ⋅ 阅读:(32) ⋅ 点赞:(0)

目录

一、Ansible playbook简介

2.1 playbook格式

2.2 playbook组成部分

二、playbook示例

2.1 yaml文件编写

2.2 运行playbook

2.3 定义、引用变量

2.4 指定远程主机sudo切换用户

2.5 when条件判断

2.6 迭代

三、总结

Ansible中使用playbook脚本的作用和好处


一、Ansible playbook简介

playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的

2.1 playbook格式

playbook由YAML语言编写。YAML语言参考了其他多种语言,包括:XML、C语言、Python、Perl等。MAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。以下为playbook常用到的YAML格式。

YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。就像这样- host。
同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。
playbook中hosts,variables,roles,tasks等对象的表示方法都是键值中间以”:”分隔,”:”后面还要增加一个空格。
剧本以.yml后缀
yaml语法

2.2 playbook组成部分

  • Tasks:任务,即通过task调用ansible的模板将多个操作组织在一个playbook中运行
  • Variables:变量
  • Templates:模板
  • Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
  • Roles:角色

二、playbook示例

2.1 yaml文件编写

vim test1.yaml
   #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first play     #定义一个play的名称,可省略
  gather_facts: false    #设置不进行facts信息收集,这可以加快执行速度,可省略
  hosts: webservers    #指定要执行任务的被管理主机组,如多个主机组用冒号分隔
  remote_user: root    #指定被管理主机上执行任务的用户
  tasks:     #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
   - name: test connection    #自定义任务名称
     ping:     #使用 module: [options] 格式来定义一个任务
   - name: disable selinux
     command: '/sbin/setenforce 0'    #command模块和shell模块无需使用key=value格式
     ignore_errors: True     #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务
   - name: disable firewalld
     service: name=firewalld state=stopped    #使用 module: options 格式来定义任务,option使用key=value格式
   - name: install httpd
     yum: name=httpd state=latest
   - name: install configuration file for httpd
     copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf    #这里需要一个事先准备好的/opt/httpd.conf文件
     notify: "restart httpd"    #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
   - name: start httpd service
     service: enabled=true name=httpd state=started
  handlers:     #handlers中定义的就是任务,此处handlers中的任务使用的是service模块
   - name: restart httpd    #notify和handlers中任务的名称必须一致
     service: name=httpd state=restarted

Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。

2.2 运行playbook

ansible-playbook test1.yaml
//补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
ansible-playbook test1.yaml --syntax-check    #检查yaml文件的语法是否正确
ansible-playbook test1.yaml --list-task       #检查tasks任务
ansible-playbook test1.yaml --list-hosts      #检查生效的主机
ansible-playbook test1.yaml --start-at-task='install httpd'     #指定从某个task开始运行

出现报错:

 解决方法:

在opt目录下上传http.conf文件

2.3 定义、引用变量

vim test2.yaml

- name: second play
  hosts: webservers
  remote_user: root
  vars:                 #定义变量
   - groupname: mysql   #格式为 key: value
   - username: nginx
  tasks:
   - name: create group
     group: name={{groupname}} system=yes gid=306    #使用 {{key}} 引用变量的值
   - name: create user
     user: name={{username}} uid=306 group={{groupname}} 
   - name: copy file
     copy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt    #在setup模块中可以获取facts变量信息

ansible-playbook test2.yaml -e "username=nginx"     #在命令行里定义变量

出现报错: 

解决方法:

uid号重复,修改uid号

到被管理的主机上查看用户信息:

2.4 指定远程主机sudo切换用户

- hosts: webservers
  remote_user: zhangsan            
  become: yes                     #2.6版本以后的参数,之前是sudo,意思为切换用户运行
  become_user: root              #指定sudo用户为root
执行playbook时:ansible-playbook test1.yml -K <密码>

2.5 when条件判断

在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。

when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务

vim test3.yaml
- hosts: webservers
  remote_user: root
  tasks:
   - name: shutdown host 
     command: /sbin/shutdown -r now
     when: ansible_default_ipv4.address == "192.168.10.10"   #when指令中的变量名不需要手动加上 {{}}
或 
     when: inventory_hostname == "<主机名>"

ansible-playbook test3.yaml

报错原因:

当ansible检测到192.168.10.10的IP地址后,when条件返回true,执行/sbin/shutdown关机命令,导致ssh无法连接到192.168.10.10的主机,形成报错。

2.6 迭代

Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于loop循环。

(以下代码需提前在webservers里的主机上创建好目录/opt/txy)

vim test4.yaml

- name: test4
   hosts: webservers
   tasks:
    - name: create directories
      file: path={{item}} state=touch
      with_items:
        - /opt/txy/txy1.txt
        - /opt/txy/txy2.txt
        - /opt/txy/txy3.txt
        - /opt/txy/txy4.txt

ansible-playbook test4.yaml

三、总结

Ansible中使用playbook脚本的作用和好处

Ansible 的 playbook 是一种从简单到复杂的自动化脚本,用于管理配置、部署应用程序以及执行IT任务。它们使用YAML(一种人类可读的数据序列化标准)格式编写,使得它们既易于理解也易于使用。下面列出了使用 Ansible playbook 的一些主要作用和好处:

  1. 自动化和标准化配置管理:Playbook 可以自动配置系统和应用程序,确保在多个环境中一致性地部署配置。

  2. 简化复杂任务:可以在 playbook 中定义一系列任务,自动化复杂的流程,如多步骤的部署过程。

  3. 幂等性:Playbook 的设计确保了幂等性,即无论运行多少次,只要环境未改变,结果都保持一致,这对于避免在生产环境中造成意外非常重要。

  4. 跨平台支持:Ansible 支持多种操作系统和平台,你可以使用相同的 playbook 在不同系统上执行任务。

  5. 易于维护和扩展:因为 playbook 使用 YAML 编写,它们易于阅读和修改。你可以轻松更新配置或调整任务流程。

  6. 无代理架构:Ansible 使用 SSH 连接目标机器,无需在远端安装额外的代理,简化了管理工作并降低了系统开销。

  7. 安全性:利用 SSH 进行通信意味着你的自动化任务是在安全的通道中执行的。

  8. 可复用性:可以创建可以在多个项目和环境中重用的通用 playbook。

  9. 社区支持:Ansible 有一个活跃的社区和大量可用的现成 playbook,可以减少从头开始编写代码的需要。

通过这些特性,Ansible playbook 使得IT自动化变得更加简单、高效和可靠。这对于管理大规模的基础设施和应用程序尤其有价值。