Ansible Role

roles 角色 角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中 运维复杂的场景:建议使用 roles,代码复用度高 roles:多个角色的集合, 可以将多个的role,分别放至roles目录下的独立子目录中 roles 目录结构 bash playbook.yml roles/ project/ tasks/ files/ vars/ templates/ handlers/ default/ meta/ roles 各目录作用 files/ :存放由copy或script模块等调用的文件 templates/:template模块查找所需要模板文件的目录 tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含 handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含 vars/:定义变量,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含 meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含 default/:设定默认变量时使用此目录中的main.yml文件,比vars的优先级低 创建 roles 步骤 创建 role 步骤 Code 1 创建以roles命名的目录 2 在roles目录中分别创建以各角色名称命名的目录,如webservers等 3 在每个角色命名的目录中分别创建files、handlers、tasks、templates和vars等目录;用不到的目录可以创建为空目录,也可以不创建 4 在playbook文件中,调用各角色 目录树结构 bash [root@DESKTOP-NHT2EP5 ansible]#tree . ├── install_httpd.yml └── roles └── httpd ---角色名称 ├── files ---文件位置 │ ├── httpd.conf │ └── index.html ├── handlers ---触发器后执行的文件 │ └── main.yml └── tasks ---tasks 文件存放位置 ├── copy.yml ├── install.yml ├── main.yml └── service.yml playbook 调用角色 第一种方法 yaml --- - hosts: websrvs remote_user: root roles: - mysql - memcached - nginx 第二种方法 键 role 用于指定角色名称,后续的 k/v 用于传递参数给角色 ...

October 20, 2020

Ansible Jinja

Jinja语言 jinja2 语言使用字面量,有下面形式: 字符串:使用单引号或双引号 数字:整数,浮点数 列表:[item1, item2, …] 元组:(item1, item2, …) 字典:{key1:value1, key2:value2, …} 布尔型:true/false 算术运算:+, -, *, /, //, %, ** 比较操作:==, !=, >, >=, <, <= 逻辑运算:and,or,not 流表达式:For,If,When 字面量 表达式最简单的形式就是字面量。字面量表示诸如字符串和数值的 Python 对象。如”Hello World” 双引号或单引号中间的一切都是字符串。无论何时你需要在模板中使用一个字符串(比如函数调用、过滤器或只是包含或继承一个模板的参数),如42,42.23 数值可以为整数和浮点数。如果有小数点,则为浮点数,否则为整数。在 Python 里, 42 和 42.0 是不一样的 算数运算 Jinja 允许用计算值。支持下面的运算符 +:把两个对象加到一起。通常对象是素质,但是如果两者是字符串或列表,你可以用这 种方式来衔接它们。无论如何这不是首选的连接字符串的方式!连接字符串见 ~ 运算符。 2 等于 2 -:用第一个数减去第二个数。 1 等于 1 /:对两个数做除法。返回值会是一个浮点数。 0.5 等于 0.5 //:对两个数做除法,返回整数商。 2 等于 2 %:计算整数除法的余数。 4 等于 4 *:用右边的数乘左边的操作数。 4 会返回 4 。也可以用于重 复一个字符串多次。 NaN会打印 80 个等号的横条 ...

October 18, 2020

Ansible Playbook

Playbook 介绍 playbook 剧本是由一个或多个”play”组成的列表 play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作 Playbook 文件是采用YAML语言编写的 Playbook 命令 格式 bash ansible-playbook <filename.yml> ... [options] 常用选项 bash --syntax-check #语法检查 -C --check #只检测可能会发生的改变,但不真正执行操作 --list-hosts #列出运行任务的主机 jasonchen@DESKTOP-NHT2EP5:~$ ansible-playbook copy.yaml --list-hosts --list-tags #列出tag jasonchen@DESKTOP-NHT2EP5:~$ ansible-playbook copy.yaml --list-tags --list-tasks #列出task jasonchen@DESKTOP-NHT2EP5:~$ ansible-playbook copy.yaml --list-tasks --limit 主机列表 #只针对主机列表中的特定主机执行 jasonchen@DESKTOP-NHT2EP5:~$ ansible-playbook copy.yaml --limit 100.0.0.10 # 设置 limit 的时候,此 IP 必须要存在于脚本定义的 hosts -v -vv -vvv # 显示详细过程,v 越多显示的详细信息越多 Playbook 核心组件 hosts 组件 Hosts:playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts 用于指定要执行指定任务的主机,须事先定义在主机清单中,然后直接在 yaml 格式的文本中通过 hosts 关键字调用即可 ...

October 18, 2020

Ansible变量

