一、ansible 的配置文件优先级:
优先级最高的是ANSIBLE_CONFIG 环境变量
优先级其次的是当前工作目录下的 ansiblecfg
优先级较次的是当前用户家目录下的.ansible.cfg 隐藏文件
优先级最低的是/etc/ansible/ansible.cfg 全局默认文件
1、ansible 的配置文件:
[defaults]: 通用配置项
[inventory]: 与主机清单相关的配置项
[privilege_escalation]: 特权升级相关的配置项
[paramiko_connection]: 使用 paramiko 连接的相关配置项,Paramiko 在 RHEL6以及更早的版本中默认使用的 ssh 连接方式
[ssh_connection]: 使用 OpenSSH 连接的相关配置项,OpenSSH是Ansible 在RHEL6 之后默认使用的 ssh 连接方式
[persistent_connection]: 持久连接的配置项
[accelerate]: 加速模式配置项
[selinux]: selinux相关的配置项
[colors]: ansible命令输出的颜色相关的配置项
[diff]: 定义是否在运行时打印 diff(变更前与变更后的差异)
2、ansible 运行任务的方式:
①.使用 ad-hoc 运行任务——>ansible 的临时指令 用来执行简单的任务
②.使用 playbook 运行任务——>ansible 的剧本 用来执行复杂的任务
注意:在ansible的导航器中,也就是容器版本中ansible的 ad-hoc 已经废除
ad-hoc 的执行:
语法格式:
ansible 主机/主机组 -m 模块 -a'模块的参数‘ ansible 的参数
ansible 的模块:
ansible-doc -l 列出当前系统中 ansible 的所有模块
ansible-doc -s 模块名杳看模块的参数
ansible-doc 模块名 查看模块的详细信息 包括用法
3、ansible 的四大命令执行模块:
command、shell、raw、script 四个模块专门用来执行 linux 的指令
ansible 默认使用command模块作为默认的命令执行模块
①command 有四个例外,如果命令中出现了<、>、&、| 符号则command 无法执行
②shel 模块 相当于在本机执行 bashshel 一样,可以让 ansible 执行 Linux 的指令,并且支持一些高阶参数,例如 chdir 可以在执行命令前切换到指定的目录,creates、removes等
③raw 模块 也相当于在本机执行命令,但是缺少chdir、creates、removes的高阶参数
creates 当文件存在时命令不执行 ;removes 当文件不存在时命令不执行
④script模块 将主控端的shell复制到被控端执行(没有将脚本文件拷贝到对端执行,而是将文件中 shel 的内容复制到被控端执行)
二、Ansible Playbook:
playbook 是一系列 ansible 命令的集合,通过 playbook的高级特性可以完成很多复杂的自动化任务,比如在playbook中可以进行任务的判断、循环、还可以将任务的执行结果作为变量,以及从外部或者其他位置获得变量;让playbook更加的灵活
playbook 语言:
playbook 使用yaml作为配置语言,yaml是非标记型语言(其实还是一种标记型语言),这类语言,通俗易懂;并且不需要掌握编程技能就可以写好这个配置
1、yaml的约束:
①.大小写敏感——>变量的大小写是完全不同的两个变量
②.使用缩进表示层级关系
③.只能使用空格进行缩进不能使用tab(从RHEL8.4开始会将yaml中的tab 转成空格,个人感觉是 vim的版本有关系,vim的版本更高了)
④.空格的数量不重要,相同的元素向左对齐很重要
⑤.使用#符号注释内容,注释一整行
2、yaml的数据类型:
纯量: 不可再分的值
数组(序列、列表): 一组有次序的值,通常使用短横线开头 “-”
对象(字典/哈希/映射): 键值对key=vaule用冒号进行表示,也就是key 和 vaule 之间使用冒号分隔,并且 vaule 前需要使用空格
3、playbook的示例需求:
①.在所有节点上安装 apache
②.在所有节点上生成一个名为/var/www/html/index.html 的文件内容为 hello rhce
③.apache 服务需要开机自启动,且当前立即启动
④.配置 firewalld 防火墙允许 web服务器的规则
- name: configure website
host: all
remote_user: bob
tasks:
- name: install httpd
yum:
name: httpd
state: present
- name: create file for index.html
copy:
content: "hello rhce\n"
dest: /var/www/html/index.html
mode: 777
- name: start service
systemd:
name: httpd
state: started
enabled: yes
- name: enable firewalld for 80/tcp
service: http
permanent: yes
immediate: yes
state: enabled
4、ansible-playbook的执行选项:
-v v越多信息越详细
syntax-check 检查语法错误
-C 测试运行 playbook,测试运行下不会对目标造成真正的影响,则测试剧本能否成功执行
5、playbook 的定义:
playbook由一个或者多个play组成的列表,而一个 play就是一组任务的集合,一个 play 中 tasks 的任务列表,就是 play 中要完成的需求,而每一个需求或者说每一个 tasks的任务都是对一个模块的调用,因此将play 根据一定的顺序或者是逻辑组合在一起完成一个复杂的大任务,我们将其称为playbook的编排
6、playbook 的结构
Targetsection: 目标、指的是 play中需要定义的远程主机、远程用户、是否开启提权、是否需要密码连接等,都在此定义,如果没有定义则使用 ansible.cfg 中默认的配置,如果用户进行了定义,则以用户定义的为准
Variable section: 变量、指的是在 playbook的执行过程中,需要传递给任务或者是其他插件的变量,在此定义,该段落专门用来给playbook定义变量
Tasksection: 任务、指的是 play中所有需要执行的任务在此定义,也就是 play 的任务列表
Handler section: 特定任务、该任务是有条件执行的任务,只有当达到特定条件是该任务才会被触发,一般情况下该任务不会自动执行;该任务在所有tasks任务执行完成后,根据触发的条件来决定是否执行
7、playbook 的任务列表:
①.任务列表中的所有任务都是从上向下执行
②.任务列表中任务一旦在某个主机上执行失败,则 playbook 接下来的任务不会在该主机上执行,也就是在该主机上停止
③.任务列表中有任务执行失败,只需要修复该任务后继续执行playbook即可完成失败的任务,这是因为 ansible 具有幂等性
幂等性:对同一个系统,使用同样的条件,一次请求和重复的多次请求对系统资源的影响是一致的
解决 ansible 的任务报错:
命令执行模块报错(shel、raw): 可以使用逻辑或 通过 || /usr/bin/true 让其返回值永远为零,则任务不会失败
其他模块执行报错: file、user等模块通过 ignore_errors:true 来忽略报错