在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?
两个东西:自定义事实,魔法变量



















