Ansible-playbook 快速入门到放弃
Ansible-playbook 快速入门到放弃
隔岸红尘忙似火,当轩青嶂冷如冰。
1-简介
playbook 相当于可以把模块命令都写入到配置文件里面,这样就可以直接执行配置文件了,类似脚本。
2-playbook 初体验
编写test.yml 文件,在serviceA 主机机器上的/opt/tjt 路径下创建test.txt 文件。

1 ---
2 - hosts: serviceA
3 remote_user: root
4 tasks:
5 - name: "使用touch 命令创建test.txt文件"
6 shell: touch /opt/tjt/test.txt

文件格式说明
- 第一行需要有三个杠,hosts 参数指定了对哪些主机进行参作,如果是多台机器可以用逗号作为分隔,也可以使用主机组,在/etc/ansible/hosts里定义;
- user 参数指定了使用什么用户登录远程主机操作;
- tasks 指定了一个任务,其下面的name 参数同样是对任务的描述,在执行过程中会打印出来,shell 是ansible 模块名字。
编辑完成之后,使用ansible-playbook 命令执行test.yml 文件。
[root@localhost tjt]# ansible-playbook /opt/tjt/ansible/test.yml

然后到客户端上看看是否有创建test.txt 文件。
[root@localhost ~]# ls -l /opt/tjt/test.txt

3-playbook 变量
通过创建用户体验playbook 的变量使用方式。
---
- name: "创建test用户"
hosts: 192.168.8.136
user: root
gather_facts: false
vars:
- user: "test"
tasks:
- name: "---playbook变量----创建test用户---"
user: name="{{ user }}"
说明:
- name:对该playbook 实现的功能做一个概述,后面执行过程中,会打印 name 变量的值 ,可以省略;
- gather_facts:指定了在以下任务部分执行前,是否先执行setup 模块获取主机相关信息,如果需要在后面的tasks里获取setup收集到的信息,就需要把这个参数设置为True;
- vars:指定了变量,这里声明了一个user 变量,其值为test ,需要注意的是,变量值一定要用引号引住;
- user:提定了调用user 模块,name是user 模块里的一个参数,而增加的用户名字调用了上面user 变量的值。
执行该文件:
[root@localhost tjt]# ansible-playbook /opt/tjt/ansible/create_user.yml

到客户端上看看用户是否已创建:
[root@localhost ~]# id test

4-playbook 循环
---
- hosts: 192.168.8.136
user: root
tasks:
- name: "playbook---循环"
file: path=/opt/tjt/{{ item }} state=touch mode=600
with_items:
- 1.txt
- 2.txt
- 3.txt
参数说明
- file 模块可以对文件进行相关的操作,例如创建文件或者更改文件权限等,具体可以查看该模块的文档。
- with_items 为循环的对象,相当于是一个数组或集合,写在下面的1.txt、2.txt 以及3.txt 是该集合的元素。而item 则表示的是遍历出来的元素,也就是说item 指代的是1.txt、2.txt 以及3.txt。
- state 的值设置为touch 表示如果该文件不存在就进行创建。
- path 表示文件的路径。
- mode 设置权限。
执行该文件:
[root@localhost tjt]# ansible-playbook /opt/tjt/ansible/while.yml

到客户端上看看文件是否已创建:
[root@localhost ~]# ll /opt/tjt/*.txt

5-playbook 条件判断
一般以setup 模块收集到的主机信息,来作为判断条件。所以在编写代码之前,我们需要先获取相应的信息,例如我要以ip 地址来作为判断条件,那么我就得先从setup 里获取主机ip的相关信息。
执行以下命令可以查看到setup 收集到的所有的facter 信息,输出的信息是JSON格式的:
[root@localhost tjt]# ansible serviceA -m setup

