在ansible里,变量干嘛用的
本身,ansible就是致力于,用尽可能"通用"的剧本,干所有场合的工作......
ansible里的变量怎么写
字母开头,包括:字母数字下划线
变量怎么定义(声明)
1.最直白的
在playbook里写
就写到最开头,hosts下面,和hosts平级

2.如果变量很多,不方便写在playbook里,那就单独写一个文件
然后再playbook里,指定这个写了一堆变量的文件

3.上面两种方式,都是特定与某个剧本,写变量
这组变量是给剧本用,不用剧本究竟操作哪些主机
接下来,换个角度
如果一组变量,给一组特定的主机指定,不论执行的是什么剧本
在inventory文件里指定变量
3.1)可以给特定主机,定义变量

3.2)可以给特定的主机组,定义变量

4.上面的方式,都是简单指定变量,也可以指定很多变量
但是,上面的方式,结构简单,变量也没有层次化管理
接下来,层次化管理变量,一组变量
数组

users这层下面,有俩子项bjones和acook
bjones下,又有三个子项,这三个子项都是有各自值的变量
用起来,就变成这样

users -> bjones -> first_name
这个值是Bob
5.还有什么东西可以变成变量
刚才所有的做法,都是管理员新定义变量
能不能把执行输出、主机已有的信息,重新获取,变成变量
5.1)把剧本执行的输出,获取
用debug模块

通过debug获得的信息,可以变成指定变量的值
5.2)客户机自己的信息,也可以被管理机获取,在变成变量
......
变量定义好了,在剧本里怎么写出来,或怎么调用

建议:用双引号
注意:变量名,前后的空格
两层{}
比如上面的
"{{ user }}"
整个剧本结构是不变的,只是把原本确定的值,替换为变量
用处/用途
整个项目管理过程中,尽可能使用"通用"的剧本,管理不同主机
比如:
可以建立一套剧本,功能如下
给客户机创建特定用户、安装指定的软件包、确保服务云心、防火墙放行
剧本结构,始终不变
只需要给不同场合,用不同变量......
接下来,还有问题
问题不在于变量本身,如何保证变量"安全"
变量文件,是需要更安去的保存方式,不光是文件本体权限更严格
需要加密
比如,就算只有root账户只读,也不能保证有多少人知道root密码
ansible的工作,通常也不会用root直接做
想办法,让变量文件,以及其他文件,以加密方式保存
访问的时候,需要密码
实现
1.从文件创建开始,就以加密步骤创建

用ansible-vault工具,直接创建一个要加密的文件
选项是create
创建的时候,就写密码......
2.已经有了文件,用加密方法,后期加密

还是上面那个命令,选项不一样encrypt加密
文件加密后,怎么用
1.正常的调用,用的时候,会要求输入密码
比如,运行剧本,但是剧本调用的变量文件是加密的

直接用,报错,因为没指定加密选项

要指定,交互方式输入密码
2.是把加密的密码,写到其他文件,然后自动化调用
在创建时,可以把密码提前写好,在某个文件里
然后

密码在vault-pass文件里
那这个文件本身,需要"妥善保管"
而且,这个文件本身,不加密的
上面用了"变量"这个东西
用ansible操作主机,其中用变量和层次化的变量,管理信息
反过来,主机已有的信息,在ansible看来,是否也可以用类似的方法?
facts(事实)
主机,已经有的信息、属性......都是可层次化管理,并且可以二次利用
这些东西在ansible看来,也是类似于"数组变量"
首先,需要有办法获取
Linux系统,各种信息,如果手动获取,要使用不同多种命令、工具
并且,输出内容,格式都不一样......
ansible必须把这些信息,变成相同格式的内容
肯定要用到某个模块
debug模块

输出内容大概......




如果要把这些信息,拿来用,怎么用
用法和上面的数组变量一样,类似于

那问题又来了
这么多东西,怎么记住?
说实话,谁也记不住......
办法,基本没有
最好的办法,就是记住结构,然后记几个常用的用法
这个东西,啥用处
比如,结合debug和其中的msg,输出特定的检查信息

会输出

还能不能更有用?
比如,把这些信息,收起来,筛选二次使用
把特定的某个、某些fact,拿出来,给变量赋值
和数组变量,类似,可以直接用,写到剧本里
比如

上面的都是,基于系统已有的信息,输出为facts
能不能自己编facts?
两个东西:自定义事实,魔法变量