首页 > 其他分享 >第三十七天:Ansible playbook基础

第三十七天:Ansible playbook基础

时间:2024-03-26 20:22:06浏览次数:19  
标签:httpd task name ansible YAML Ansible 第三十七 playbook

一、 playbook介绍 1、Playbook 组成   一个 playbook(剧本)文件是一个YAML语言编写的文本文件   通常一个playbook只包括一个play   一个 play的主要包括两部分: 主机和tasks. 即实现在指定一组主机上执行一个tasks定义好的任务列表。   一个tasks中可以有一个或多个task任务   每一个Task本质上就是调用ansible的一个module   在复杂场景中,一个playbook中也可以包括多个play,实现对多组不同的主机执行不同的任务 2、Playbook 与 Ad-Hoc 对比 Playbook是对多个 AD-Hoc 的一种编排组合的实现方式 Playbook能控制任务执行的先后顺序 Playbook可以持久保存到文件中从而方便多次调用运行,而Ad-Hoc只能临时运行。 Playbook适合复杂的重复性的任务,而Ad-Hoc适合做快速简单的一次性任务 二、YAML 语言 1、YAML 语言介绍 YAML:YAML Ain't Markup Language,即YAML不是标记语言。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言) YAML是一个可读性高的用来表达资料序列的格式。 YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。 Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者 目前很多最新的软件比较流行采用此格式的文件存放配置信息,如:ubuntu,anisble,docker,kubernetes等 YAML 官方网站:

http://www.yaml.org

2、YAML 语言特性

YAML的可读性好 YAML和脚本语言的交互性好 YAML使用实现语言的数据类型 YAML有一个一致的信息模型 YAML易于实现 YAML可以基于流来处理 YAML表达能力强,扩展性好 3、YAML语法简介 在单一文件第一行,用连续三个连字号"-" 开始,还有选择性的连续三个点号( ... )用来表示文件的结尾 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能 使用#号注释代码 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的 缩进不支持tab,必须使用空格进行缩进 缩进的空格数不重要,只要相同层级的元素左对齐即可 YAML文件内容是区别大小写的,key/value的值均需大小写敏感 多个key/value可同行写也可换行写,同行使用,分隔 key后面冒号要加一个空格 比如: key: value value可是个字符串,也可是另一个列表 YAML文件扩展名通常为yml或yaml 4、支持的数据类型 YAML 支持以下常用几种数据类型:   标量:单个的、不可再分的值   对象:键值对的集合,又称为: 字典(dictionary)/ 哈希(hashes) / 映射(mapping)   数组:一组按次序排列的值,又称为: 列表(list)/ 序列(sequence) (1)scalar 标量   key对应value
name: wang
age: 18
  使用缩进的方式
name: 
 wang
age:
 18

(2)Dictionary 字典

一个字典是由一个或多个key与value构成 key和value之间用冒号 :分隔 冒号 : 后面有一个空格 所有 k/v 可以放在一行,,每个 k/v 之间用逗号分隔 所有每个 k/v 也可以分别放在不同行,一对k/v放在独立的一行 格式
account: { name: wang, age: 30 }
使用缩进方式
account: 
 name: wang
 age: 18

(3)List 列表

列表由多个元素组成 每个元素放在不同行,每个元素一行,且元素前均使用中横线 - 开头,并且中横线 - 和元素之间有一个空格 也可以将所有元素用 [ ] 括起来放在同一行,每个元素之间用逗号分隔 格式
course: [ linux , golang , python ]
也可以写成以 - 开头的多行
 - linux
 - golang
 - pytho

5、三种常见的数据格式

XML:Extensible Markup Language,可扩展标记语言,可用于数据交换和配置 JSON:JavaScript Object Notation, JavaScript 对象表记法,主要用来数据交换或配置,不支持注释 YAML:YAML Ain't Markup Language YAML 不是一种标记语言, 主要用来配置,大小写敏感,不支持tab

 

