1、配置文件优先级
#ansible的配置文件有4种形式可以指定,4种指定方式优先级是不同的。
#按照优先级先后顺序排序:
1、ANSIBLE_CONFIG变量指定的配置文件优先级最高。(用的最少)
2、当前目录下的ansible.cfg(使用频率最高)
3、家目录下的~/.ansible.cfg
4、默认就会使用/etc/ansible/ansible.cfg
#ANSIBLE_CONFIG变量指定的配置文件
[student@workstation gzy]$ touch /tmp/ansible.cfg
[student@workstation gzy]$ export ANSIBLE_CONFIG=/tmp/ansible.cfg
[student@workstation gzy]$ ansible --version | grep cfg config file = /tmp/ansible.cfg
2、列出6个常用的模块:
ping yum service user group firewalld shell command copy file mount parted cron systemd,lvol,lvg,filesystem,
3、playbook是什么
#playbook是什么,是YAML格式编写的文本文件,通常使用yaml,或yml结尾的文件(yml常用)。playbook主要使用空格字符来指定它的数据结构,不用tab键。
#有两个基本规则:
①数据元素在同级必须有同样的缩进
②一个对象是另外一个对象的子对象时必须比父对象缩进更多
#注意:只有空格可以使用,不能用tab。如果你使用vim编辑器,你可以通过在你的家目录下创建.vimrc文件,并且添加"autocmd FileType yaml setlocal ai ts=2 sw=2 et"来将tab变成两个空格。
ansible-playbook -C #假装运行,
ansible-playbook --syntax-check#语法检查下
ansible-playbook -vvv #查看详细信息verbose
4、 多个play
#就和-name多个平级目录。多个play好处,不同主机用不同play。一个play可以运行多个主机。
#不同主机分别运行不同task任务内容。这时候就必须要用到多个play了
5、 ansible-doc获取模块使用帮助
很重要,因为要知道使用帮助怎么用,才能写好playbook。
ansible-doc user
METADATA:
status:
- stableinterface #很稳定,preview表示字段可能发生变化;deprecated后期会不再使用;removed模块已经从某个版本移除了。
supported_by: core #ansible核心团队支持,也就是redhat支持。curated其它的合作伙伴支持,通常会收费。community社区,免费的。
ansible-doc -s user #-s参数,只显示模块的字段和概述
6、变量定义、优先级、写的位置。
#命名规则:
1、必须以字母开头,并且只能包含字母、数字、下划线(和go一样)。
2、变量中间不能有空格和点、特殊符号。
#引用变量,{{ 变量名 }} 格式进行引用。
#注意:
#1、如果引用的时候,变量作为开始值的第一个元素,那必须要将变量和整个语句加双引号
#2、如果引用的时候,变量作为数值,那么不需要花括号{{}}
7、变量优先级
#变量可以写的位置:
命令行-e参数指定,优先级最高
playbook文件
inventory文件(尽量不用这种,inventory只写主机和组)
单独的yml变量文件(生产环境中用这种)
主机和主机组目录,host_vars和group_vars目录(生产环境中用这种)
#变量优先级:
如果多个范围定义相同名字的变量、遵从小范围优先原则:命令行最高、playbook次之、inventory仅次之
8、 register变量的作用和用法
作用:将某个任务输出结果赋给这个变量,这个变量的值是个变量矩阵,你可以输出其中具体某个值。
9、 facts变量
#ansible facts是ansible受管理主机上自动检测到的变量,在受管主机收集的一些facts包括:
#主机名称、内核版本、网络接口、ip地址、操作系统版本、cpu、内存、可使用磁盘空间、各种环境变量。
#用途:借助于facts可以方便检索受管理主机的状态、并根据该状态确定要执行的操作。
#playbook以json格式显示facts变量的内容, ansible -m setup localhost > localhost.json 导出本地机器的facts变量
#常见facts变量:
ansible_distribution=="RedHat" #发布版本,常用
ansible_distribution_version #版本号.
ansible_facts.ansible_fqdn=ansible_fqdn #完全限定的域名,长主机名
ansible_facts['interfaces'] #网络接口表
ansible_facts['hostname'] #短主机名,等于ansible_hostname
ansible_kernel #内核版本,直接写不知道行不行,没实践,不行前面加个开头ansible_facts
ansible_memfree_mb #可使用内存
ansible_memtotal_mb #总内存
ansible_processor_cores #cpu是几核
ansible_processor_count #cpu物理数量
ansible_python_version #python版本
ansible_facts['date_time']['date']
ansible_default_ipv4['address']
每次运行playbook都会收集facts变量,如果想关闭,可以在playbook文件里面加gather_facts: no,没有特别考虑机器的性能情况下不要关闭。
#### 创建自定义facts
cd /etc/ansible/facts.d 默认从此目录加载自定义facts变量。目录中文件结尾必须以.fact结尾才可以被使用,fact通常以json和ini格式编写。目录不存在,自己手动创建。
自定义facts变量,由setup模块存储在ansible_facts.ansible_local变量中,
10、magic变量
其实就是用于获取受管理主机相关信息的变量,他就像是变量矩阵,里面包含很多内容。
老师解释:其实就是主机变量和主机组变量
我们常用的就几个:
hostvars #包含受管理主机的变量、inventory路径、主机名等信息
groups #列出当前受管理主机所属的所有组
group_names #列出inventory文件里所有的组
inventory_hostname #列出清单中配置的,当前受管理主机的主机名称
ansible servera.lab.example.com -m debug -a "var=group_names"
ansible servera.lab.example.com -m debug -a "var=groups"
ansible servera.lab.example.com -m debug -a "var=inventory_hostname"
11、vault介绍
#命令:
Usage: ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]
ansible-vault create vaultfile.yml #创建一个加密文件,会提示输入密码
ansible-vault view vaultfile.yml #查看文件内容,不编辑,会提示输入密码
ansible-vault edit vaultfile.yml #编辑文件内容
ansible-vault rekey vaultfile.yml #修改加密文件的密码
ansible-vault decrypt vaultfile.yml #解密文件,解密后都永久可以cat看了。
ansible-vault encrypt vaultfile.yml vaultfile2.yml #加密多个现有的文件
12、条件判断
#语法:
#采用when进行条件判断
#1,由于when语句不是模块里的字段变量,它是控制任务的,必须和模块平级缩进。
#2,when后面的变量,不需要加{{}}
13、多条件判断
when: a=="redhat" or b =="fedora" #或
when: a == "redhat" and b == "3.10.0" #and判断
when: #当when使用列表时候,默认是and判断,提高可读性
- a == "redhat"
- b == "3.10.0"
#分组
when: ( a==1 and b==1) or (a==2 and b==2) #写法1
when: > #写法2:使用大于号,写成列表法
( a==1 and b==1)
or
(a==2 and b==2)
14、task章节关键字清单:
#常用关键字清单、作用
loop、item #循环单个任务,关键字和模块名平级。
with_items #旧版本ansible2.5之前,用with_items关键字替换loop来循环任务,item字段不变。
register #每次输出给register定义的变量。关键字和模块名平级。
when,and,or #条件判断,关键字和模块名平级。
ignore_errors: yes #关键字和模块名平级。 忽略错误,让play继续往下执行。
force_handlers:yes #可在任务失败的时候依然触发handlers,通常都加此参数,也叫强制执行handlers参数。
handlers #定义检测单个任务状态,字段和模块名平级
faild_when #指定任务失败条件,字段和模块名平级
changed_when #指定任务的changed状态,字段和模块名平级
block #块任务,或者叫任务组
rescue #块任务执行失败,进入营救模式代码
always #块任务执行失败或成功都会执行
15、使用jinja2模板部署自定义文件
作用:在控制端写的是变量,文件推送到受管理主机的时候显示变量的值。
原理:在控制端机器写上a文件(后缀j2),a文件里都是些变量,用template模板把文件拷贝到100台受控管理主机,到受控管理主机的时候变量都会变成具体的值。
16、playbook的套娃(import_playbook参数)
不建议playbook写的特别大,阅读起来花时间,管理起来麻烦。
import_playbook参数,对多个playbook之间的引用。
17、playbook关键字
ansible配置文件的forks参数,设置受管主机的最大并行连接数。 playbook中serial参数在受管主机上,实施滚动更新。 import_playbook功能将外部play文件合并到playbook中。 import_tasks,include_tasks功能,将外部任务文件合并到playbook中。
18、role相关
#task执行的先后顺序
pre_tasks
role的tasks
play的tasks
post_tasks
role的handler
play的handler
ansible-galaxy命令是管理role。可以搜索角色,显示角色信息,列举、安装,删除,初始化角色。
nsible-galaxy --help
Usage: ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...
Perform various Role related operations. #其实就是对role的操作,增、删、查、设置。
19、playbook故障排除方法
#四种方法:
#1、使用debug模块
msg和var字段,一定要熟用,故障排查经常用到。看文档操作一下。
#示例
- name:
debug:
msg: "Free memory for this system is {{ ansible_facts['memfree_mb'] }}"
var: output #output是一个变量,不需要{{}}
#2、语法检查--syntax-check参数,--step逐步,--start-at-task从某步骤开始。
ansible-playbook play.yml --syntax-check
ansible-playbook play.yml --start-at-task=START_AT_TASK #从某个任务开始
#--step参数。单步调试,role里面用这个,不是很合适,但是要会,较常用。自己根据文档练习一下。
ansible-playbook play.yml --step
当达到一定水平的时候,不需要
#3、运行的时候加-vvv参数。常用