tnblog
首页
视频
资源
登录

Ansible Playbook的用法

5722人阅读 2021/3/25 21:50 总访问:3725156 评论:0 收藏:0 手机
分类: Ansible

ansible

Ansible Playbook的用法

Ansible-galaxy


它可以连接 https://galaxy.ansible.com 下载相应的roles

相关命令

  1. # 列出所有已安装的galaxy
  2. ansible-galaxy list
  3. # 安装galaxy
  4. ansible-galaxy install geerlingguy.redis
  5. # 删除galaxy
  6. ansible-galaxy remove geerlingguy.redis

示例


去该网上下载: https://galaxy.ansible.com/geerlingguy/nginx
然后如下图所示我们找到对应的安装方式
下载完成后我们发现它下载到了:/root/.ansible/roles/geerlingguy.nginx 目录下

  1. # ansible-galaxy install geerlingguy.nginx
  2. Starting galaxy role install process
  3. - downloading role 'nginx', owned by geerlingguy
  4. - downloading role from https://github.com/geerlingguy/ansible-role-nginx/archive/2.8.0.tar.gz
  5. - extracting geerlingguy.nginx to /root/.ansible/roles/geerlingguy.nginx
  6. - geerlingguy.nginx (2.8.0) was installed successfully
  1. # tree /root/.ansible/roles/geerlingguy.nginx
  2. /root/.ansible/roles/geerlingguy.nginx
  3. ├── defaults
  4. └── main.yml
  5. ├── handlers
  6. └── main.yml
  7. ├── LICENSE
  8. ├── meta
  9. └── main.yml
  10. ├── molecule
  11. └── default
  12. ├── converge.yml
  13. └── molecule.yml
  14. ├── README.md
  15. ├── tasks
  16. ├── main.yml
  17. ├── setup-Archlinux.yml
  18. ├── setup-Debian.yml
  19. ├── setup-FreeBSD.yml
  20. ├── setup-OpenBSD.yml
  21. ├── setup-RedHat.yml
  22. ├── setup-Ubuntu.yml
  23. └── vhosts.yml
  24. ├── templates
  25. ├── nginx.conf.j2
  26. ├── nginx.repo.j2
  27. └── vhost.j2
  28. └── vars
  29. ├── Archlinux.yml
  30. ├── Debian.yml
  31. ├── FreeBSD.yml
  32. ├── OpenBSD.yml
  33. └── RedHat.yml

Ansible-pull