可以用工具互相转换,参考网站: https://www.json2yaml.com/ http://www.bejson.com/json/json2yaml/   三、Playbook 核心组件   官方文档
https://docs.ansible.com/ansible/latest/reference_appendices/playbooks_keywords.
html#playbook-keywords
一个playbook 中由多个组件组成,其中所用到的常见组件类型如下: Hosts 执行的远程主机列表 Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括 name 和 task,一个name只能包括一个task Variables 内置变量或自定义变量在playbook中调用 Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件 Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行 tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断  1、hosts 组件 Hosts:playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts 用于指定要执行指定任务的主机,须事先定义在主机清单中 
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*
Websrvs:dbsrvs     #或者,两个组的并集
Websrvs:&dbsrvs   #与,两个组的交集
webservers:!dbsrvs  #在websrvs组,但不在dbsrvs组

2、remote_user 组件

remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户 
- hosts: websrvs
 remote_user: root
  
 tasks:
   - name: test connection
     ping:
     remote_user: magedu
     sudo: yes #默认sudo为root
     sudo_user:wang    #sudo为wang

3、task列表和action组件

play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致 每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。 如果未提供name,则action的结果将用于输出 task两种格式: 
action: module arguments  #示例: action: shell wall hello 
module: arguments   #建议使用 #示例: shell: wall hello
注意:shell和command模块后面跟命令,而非key=value 4、其它组件说明 某任务的状态在运行后为changed时,可通过"notify"通知给相应的handlers任务 还可以通过"tags"给task 打标签,可在ansible-playbook命令上使用-t指定进行调用 四、playbook 命令 格式
ansible-playbook <filename.yml> ... [options]
常见选项
--syntax,--syntax-check      #语法检查,功能相当于bash -n 
-C --check #模拟执行dry run ,只检测可能会发生的改变,但不真正执行操作
--list-hosts    #列出运行任务的主机
--list-tags #列出tag
--list-tasks #列出task
--limit 主机列表 #只针对主机列表中的特定主机执行
-i INVENTORY, --inventory INVENTORY  #指定主机清单文件,通常一个项对应一个主机清单文件
--start-at-task START_AT_TASK #从指定task开始执行,而非从头开始,START_AT_TASK为任务的
name
-v -vv  -vvv #显示过程

五、Playbook 案例

1、利用 playbook 创建 mysql 用户
---
- hosts: dbsrvs
 remote_user: root
 gather_facts: no
 tasks:
   - {name: create group, group: name=mysql system=yes gid=306}
   - name: create user
     user: name=mysql shell=/sbin/nologin system=yes group=mysql uid=306 
home=/data/mysql create_home=no  

2、利用 playbook 安装 nginx

---
# install nginx 
- hosts: websrvs
 remote_user: root 
 gather_facts: no
 tasks:
    - name: add group nginx
     group: name=nginx state=present
    - name: add user nginx
     user: name=nginx state=present group=nginx
    - name: Install Nginx
     yum: name=nginx state=present
    - name: web page
     copy: src=files/index.html dest=/usr/share/nginx/html/index.html
    - name: Start Nginx
      service: name=nginx state=started enabled=yes

3、利用 playbook 安装和卸载 httpd

[root@centos8 ansible]#cat install_httpd.yml 
---
#install httpd
- hosts: websrvs
 remote_user: root
 gather_facts: no
 tasks:
    - name: Instal1 httpd
     yum: name=httpd
    - name: Modify config list port
     lineinfile: 
       path: /etc/httpd/conf/httpd.conf 
       regexp: '^Listen'
       line: 'Listen 8080'
    - name: Modify config data1
     lineinfile: 
       path: /etc/httpd/conf/httpd.conf 
       regexp: '^DocumentRoot "/var/www/html"'
       line: 'DocumentRoot "/data/html"'
    - name: Modify config data2
     lineinfile: 
       path: /etc/httpd/conf/httpd.conf 
       regexp: '^<Directory "/var/www/html">'
       line: '<Directory "/data/html">'
    - name: Mkdir website dir
     file: path=/data/html state=directory
    - name: Web html
     copy: src=files/index.html dest=/data/html/
    - name: Start service
      service: name=httpd state=started enabled=yes