变量调用方式 bash 通过{{ variable_name }} 调用变量,且变量名前后建议加空格,有时用"{{ variable_name }}"才生效。因为使用 {{ }} 直接调用时,有时 variable 变量内存在特殊字符,所以使用 "{{ }}" 可以忽略特殊字符。 变量来源 ansible 的 setup facts 远程主机的所有变量都可直接调用 通过命令行指定变量,优先级最高 yaml ansible-playbook -e variables_name=var playbook.yaml 在playbook文件中定义 yaml vars: - var1: value1 - var2: value2 在独立的变量YAML文件中定义 yaml - hosts: all vars_files: - vars.yml 在 /etc/ansible/hosts 中定义 主机(普通)变量:主机组中主机单独定义,优先级高于公共变量 bash 100.0.0.150 port=80 domain=www.dingchen.local 组(公共)变量:针对主机组中所有主机定义统一变量 bash [mysql:vars] # 定义组名一般为 [主机组名:公共变量组名] port=80 # 定义变量 domain=www.dingchen.local [mysql] # 定义的主机组名 100.0.0.150 100.0.0.10 100.0.0.105 特殊公共变量 [all:vars] # 作用域在整个主机清单 在 role 中定义 范例 主机变量调用 创建一个变量定义的文件名,三个主机分别使用不同的变量内容 ...

October 17, 2020

Yaml

YAML 文件格式介绍 YAML:YAML Ain’t Markup Language,即YAML不是XML。不过,在开发的这种语言时,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 YAML 语言特点 YAML的可读性好 YAML和脚本语言的交互性好 YAML使用实现语言的数据类型 YAML有一个一致的信息模型 YAML易于实现 YAML可以基于流来处理 YAML表达能力强,扩展性好 YAML 语法简介 在单一文件第一行,用连续三个连字号”-“ 开始,还有选择性的连续三个点号( … )用来表示文件的 结尾 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能 使用**#号注释代码** 缩进必须是统一的,不能空格和tab混用 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换 行来实现的 YAML文件内容是区别大小写的,key/value的值均需大小写敏感 多个key/value可同行写也可换行写,同行使用,分隔 key后面冒号要加一个空格 比如: key: value value可是个字符串,也可是另一个列表 YAML文件扩展名通常为yml或yaml 支持的数据类型 YAML 支持以下常用几种数据类型: 标量:单个的、不可再分的值 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary) 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list) scalar 标量 key对应value bash name: wang 使用缩进的方式 bash name: wang 标量是最基本的,不可再分的值,包括: 字符串 布尔值 整数 浮点数 Null 时间 日期 Dictionary 字典 字典由多个key与value构成,key和value之间用 :分隔, 并且 : 后面有一个空格,所有k/v可以放在一 行,或者每个 k/v 分别放在不同行 ...

October 17, 2020

Ansible模块

Command 模块 **功能:**远程执行主机命令,此为默认模块,可忽略 -m 选项 **注意:**此模块不会支持特殊字符,如果有需要使用特殊字符,例如 & | ; 等,需要使用 shell 模块来实现 命令参数 creates 如果目标文件已经存在则不会执行动作 chdir 切换执行动作的目录 removes 如果目标文件存在则会执行动作 范例 bash 1. 默认访问为家目录,而非被控制端所在目录 [root@DESKTOP-NHT2EP5 ~]#ansible 100.0.0.10 -m command -a "ls" 100.0.0.10 | CHANGED | rc=0 >> anaconda-ks.cfg mysql.sh 2. removes 与 creates 参数的区别 [root@centos7 ~]# touch 1.txt [root@DESKTOP-NHT2EP5 ~]#ansible 100.0.0.10 -m command -a "removes=/root/1.txt chdir=/root/ echo hei" 100.0.0.10 | CHANGED | rc=0 >> hei [root@DESKTOP-NHT2EP5 ~]#ansible 100.0.0.10 -m command -a "removes=/root/2.txt chdir=/root/ echo hei" 100.0.0.10 | SUCCESS | rc=0 >> skipped, since /root/2.txt does not exist [root@DESKTOP-NHT2EP5 ~]#ansible 100.0.0.10 -m command -a "creates=/root/1.txt chdir=/root/ echo hei" 100.0.0.10 | SUCCESS | rc=0 >> skipped, since /root/1.txt exists [root@DESKTOP-NHT2EP5 ~]#ansible 100.0.0.10 -m command -a "creates=/root/2.txt chdir=/root/ echo hei" 100.0.0.10 | CHANGED | rc=0 >> hei Shell 模块 **功能:**执行 shell 命令的模块。可以弥补 script 模块的缺陷(不能运行远程主机上的脚本) ...

October 17, 2020