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 的方法有两种:

  1. 命令mkdir 和touch 行手动创建,即需要哪个目录和文件就用「mkdir」和「touch」命令创建出来。

  2. 使用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 快速入门到放弃的更多相关文章

  1. Ansible的快速入门

    Ansible 是一个简单的自动化引擎,可完成配置管理,应用部署,服务编排等各种IT需求. Ansible使用python语言开发实现的开源软件,依赖于Jinjia2,paramiko和PyYAML这 ...

  2. ansible入门四(Ansible playbook基础组件介绍)

    本节内容: ansible playbook介绍 ansible playbook基础组件 playbook中使用变量 一.ansible playbook介绍 playbook是由一个或多个“pla ...

  3. Jenkins 从小白入门到企业实践打怪放弃之路系列笔记 【持续集成与交付快速入门必备】

    Jenkins 从小白入门到企业实践打怪放弃之路系列笔记 [持续集成与交付快速入门必备]

  4. kolla-ansible快速入门

    kolla-ansible快速入门 kolla-ansible是一个结构相对简单的项目,它通过一个shell脚本,根据用户的参数,选择不同的playbook和不同的参数调用ansible-playbo ...

  5. Python+Django+ansible playbook自动化运维项目实战☝☝☝

    Python+Django+ansible playbook自动化运维项目实战☝☝☝  一.入门引导 DevOPSDevOps(英文Development和Operations的组合)是一组过程.方法 ...

  6. 一、Ansible基础之入门篇

    目录 1. Ansible基础 1.1 介绍 1.2 工作原理 1.3 如何安装 1.3.1 先决条件 1.3.2 安装Ansible 1.4 管理节点与被管理节点建立SSH信任关系 1.5 快速入门 ...

  7. 【转】Flask快速入门

    迫不及待要开始了吗?本页提供了一个很好的 Flask 介绍,并假定你已经安装好了 Flask.如果没有,请跳转到 安装 章节. 一个最小的应用 一个最小的 Flask 应用看起来会是这样: from ...

  8. Git快速入门和常用命令

    一.快速入门 本地初始化一个项目 首先,你需要执行下面两条命令,作为 git 的基础配置,作用是告诉 git 你是谁,你输入的信息将出现在你创建的提交中. git config --global us ...

  9. 没有基础的初学者学java怎样快速入门?超全的学习路线图

    现在地球人都知道互联网行业工资高,上万都是小case,不值一提.可是对于大部分人来说,工资七八千都算很难了.那我也想学java,当程序员,赚大钱.可是作为一个初学者,怎样才可以快速入门呢?早点入门就可 ...

  10. Vue (一) --- vue.js的快速入门使用

    =-----------------------------------把现在的工作做好,才能幻想将来的事情,专注于眼前的事情,对于尚未发生的事情而陷入无休止的忧虑之中,对事情毫无帮助,反而为自己凭添 ...

随机推荐

  1. 关于最新版本listen1 (2.1.6)的修改心得(添加下载功能)

    注:本文只作为技术交流 前言 再次感谢 listen1 的作者开发出如此强大的音乐播放器 项目地址 上一篇的文章没有解决跨域问题(命名不能正确命名), 上一篇文章 地址 这次解决了,并简单的美化了下载 ...

  2. 【每日一题】【树的dfs递归,返回多次,注意都遍历完后才最终返回】2022年1月6日-112. 路径总和

    给你二叉树的根节点 root 和一个表示目标和的整数 targetSum .判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum .如果存在,返回 tr ...

  3. 18V降压3.3V,15V降压3.3V的降压IC和LDO芯片方案

    在 18V 和 15V 输入中,我们需要给其他电源电路提高供电,有的电路的供电电压在 5V,或者是 3.3V 时, 我们就需要使用降压芯片来组建一个降压电路来给后面的的电路,提供稳定的,持续的 3.3 ...

  4. 常用的渗透测试工具——SQLMap安装

    SQLMap是一个自动化的SQL注入工具,其主要功能是扫描.发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL.Qracle.PostgreSQL.Microsoft ...

  5. Vm无法连接到虚拟机,请确保您有权限运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录,未能将管道连接到虚拟机:所有的管道范例都在使用中解决方法

    可能是杀掉进程导致 解决办法: 1.首先杀掉所有VM打头的任务. 2.删掉所有lck文件 3.VM文件夹内有一串很长的数字命名的文件夹或文件,删掉 4.发现被VMware-vmx.exe占用 5.打开 ...

  6. cs231n__4.2 神经网络 Neural networks

    CS231n 学习笔记 4.2 神经网络 Neural networks 之前我们已经使用了 很多线性分类函数 现在我们不用单变换的: 我们首先有线性层,然后有这个非线性计算,继而在顶层再加入另一个线 ...

  7. Centos7下git最新版本安装

    刚重新装了centos7最小版的系统,发现没有git,只好重新安装了,记录下以防忘记.(以下命令最好在root用户下执行,要么你有管理员权限也行,则需要在命令前加sudo) 安装方法有两种: 一.yu ...

  8. 痞子衡嵌入式:Farewell, 我的写博故事2016-2019

    -- 题图:苏州天平山枫叶 现在是 2022 年末,痞子衡又要起笔博文年终总结了,看着 2020 年之前的博文总结缺失,始终觉得缺憾,所以写下此篇 2016 - 2019 总结合辑.2016 年之前, ...

  9. [OpenCV实战]47 基于OpenCV实现视觉显著性检测

    人类具有一种视觉注意机制,即当面对一个场景时,会选择性地忽略不感兴趣的区域,聚焦于感兴趣的区域.这些感兴趣的区域称为显著性区域.视觉显著性检测(Visual Saliency Detection,VS ...

  10. 【白话模电1】PN结与二极管

    距离上一次写半导体,已经过了很久了,上次分享了本征半导体的基本概念: https://zhuanlan.zhihu.com/p/109483580 今天给大家聊聊半导体工业中的基础:PN结与二极管 1 ...