ansible-playbook   install_httpd.yml --limit 10.0.0.8

4、忽略错误 ignore_errors

如果一个task出错,默认将不会继续执行后续的其它task 利用 ignore_errors: yes 可以忽略此task的错误,继续向下执行playbook其它task  
[root@ansible ansible]#cat test_ignore.yml
---
- hosts: websrvs
  
 tasks:
   - name: error
     command: /bin/false
     ignore_errors: yes
   - name: continue
     command: wall continue

5、Playbook中使用handlers和notify

(1)handlers和notify Handlers本质是task list ,类似于MySQL中的触发器触发的行为,其中的task与前述的task并没有本质上的不同,只有在关注的资源发生变化时,才会采取一定的操作。 Notify对应的action 在所有task都执行完才会最后被触发,这样可避免多个task多次改变发生时每次都触发执行指定的操作,Handlers仅在所有的变化发生完成后一次性地执行指定操作。 在notify中列出的操作称为handler,也即notify中调用handler中定义的操作 注意: 如果多个task通知了相同的handlers, 此handlers仅会在所有task结束后运行一 次。 只有notify对应的task发生改变了才会通知handlers, 没有改变则不会触发handlers handlers 是在所有前面的tasks都成功执行才会执行,如果前面任何一个task失败,会导致handler跳过执行  (2)force_handlers  如果不论前面的task成功与否,都希望handlers能执行, 可以使用force_handlers: yes 强制执行handler 范例: 强制调用handlers
- hosts: websrvs
 force_handlers: yes #无论task中的任何一个task失败,仍强制调用handlers
 tasks:
    - name: config file
     copy: src=nginx.conf  dest=/etc/nginx/nginx.conf
     notify: restart nginx
    - name: install package
     yum: name=no_exist_package
 handlers:
    - name: restart nginx
      service: name=nginx state=restarted

六、Playbook中使用tags组件

默认情况下, Ansible 在执行一个 playbook 时,会执行 playbook 中所有的任务 在playbook文件中,可以利用tags组件,为特定 task 指定标签,当在执行playbook时,可以只执行特定tags的task,而非整个playbook文件 可以一个task对应多个tag,也可以多个task对应同一个tag 还有另外3个特殊关键字用于标签, tagged, untagged 和 all,它们分别是仅运行已标记,只有未标记和所有任务。 tags 主要用于调试环境
vim httpd.yml
---
# tags example
- hosts: websrvs
 remote_user: root
 gather_facts: no
  
 tasks:
    - name: Install httpd
     yum: name=httpd state=present
    - name: Install configure file
     copy: src=files/httpd.conf dest=/etc/httpd/conf/
     tags: [ conf,file ] #写在一行
        - conf    #写成多行
        - file
    - name: start httpd service
     tags: service
      service: name=httpd state=started enabled=yes
#列出标签
[root@ansible ~]#ansible-playbook --list-tags httpd.yml
#执行有指定标签的任务
[root@ansible ~]#ansible-playbook -t conf,service httpd.yml
#忽略执行指定标签的task
[root@ansible ~]#ansible-playbook --skip-tags conf httpd.yml
#忽略执行没有标签的任务,即只执行有标签的任务
[root@ansible ~]#ansible-playbook   httpd.yml --skip-tags untagged

 

标签:httpd,task,name,ansible,YAML,Ansible,第三十七,playbook
From: https://www.cnblogs.com/dujy/p/18071491