推送命令至远程,效率无限提升,对运维要求较高。更多请参考命令(ansible-pull -h

Ansible-playbook


运行Ansible playbooks,在目标主机上执行自定义的任务。
那么我们就需要自定义自己的任务

hello.yml示例

  1. ---
  2. - hosts: webserver
  3. remote_user: root
  4. tasks:
  5. - name: hello
  6. command: hostname


首先开头一般需要三个-,然后其他参数大家可以参考下列列表,为了方便大家编写可以在这上面写:https://www.bejson.com/validators/yaml_editor/

参数 描述
(老版本是:host) hosts 指定执行任务组。这里我们指定的是webserver
remote_user 指远程任务用什么用户执行。
tasks 任务列表
name 任务名称
command 执行的命令


最后我们保存好hello.yaml文件,然后下列命令对其子机执行任务,但并没有显示执行过程。

  1. ansible-playbook hello.yml

Ansible-vault加密工具


管理加密解密yml文件的工具。

示例

  1. # 输入加密hello.yml文件
  2. ansible-vault encrypt hello.yml
  3. # 查看加密文件,我们会发现它是 AES256 进行加密的
  4. cat hello.yml
  5. # 查看原文
  6. ansible-vault view hello.yml
  7. # 编辑加密文件
  8. ansible-vault edit hello.yml
  9. # 修改密码
  10. ansible-vault rekey hello.yml
  11. # 解密hello.yml文件
  12. ansible-vault decrypt hello.yml
  13. # 创建新文件
  14. ansible-vault create hello.yml

Ansible-console交互式命令


可交互式执行命令工具

  1. # 运行该工具
  2. ansible-console
  3. # 我们会看到如下内容
  4. root@all (2)[f:5]$


关于该格式的内容可以做如下解释:
执行用户@当前操作的主机组(当前组的主机数量)[f:并发的数量] $

设置10并发数

  1. forks 10

切换到webserver组

  1. cd webserver

查看该组下的主机地址集合

  1. list

列出所有内置命令

  1. ? help

执行模块

  1. # [模块名] 参数
  2. # 举例
  3. shell ls

YAML介绍


YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他很多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。

Yaml (Ait’t Markup Language),即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:Yet Another Markup Language(仍然是一种标记语言)

特性

  • YAML的可读性好
  • YAML与脚本语言的交互性好
  • YAML使用实现语言的数据类型
  • YAML有一个一致的信息模型
  • YAML易于实现
  • YAML可以基于流来处理
  • YAML表达能力强,扩展性好
    更多请参考: http://www.yaml.org

YAML简介

  • 在单一档案中,可用连续三个连字号(—-)区分多个档案。另外,还有选择性的连续三个点(…)用来表示档案结尾
  • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
  • 使用#号注释代码
  • 缩进必须是统一的,不能空格和tab混用
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
  • YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小的,k/v的值均需大小写敏感
  • k/v的值可同行写也可以换行写。同行使用:分隔
  • v可是个字符串,也可是另一个列表
  • 一个完整的代码块功能需最少元素需包括 name: task
  • 一个name只能包括一个task
  • YAML文件扩展名通常为yml或yaml

Yaml List集合


List: 列表,其所有元素均使用 - 打头
示例:

  1. # A list of tasty fruits
  2. - Apple
  3. - Orange
  4. - Strawberry
  5. - Mango

Yaml Dictionary集合


Dictionary: 字典,通常由多个key与value构成
示例:

  1. ---
  2. # An employee record
  3. name: Example Developer
  4. job: Developer
  5. skill: Elite


也可以将 key:value 放置于{}中进行表示,用逗号(,)分隔多个 key:value
示例:

  1. ---
  2. # An employee record
  3. { name: Example Developer,job: Developer,skill: Elite }


YAML的语法和其他高阶语言类似,并且可用简单表达清单、散列表,标量等数据结构。其(Structure)通过空格来展示,序列(Sequence)里的项用-来代表,Map里的键值对用:分隔
示例:

  1. name: John Smith
  2. age: 41
  3. gender: Male
  4. spouse:
  5. name: Jane Smith
  6. age: 37
  7. gender: Female
  8. children:
  9. - name: Jimmy Smith
  10. age: 17
  11. gender: Male
  12. - name: Bob He
  13. age: 19
  14. gender: Female

Playbook


- playbook是由一个或多个play组成的列表。
- play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏
- Playbook采用Yaml语言编写

原理讲解


1. 首先用户创建很多个play列出一个yaml清单。
2. 然后通过ansible-playbook进行执行先每一个play
3. 每一个play里面又找到多个task任务
4. 然后从task任务中又找到相对应的模块
5. 最后从主机清单中找到需要执行的主机列表
6. 然后通过SSH进行连接
7. 最后在各个主机上执行

核心元素

组件名称 描述
Hosts 执行任务远程主机列表
Tasks 任务集
Varniables 内置变量或自定义变量在playbook中调用
Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
Handlers 与notity结合使用,由特定的条件触发操作,满足条件方才执行,否则不执行
tags 标签指定某任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间以然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片段(ansible-playbook -t tagsname useradd.yml)

Hosts


playbook中的每一个play的目的都是为了让某个或某些主机指定的用户身份执行任务。host用于指定要执行任务的主机,须事先定义在主机清单中

可以是如下形式:
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*
webserver:dbserver 两个组的并集
webserver:&dbserver 两个组的交集
webserver:!phoenix 在webserver组,但不在dbserver组

  1. # 示例
  2. - hosts: webserver:dbserver

示例


我们将原有的httpd停掉,然后将其卸载,最后我们将在本地进行安装一个httpd然后对index.html做出一定的修改,进行分发到不同的主机上。

  1. # 停止该服务
  2. ansible all -m shell -a 'systemctl stop httpd'
  3. # 卸载软件
  4. ansible all -m yum -a 'name=httpd state=absent'
  5. # 在本机安装httpd
  6. yum install httpd
  7. # 创建/var/www/html/index.html
  8. echo 'aidasi apache' > /var/www/html/index.html


创建file.yaml文件,添加如下任务将会进行创建/data/newfile文件方法,创建创建test2用户方法,并安装httpd应用等功能方法

  1. ---
  2. - hosts: webserver
  3. remote_user: root
  4. tasks:
  5. - name: 创建文件
  6. file: name=/data/newfile state=touch
  7. - name: 创建test2用户
  8. user: name=test2 system=yes shell=/sbin/nologin
  9. - name: 安装httpd
  10. yum: name=httpd
  11. - name: 复制网页
  12. copy: src=/var/www/html/index.html dest=/var/www/html
  13. - name: 启动服务
  14. service: name=httpd state=started enabled=yes


我们先测试一下我们等yaml有没有问题,然后再进行执行。

  1. # 测试yaml执行
  2. ansible-playbook -C file.yaml
  3. # 执行yaml
  4. ansible-playbook file.yaml


最后我们到实体机上测试任务是否全部完成。

  1. ansible all -a 'ls /data'
  2. ansible all -a 'getent passwd test2'
  3. ansible all -a 'ss -lp src :80'
  4. # 或
  5. ansible all -m shell -a 'ss -tln|grep :80'

Remote_user


可用于Host和task中。也可以通过指定其通过sudo的方式主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户

  1. ---
  2. - hosts: webserver
  3. remote_user: root
  4. tasks:
  5. - name: test connection
  6. ping:
  7. remote_user: aidasi # 远程连接的用户
  8. sudo: yes # 默认为root
  9. sudo_user: testuser # sudo为testuser

task列表和action


play的主体部分是task list。task list 中各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再完成第二个。在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可。

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是冥等的,这意味着多次执行是安全的,因为其结果均一致

每个task都应该有其name,用于playbook的执行输出,建议其内容尽可能的清晰的描述任务执行步骤。如果未提供name,则action的结果将用于输出

关于中途任务执行报错的解决方案


如果命令或脚本的退出码不为零,可以使用如下方式替代。

  1. task:
  2. - name: xxxxx
  3. shell: 你的命令 || /bin/true


或者使用ignore_errors来忽略错误信息。

  1. task:
  2. - name: xxxxx
  3. shell: 你的命令
  4. ignore_errors: True

运行playbook


运行playbook的方式

  1. ansible-playbook <filename.yaml> [options]


常见选项

参数 描述
--check 只检测可能发生的改变,但不真正执行操作
--list-hosts 列出运行任务但主机
--limit 主机列表 只针对主机列表中但主机执行
-v 显示过程,-vv-vvv更加详细


示例

  1. ansible-playbook file.yaml --check #只检测
  2. ansible-playbook file.yaml
  3. ansible-playbook file.yaml --limit webserver #只执行webserver组下面的
  4. ansible-playbook file.yaml --list-tags # 查看标记

handlers和notify结合使用触发条件

Handlers


是task列表,这些task与前述的task并没有本质上的不同,用于当前关注的支援发生变化时,才会采取一定的操作。

Notify


Notify此action可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成最后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。

示例


当我们对index.html的内容做了一些修改的时候,或者我们对阿帕奇服务器的配置文件做出一些调整的时候,我就需要重启一下服务,那么我们可以在复制完网页后执行重启事件。如果我们在重启后还需要对其中的内容进行查看我们还可以添加一个事件

  1. ---
  2. - hosts: webserver
  3. remote_user: root
  4. tasks:
  5. - name: 安装httpd
  6. yum: name=httpd
  7. - name: 复制网页
  8. copy: src=/var/www/html/index.html dest=/var/www/html backup=yes
  9. notify: restart service
  10. - name: 启动服务
  11. service: name=httpd state=started enabled=yes
  12. handlers:
  13. - name: restart service
  14. service: name=httpd state=restarted
  1. ---
  2. - hosts: webserver
  3. remote_user: root
  4. tasks:
  5. - name: 安装httpd
  6. yum: name=httpd
  7. - name: 复制网页
  8. copy: src=/var/www/html/index.html dest=/var/www/html backup=yes
  9. notify:
  10. - restart service
  11. - view content
  12. - name: 启动服务
  13. service: name=httpd state=started enabled=yes
  14. handlers:
  15. - name: restart service
  16. service: name=httpd state=restarted
  17. - name: view content
  18. shell: cat /var/www/html/index.html

Tags的应用


在每个action上标记tags后,可以只执行其中的一个或多个标记上的action。

示例


这里我们在安装httpd包设置inshttpd标签,复制网页并重启我们也设置 thrshttpd 标签,然后我们只需要执行这两个标签时就可以通过下面的命令进行执行。

  1. ---
  2. - hosts: webserver
  3. remote_user: root
  4. tasks:
  5. - name: 安装httpd
  6. yum: name=httpd
  7. tags: inshttpd
  8. - name: 复制网页
  9. copy: src=/var/www/html/index.html dest=/var/www/html backup=yes
  10. notify:
  11. - restart service
  12. - view content
  13. tags: thrshttpd
  14. - name: 启动服务
  15. service: name=httpd state=started enabled=yes
  16. handlers:
  17. - name: restart service
  18. service: name=httpd state=restarted
  19. - name: view content
  20. shell: cat /var/www/html/index.html
  1. # t 参数
  2. ansible-playbook -t inshttpd,thrshttpd file2.yaml


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Ansible Playbook的用法(变量与template)

Ansible Playbook的用法(变量与template)[TOC] 使用变量变量名:仅能由字母、数字和下划线组成,且只能以字母开头。我们...

C ?、?? 问号和2个问号的用法(类型?、对象?)

C# ?C# ???:单问号1.定义数据类型可为空。可用于对int,double,bool等无法直接赋值为null的数据类型进行null的赋值如这...

C out、ref关键字的用法和区别

说说自己对out、ref的认识,面试问到的几率很高哟。out:classProgram { /* *out、ref都是引用传递,传递后使用都会改变...

Action与Func的用法-----委托

Action:运用于没有返回值有参可以进行在方法里面进行有参传值。 3.实例Func:1.主要运用于有参有返回值Action于Funcye通过...

js !!,js两个感叹号的用法

可以为了巧妙的实现为空验证,比较简洁的实现可以直接判断if(a!=null&amp;&amp;typeof(a)!=undefined&amp;&amp;a!=&#39;&#3...

c winform treeview最最基础的用法

最基本的添加与添加子节点publicpartialclassForm2:Form { publicForm2() { InitializeComponent(); //最基本的添加...

OfType的用法

主要用于将SelectedObjects转换为list集合。(也就是将多条数据从views转换为list集合) 示例: planList=lvplan.SelectedOb...

GetObject的用法

为了保证是同一个会话,只是一个字符串类型的不用使用getobject。对于对象使用getobject保证是同一个会话,不然要报错 (主...

几种函数的用法

前言:各位老铁们好,今天给大家分享几种函数的用法。欢迎大家一起讨论 如有说错的地方还请各位大佬指教。正文:decode函数的...

三种Collectors的用法(排序)

原文链接:https://blog.csdn.net/qq_37253891/article/details/108488919java8 stream().map().collect()的Collectors.toL...

ABP 里高德地图的用法、Get请求

依赖包usingAbp.Authorization; usingAbp.UI; usingNewtonsoft.Json; usingNewtonsoft.Json.Linq; usingSystem.IO; us...

Edge 浏览器安装vue.js devtools 流程在vscode的用法

https://www.cnblogs.com/ypyp123/p/16494547.html

vuex的用法介绍

Vuex是一个专门为Vue.js设计的状态管理库,它可以帮助我们更好地管理Vue.js应用程序中的状态。Vuex的主要概念包括:state(...

.NET6 .Net Core 中使用 HttpClient。HttpClient注入基础配置的用法

[TOC]先注入string token=&quot;eyJhbGciOiJSUzI1NiIsImt你的token&quot;; builder.Services.AddHttpClient(&quot;educa...
这一世以无限游戏为使命!
排名
2
文章
662
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术