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参数。常用