相关文章

  • Linux架构26 playbook实战, 安装数据库, 网站迁移, ansible变量
    Ansibleplaybook实战1.基础准备#1.安装ansible[root@m01~]#yuminstall-yansible#2.配置ansible[root@m01~]#vim/etc/ansible/ansible.cfghost_key_checking=False#这个解开注释#3.配置主机清单[root@m01~]#vim/etc/ansible/hosts[web_group]we......
  • ceph:在centos7 上通过 ceph-ansible 安装ceph 14
    安装本质上就是熟悉ceph-ansible工具的各种配置关系:哪些时必须的?默认值来自哪里?各种配置分散在哪些配置文件内?...../site.yml./group_vars/all.yml  ./group_vars/其他各种组件特定的.yml  注意:all.yml里的配置很大部分时依赖于site.yml的配置的。根据需要进行配置。 ......
  • ansible-role角色
    ansible-role角色官网文档https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.htmlansible-role的实际理念为什么要用role把单个的大剧本,拆分为小剧本,便于维护,修改、使用完成解耦、结构更清晰、调试更方便如果是小部署,还是剧本更方便大型项......
  • PlayBook 详解
    4)Playbook4.1)Playbook介绍PlayBook与ad-hoc相比,是一种完全不同的运用Ansible的方式,类似与Saltstack的state状态文件。ad-hoc无法持久使用,PlayBook可以持久使用。PlayBook剧本是由一个或多个"Play"组成的列表Play的主要功能在于将预定义的一组主机,装扮成事先......
  • 第三十六天:Ansible安装和常见问题
    一、自动化运维应用场景1、运维职业发展路线2、企业实际应用场景分析DEV开始环境-》测试环境-》预发布环境-》发布环境-》生产环境-》灰度环境3、常见自动化运维工具Ansible:python,Agentless,中小型应用环境Saltstack:python,一般需部署agent,执行效率更高Puppet:ruby,功能强......
  • Ansible
    1.Ansible发展作者:MichaelDeHaan(Cobblerpxekikstar与Func作者)ansible的名称来自科幻小说《安德的游戏》中跨越时空的即时通信工具,使用它可以在相距数光年的距离,远程实时控制前线的舰队战斗2012-03-09,发布0.0.1版,2015-10-17,RedHat宣布1.5亿美元收购。官网:https://ww......
  • 运维自动化-Ansible
    关于运维自动化相关工具:代码管理(SCM):GitHub、GitLab、BitBucket、SubVersion构建工具:maven、Ant、Gradle自动部署:Capistrano、CodeDeploy持续集成(CI):Jenkins、Travis配置管理:Ansible、SaltStack、Chef、Puppet容器:Docker、Podman、LXC、第三方厂商如AWS编排:Kube......
  • 【ansible】ansible的介绍和安装
    前言运维自动化云计算核心职能搭建平台架构日常运营保障性能效率优化相关工具代码管理(SCM):GitHub、GitLab、BitBucket、SubVersion构建工具:maven、Ant、Gradle自动部署:Capistrano、CodeDeploy持续集成(CI):Jenkins、Travis配置管理:Ansible、SaltStack、Chef、P......
  • Ansible报错:Failed to parse /etc/ansible/hosts with yaml plugin
    早上接到同事反馈说Grafana某个监控图表点击后反应很慢,其他的图表都正常,只有这一张图表很慢。经过和大数据部门同事的沟通,发现应该是从大数据系统推送出来的数据有点问题,需要联合Grafana机器进行调试,询问我Grafana部署在哪台机器上。由于公司不同区域都有一套Prometheus+Grafana......
  • 在Linux中,ansible可以解决哪些问题?
    Ansible是一款强大的IT自动化工具,主要用于解决运维过程中面临的诸多挑战,特别适合批量管理和配置大量服务器。以下是Ansible可以帮助解决的一些典型问题:配置管理和标准化:Ansible能够通过Playbook(剧本)的形式编写和组织配置任务,确保在多个服务器上实现一致的系统配置,包括但不限......