通过一个简单的创建文件的例子体验playbook 条件判断语句的使用方式,编写 when.yml 文件内容如下:
---
- hosts: serviceA
user: root
gather_facts: True
tasks:
- name: "playbook---条件判断"
shell: touch /opt/tjt/when.txt
when: ansible_virbr0.ipv4.address == "192.168.122.1"
参数说明
- ansible_virbr0 是一个数组存储着网卡相关信息,ipv4 属于该数组的子元素,但是ipv4也是一个数组,而address 则是ipv4 数组的子元素,我们需要使用address 来作为判断条件,所以要访问address 就需要使用这样的格式:ansible_virbr0.ipv4.address,address 表示的是键,而"192.168.122.1"则是值,when 为判断语句相当于if,所以其判断条件为:该键的值为"192.168.122.1"时就执行shell 模块里定义的语句。
- gather_facts: True ,在远程主机运行setup 模块,并将收集的信息记录起来(等于命令ansible all -m setup #查看系统信息),可以通过系统信息来判断是否执行。
- gather_facts: no ,在不需要获取机器信息时,根据信息做判断时,将其关闭,避免影响执行速度。
执行该文件:
[root@localhost tjt]# ansible-playbook /opt/tjt/ansible/when.yml

到客户端上看看文件是否已创建:
[root@localhost ~]# ll /opt/tjt/when.txt
-rw-r--r--. 1 root root 0 2月 21 21:51 /opt/tjt/when.txt
[root@localhost ~]#
6-playbook 的handlers
- 有一种情况就是执行了tasks里面的内容之后,服务器发生了变化,这时我们可能需要执行一些相关的操作。
- 例如我们修改了某个服务的配置文件后,则需要重启一下服务,而handlers 就是完成这样的事情的,它相当于编程中的回调函数,当tasks 里的内容执行成功后,就会执行handlers 里定义的内容。
- 类似于shell 脚本中的 && 符号,例如 cat 1.txt && rm -f 1.txt ,当 cat 1.txt 命令执行成功之后就会执行 rm -f 1.txt 命令,否则不执行。
---
- name: "playbook中的handlers"
hosts: serviceA
user: root
tasks:
- name: copy file
copy: src=/opt/tjt/handlers dest=/opt/tjt/handlers.txt
notify: test handlers
handlers:
- name: test handlers
shell: echo "This is a test string" >> /opt/tjt/ansible/handlers.txt
参数说明
- 只有copy 模块执行成功后,才会去调用下面的handlers 里定义的内容,去执行handlers 里面的shell 相关命令,这种比较适合配置文件发生更改后,重启服务的操作。
- notify 用于指定handlers 的name 参数的值,因为handlers 可以定义多个,所以需要使用notify 来进行指定调用哪一个。
执行该文件:
[root@localhost tjt]# ansible-playbook /opt/tjt/ansible/handlers.yml

到客户端上查看文件末尾一行是否为ansible 执行的echo 写进的那一行内容。
[root@localhost ~]# tail -n1 /opt/tjt/ansible/handlers.txt

7-Ansible 的roles
role是task文件、变量文件、handlers文件的集合体,这个集合体的显著特点是:可移植性和可重复执行性。
在实际项目中,通常我们以部署某个服务为单元作为一个role ,然后将这些服务单元(role)放在一个roles 目录下,主playbook 文件通过调用roles目录下的role,来实现各种灵活多变的部署需求。
roles创建
创建一个role 的方法有两种:
命令mkdir 和touch 行手动创建,即需要哪个目录和文件就用「mkdir」和「touch」命令创建出来。
使用ansible-galaxy 自动初始化一个role,创建完后再删除不需要的目录。
使用「ansible-galaxy init」命令创建一个名字为role_D 的role。
[root@localhost roles]# ansible-galaxy init role_D
- Role role_D was created successfully

role 目录结构
- tasks : 用于存放role_D 的主要任务,也可以添加其他task 文件,供main.yml 调用,从而实现更加复杂的部署功能。
- handlers : 用于存放触发执行( hanlders )的任务。
- defaults : 用于存放默认变量,优先级最低。
- vars : 用于存放变量文件,role_D 中任务和模版里用到的变量可以在这里定义。
- files :用于存放需要拷贝到目的主机的文件,例如,作为「copy」模块src 参数的默认根目录。
- template : 用于存放模版文件,格式为.j2,文件内容要符合Jinja2 语法规则,通常使用「template」模块部署服务的配置文件。
- meta : 用于存放role 依赖列表,这个知识点后面会详细阐述。
- tests : 用于存放测试role 本身功能的playbook 和主机定义文件,在开发测试阶段比较常用。
role 中各个目录下的main.yml 文件很重要,这是ansible 默认加载的YAML 文件。
roles 的引用&执行
可以使用「roles:」语句引用role ,根据需要在主playbook 中引用不同的role,ansible 会把role 所包含的任务、变量、handlers、依赖等加载到playbook中,按照顺序执行。
编写主playbook 文件test_role.yml:
---
- name: "主playbook文件通过调用roles目录下的role"
hosts: serviceA
user: root
gather_facts: false
roles:
- roleB
- roleA
roleA 和roleB 目录结构如下:

/opt/tjt/ansible/roles/roleA/tasks/main.yml
---
- name: "调用-roles目录下的roleA"
debug:
msg: "msg: roleA被执行"
/opt/tjt/ansible/roles/roleB/tasks/main.yml
---
- name: "调用-roles目录下的roleB"
debug:
msg: "age:: roleB被执行"
执行主playbook 文件test_role.yml:
[root@localhost roles]# ansible-playbook /opt/tjt/ansible/test_role.ym

如上,可以看到roleB 和roleA 分别有序执行。
检索路径
ansible 如何查找要执行的role,在不使用绝对路径的情况下(可以这么配role - role: /opt/tjt/ansible/roles/roleB),ansible 检索role 的默认路径有:
- 执行ansible-playbook 命令时所在的当前目录
- playbook 文件所在的目录及playbook 文件所在目录的roles 目录
- 当前系统用户下的~/.ansible/roles 目录
- /usr/share/ansible/roles 目录
- ansible.cfg 中「roles_path」指定的目录,默认值为/etc/ansible/roles 目录
8-playbook 的chdir
chdir:进入指定目录,如下chdir,执行ls 命令前,先进入指定目录/opt/tjt。
[root@localhost roles]# ansible serviceA -m command -a 'chdir=/opt/tjt ls'

9-playbook 的with_items
ansible 中的循环模块有很多,with_items 最为简单常用。
---
- name: "with_items循环遍历"
shell: "echo {{ item }}"
register: "with_items_output"
with_items: [a,b,c,d]

如上,with_items 可以用于迭代一个列表或字典,通过 {{ item }} 获取每次迭代的值。
Ansible-playbook 快速入门到放弃的更多相关文章
- Ansible的快速入门
Ansible 是一个简单的自动化引擎,可完成配置管理,应用部署,服务编排等各种IT需求. Ansible使用python语言开发实现的开源软件,依赖于Jinjia2,paramiko和PyYAML这 ...
- ansible入门四(Ansible playbook基础组件介绍)
本节内容: ansible playbook介绍 ansible playbook基础组件 playbook中使用变量 一.ansible playbook介绍 playbook是由一个或多个“pla ...
- Jenkins 从小白入门到企业实践打怪放弃之路系列笔记 【持续集成与交付快速入门必备】
Jenkins 从小白入门到企业实践打怪放弃之路系列笔记 [持续集成与交付快速入门必备]
- kolla-ansible快速入门
kolla-ansible快速入门 kolla-ansible是一个结构相对简单的项目,它通过一个shell脚本,根据用户的参数,选择不同的playbook和不同的参数调用ansible-playbo ...
- Python+Django+ansible playbook自动化运维项目实战☝☝☝
Python+Django+ansible playbook自动化运维项目实战☝☝☝ 一.入门引导 DevOPSDevOps(英文Development和Operations的组合)是一组过程.方法 ...
- 一、Ansible基础之入门篇
目录 1. Ansible基础 1.1 介绍 1.2 工作原理 1.3 如何安装 1.3.1 先决条件 1.3.2 安装Ansible 1.4 管理节点与被管理节点建立SSH信任关系 1.5 快速入门 ...
- 【转】Flask快速入门
迫不及待要开始了吗?本页提供了一个很好的 Flask 介绍,并假定你已经安装好了 Flask.如果没有,请跳转到 安装 章节. 一个最小的应用 一个最小的 Flask 应用看起来会是这样: from ...
- Git快速入门和常用命令
一.快速入门 本地初始化一个项目 首先,你需要执行下面两条命令,作为 git 的基础配置,作用是告诉 git 你是谁,你输入的信息将出现在你创建的提交中. git config --global us ...
- 没有基础的初学者学java怎样快速入门?超全的学习路线图
现在地球人都知道互联网行业工资高,上万都是小case,不值一提.可是对于大部分人来说,工资七八千都算很难了.那我也想学java,当程序员,赚大钱.可是作为一个初学者,怎样才可以快速入门呢?早点入门就可 ...
- Vue (一) --- vue.js的快速入门使用
=-----------------------------------把现在的工作做好,才能幻想将来的事情,专注于眼前的事情,对于尚未发生的事情而陷入无休止的忧虑之中,对事情毫无帮助,反而为自己凭添 ...
随机推荐
- 关于最新版本listen1 (2.1.6)的修改心得(添加下载功能)
注:本文只作为技术交流 前言 再次感谢 listen1 的作者开发出如此强大的音乐播放器 项目地址 上一篇的文章没有解决跨域问题(命名不能正确命名), 上一篇文章 地址 这次解决了,并简单的美化了下载 ...
- 【每日一题】【树的dfs递归,返回多次,注意都遍历完后才最终返回】2022年1月6日-112. 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum .判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum .如果存在,返回 tr ...
- 18V降压3.3V,15V降压3.3V的降压IC和LDO芯片方案
在 18V 和 15V 输入中,我们需要给其他电源电路提高供电,有的电路的供电电压在 5V,或者是 3.3V 时, 我们就需要使用降压芯片来组建一个降压电路来给后面的的电路,提供稳定的,持续的 3.3 ...
- 常用的渗透测试工具——SQLMap安装
SQLMap是一个自动化的SQL注入工具,其主要功能是扫描.发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL.Qracle.PostgreSQL.Microsoft ...
- Vm无法连接到虚拟机,请确保您有权限运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录,未能将管道连接到虚拟机:所有的管道范例都在使用中解决方法
可能是杀掉进程导致 解决办法: 1.首先杀掉所有VM打头的任务. 2.删掉所有lck文件 3.VM文件夹内有一串很长的数字命名的文件夹或文件,删掉 4.发现被VMware-vmx.exe占用 5.打开 ...
- cs231n__4.2 神经网络 Neural networks
CS231n 学习笔记 4.2 神经网络 Neural networks 之前我们已经使用了 很多线性分类函数 现在我们不用单变换的: 我们首先有线性层,然后有这个非线性计算,继而在顶层再加入另一个线 ...
- Centos7下git最新版本安装
刚重新装了centos7最小版的系统,发现没有git,只好重新安装了,记录下以防忘记.(以下命令最好在root用户下执行,要么你有管理员权限也行,则需要在命令前加sudo) 安装方法有两种: 一.yu ...
- 痞子衡嵌入式:Farewell, 我的写博故事2016-2019
-- 题图:苏州天平山枫叶 现在是 2022 年末,痞子衡又要起笔博文年终总结了,看着 2020 年之前的博文总结缺失,始终觉得缺憾,所以写下此篇 2016 - 2019 总结合辑.2016 年之前, ...
- [OpenCV实战]47 基于OpenCV实现视觉显著性检测
人类具有一种视觉注意机制,即当面对一个场景时,会选择性地忽略不感兴趣的区域,聚焦于感兴趣的区域.这些感兴趣的区域称为显著性区域.视觉显著性检测(Visual Saliency Detection,VS ...
- 【白话模电1】PN结与二极管
距离上一次写半导体,已经过了很久了,上次分享了本征半导体的基本概念: https://zhuanlan.zhihu.com/p/109483580 今天给大家聊聊半导体工业中的基础:PN结与二极管 1 ...