官方文档:https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_intro.html
📜1. 什么是playbook 中文名:剧本,它是一个自动化处理脚本。 Playbook采用YAML语言编写。
📜2. playbook演示 以下做个简单的操作演示,编写好主机清单后再进行剧本的编写。
(所以说嘛,基础很重要,如果不记得主机清单https://blog.csdn.net/qq_41765918/article/details/121676991 和配置文件https://blog.csdn.net/qq_41765918/article/details/121706648 是如何运用的,快快去学习。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [student@servera ~ ]$ cat hosts servera [student@servera ~ ]$ cat webserver.yml --- - name: play to setup web server hosts: servera remote_user: root become: yes become_method: sudo tasks: - name: latest httpd version install yum: name: httpd state: latest [student@servera ~ ]$ ansible-playbook -i hosts webserver.yml PLAY [play to setup web server ] ********************************************************* TASK [Gathering Facts ] ****************************************************************** ok: [servera ]TASK [latest httpd version install ]****************************************************** changed: [servera ]PLAY RECAP ****************************************************************************** servera : ok=2 changed=1 unreachable=0 failed=0
📜3. Playbook工作流程
playbook 剧本是由一个或多个”play”组成的列表
play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task 实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起 来,按事先编排的机制执行预定义的动作。
Playbook 文件是采用YAML语言编写的
(就正如图片小人书,剧本都是由我们根据特定需求编写好的“脚本”,此“脚本”运用各种模块通过作用于特定的主机清单而达到需求。)
📜4. YAML语法简介 这里只涉及到playbook相关的语法(更多请参考官网http://www.yaml.org)。
语法非常严格,请仔细仔细再仔细。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 在单一档案中,可用连续三个连字号(---)区分多个档案。另外,还有选择性的连续三个点号( ... )用来表示档案结尾 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能 • 使用#号注释代码 • 缩进必须是统一的,不能空格和tab混用,一般缩进2个空格(可以改造tab为缩进) • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的 • YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,key/value的值均需大小写敏感 • key/value的值可以写在同一行,也可换行写。同一行使用 , 逗号分隔 • value可是个字符串,也可是另一个列表 • 一个完整的代码块功能需最少元素需包括 name和task • 一个name只能包括一个task • 使用 | 和 > 来分隔多行,实际上这只是一行。 include_newlines: | exactly as you see will appear these three lines of poetry ignore_newlines: > this is really a single line of text despite appearances • Yaml中不允许在双引号中出现转义符号,所以都是以单引号来避免转义符错误 • YAML文件扩展名通常为yml或yaml
很多刚学习的同学,往往运行报错就挂在语法上,后续可通过不断的练习来理解。
(语法基础真的很重要,别说了你又不听,听了你又不懂,懂了你又不做,做了你又做错,错了你又不认,认了你又不改,改了你又不服。)
📑List:列表 其所有元素均使用”-“打头
📑Dictionary:字典(键值对) 通常由多个key与value构成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 多行写法: name: hunk blog: "xxxxx" name:空格hunk > 这个冒号后面必须是一个空格 同一行写法: 需要使用{ } {name: hunk , blog: "xxxxxx" } > 逗号后建议使用留一个空格 布尔值的表示法: yes /no true /false create_key: yes needs_agent: no knows_oop: True likes_emacs: TRUE uses_cvs: false
📜5. Playbook核心元素 📑name 可选配置项,可有助于记录playbook的运行说明。
📑hosts hosts 行的内容是一个或多个组或主机的 patterns,以逗号为分隔符。通常是/etc/ansible/hosts定义的主机列表
remote_user 就是远程执行任务的账户名:
1 2 3 --- - hosts: web,dns remote_user: root
📑tasks 任务集
1 2 3 4 5 6 7 tasks: - name: install httpd yum: name: httpd - name: start httpd service: name=httpd state=started
📜6. 改造vi中tab键功能 为了能更加轻松的编辑playbook,可设置在vi编辑yaml文件时,按下tab键会进行一个双空格缩进。
在 $HOME/.vimrc 添加以下内容
1 autocmd FileType yaml setlocal ai ts=2 sw=2 et
参数解释:
1 2 3 4 set ai # 自动缩进 set ts=2 # tabstop,表示按一个tab之后,显示出来的相当于几个空格,默认的是8个。 set sw=2 # shiftwidth,表示每一级缩进的长度 set et # expandtab,将tab转成空格,缩进用空格来表示
(别问我为什么要改写,因为当你见到别人噼里啪啦地敲完键盘写好playbook时,你可能还在默念按了多少个空格。>.<)
📜7. playbook书写风格 以下书写例子中,就是shorthand格式,比较旧的书写方法:
1 2 - name: copy new yum config to host copy: src=/etc/yum.repos.d/ dest=/etc/yum.repos.d/
普遍的yaml格式书写:
1 2 3 4 - name: copy new yum config to host copy: src: /etc/yum.repos.d/ dest: /etc/yum.repos.d/
基本都是使用新的写法,便于阅读和排错。
📜8. playbook执行 检测语法:ansible-playbook –syntax-check webserver.yml
模拟执行:ansible-playbook -C webserver.yml
真实执行:ansible-playbook webserver.yml
1 2 3 4 5 执行的详细程度: -v :显示任务结果。 -vv :任务结果和任务配置都会显示 -vvv :包含关于与受管主机连接的信息 -vvvv:增加了连接插件相关的额外详细程度选项,包括受管主机上用于执行脚本的用户,以及所执行的脚本
📜9. 练习演示—-如何编写playbook 📑设置tab键缩进 1 2 [student@servera ~]$ cat .vimrc autocmd FileType yaml setlocal ai ts=2 sw=2 et
📑查看配置文件和主机清单 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [student@servera ~]$ mkdir playbook [student@servera playbook]$ cat ansible.cfg [defaults] inventory=inventory remote_user=student [privilege_escalation] become=True become_method=sudo become_user=root become_ask_pass=False [student@servera playbook]$ cat inventory [web] serverc serverd
📑编写所需要的剧本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [student@servera playbook ]$ cat site.yml --- - name: Install and start Aapche HTTPD hosts: web tasks: - name: httpd package is present yum: name: httpd state: present - name: correct index.html is present copy: content: "This is a test page.\n" dest: /var/www/html/index.html - name: httpd is started service: name: httpd state: started enabled: true
📑语法检查 1 2 3 [student@servera playbook]$ ansible-playbook --syntax-check site.yml playbook: site.yml
运行剧本前进行语法检查是一个良好习惯。
📑执行剧本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [student@servera playbook]$ ansible-playbook site.yml PLAY [Install and start Aapche HTTPD] *************************************************** TASK [Gathering Facts] ****************************************************************** ok: [serverc] ok: [serverd] TASK [httpd package is present] ********************************************************* changed: [serverd] changed: [serverc] TASK [correct index.html is present] **************************************************** changed: [serverc] changed: [serverd] TASK [httpd is started] ***************************************************************** changed: [serverc] changed: [serverd] PLAY RECAP ****************************************************************************** serverc : ok=4 changed=3 unreachable=0 failed=0 serverd : ok=4 changed=3 unreachable=0 failed=0
📑幂等性 幂等性这一概念源于数学,原意是指一个操作如果连续执行多次所产生的结果与仅执行一次的效果相同,那么我们就称这个操作是幂等的。
1 2 [student@servera playbook]$ ansible-playbook site.yml …………
此为Ansible重要特性之一,用练习演示更容易进行理解。
📑结果访问检查 1 2 3 4 [student@servera playbook]$ curl serverc This is a test page. [student@servera playbook]$ curl serverd This is a test page.
📜10. playbook提权 可以写在剧本中,与hosts,tasks同级
1 2 3 4 5 6 7 8 - hosts: all become: true become_method: sudo become_user: root tasks: - debug: msg: "Test"
当然,不在剧本上编写,在配置文件上编写也可以,如果两个地方都进行编写,在剧本中的优先级会比配置文件上的高,例如:配置文件上启动提权become: yes,但剧本上配置了become: no,最终生效为剧本上的配置。
📜11. 善于模块文档 ansible-doc -l 查看列表
ansible-doc modulename 查看模块帮助文件
(上一篇文章总结处https://blog.csdn.net/qq_41765918/article/details/121722471 提及,查看帮助真的很重要~~)
📜12. 练习演示—-执行多个playbook 📑查看配置文件和主机清单 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [student@servera ~]$ mkdir playbook-multi [student@servera ~]$ cd playbook-multi/ [student@servera playbook-multi]$ cat ansible.cfg [defaults] inventory=inventory remote_user=student [privilege_escalation] become=False become_method=sudo become_user=root become_ask_pass=False [student@servera playbook-multi]$ cat inventory servera
📑编写所需要的剧本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 [student@servera playbook-multi ]$ cat web.yml --- - name: Enable web services hosts: servera become: yes tasks: - name: latest version of httpd and firewalld installed yum: name: - httpd - firewalld state: latest - name: test html page is installed copy: content: "Hello World!\n" dest: /var/www/html/index.html - name: firewalld enabled and running service: name: firewalld enabled: true state: started - name: firewalld permits http service firewalld: service: http permanent: true state: enabled immediate: yes - name: httpd enabled and running service: name: httpd enabled: true state: started - name: Test web server hosts: localhost become: no tasks: - name: connect to web server uri: url: http://servera return_content: yes status_code: 200
📑语法检查 1 2 3 [student@servera playbook-multi]$ ansible-playbook --syntax-check web.yml playbook: web.yml
📑使用-v执行剧本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [student@servera playbook-multi]$ ansible-playbook web.yml -v PLAY [Enable web services] ************************************************************** TASK [Gathering Facts] ****************************************************************** ok: [servera] TASK [latest version of httpd and firewalld installed] ****************************************** ok: [servera] => {"changed": false, "msg": "", "rc": 0, "results": ["All packages providing httpd are up to date", "All packages providing firewalld are up to date", ""]} ………… TASK [connect to web server] ************************************************************ ok: [localhost] => {"accept_ranges": "bytes", "changed": false, "connection": "close", "content": "Hello World!\n", "content_length": "37", "content_type": "text/html; charset=UTF-8", "cookies": {}, "cookies_string": "", "date": "Fri, 04 Sep 2020 12:54:49 GMT", "etag": "\"25-5ae7c5e78c9df\"", "last_modified": "Fri, 04 Sep 2020 12:54:27 GMT", "msg": "OK (37 bytes)", "redirected": false, "server": "Apache/2.4.6 (Red Hat Enterprise Linux)", "status": 200, "url": "http://servera"} PLAY RECAP ********************************************************************************** localhost : ok=2 changed=0 unreachable=0 failed=0 servera : ok=6 changed=0 unreachable=0 failed=0
💡总结
yaml语法非常严格,仔细编写。
改造tab键以提高编写剧本的效率。
语法检查是一个良好习惯。
善用模块文档查看参数说明与例子。
通过练习与实验了解幂等性。
可使用 -v 参数查看详细输出进行排错。
转载自: IT民工金鱼哥 https://blog.csdn.net/qq_41765918/article/details/121732601 ,如有侵权,请联系删除。
虽然文章是转载的,我转载这一篇是因为他说了几个其他教程都没有的地方,但还是太太太基础了,有些地方没有讲到,比如变量传递、when、template模块、handlers等等的使用,所以我还推荐另一篇文章:https://www.cnblogs.com/yanjieli/p/10969299.html