ansible变量与机密
文章目录
1. 变量
1.1 ansible变量的作用
在Ansible中支持设置主机变量、组变量,变量支持嵌套使用,定义好了的变量可以在playbook中引用。由于Ansible实在每个主机上单独运行命令,所以不同的主机去调用同样的变量,也可以取到不同的值,这样进行一些配置就会更加灵活合理
1.2 变量的命名规范
变量的命名应该符合以下两个规范:
- 变量应该由字母、数字、下划线组成
- 变量应该以字母开头
例如:host_port、HOST_PORT、var5是符合命名规范的,host-port、HOST PORT、var.2都不符合命名规范
变量的定义通常是YAML格式,在inventory host文件中也可以使用INI格式
anisble变量不仅可以支持简单的key=value格式,而且也支持更复杂的数据结构,例如字典类型等
1.3 变量的作用域
变量的作用域可以分为三种:
-
作用于全局的变量:从命令行或Ansible配置设置的变量
-
作用于play的变量:在play和相关结构中设置的变量
-
作用于host的变量:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量
在变量中,窄范围优先于更广泛的范围:由清单定义的变量将被playbook定义的变量覆盖,后者将被命令行中定义的变量覆盖
1.3.1 作用于全局的变量
-
ansible配置文件会定义一些变量信息,主要是对执行环境,连接信息变量的定义
例如inventory目录,library目录、与目的主机连接方式、越权信息、连接超时时间等 -
系统环境变量
在ansible连接到目的主机时,会以nologin shell登录到目的主机,此时目的主机的/etc/bashrc和~/.basrc的环境变量会被加载,所以这两个文件中设置的环境变量会作用于playbook全局 -
命令行变量
我们可以在执行playbook的命令行指定变量,需要注意的是,**命令行指定的变量在所有其他变量中优先级是最高的。**也就是说如果命令行指定的变量和其他地方指定的变量有冲突时,那么ansible最终会采用命令行定义的变量
ansible-playbook test.yml --extra-vars "IP=192.168.100.110"
1.3.2 作用于play的变量
vars语句定义全局变量
我们可以在playbook中使用vars
语句定义变量,该变量作用于整个play
---
- hosts: node1
vars:
http_port: 80
上面的http_port是一个作用于整个play的变量,对这个play中的tasks、roles、import、include等等之下定义的task均生效
引用变量文件
除了将变量写在playbook中,我们也可以将变量放在一个单独的YAML文件中,通过vars_files
语句来导入
vars_files
变量只能作用于play全局,不能在某个task中单独被引用。vars_files
参数可以使用系统绝对路径或playbook文件的相对路径。
例如:
我们在playbooks目录下创建一个vars-files.yml文件:
---
age=100
在playbook中使用vars_files语句引用该变量文件:
---
- hosts: node2
vars_files: ./vars-files.yaml
tasks:
- debug:
msg: "My age is {{ age }}"
1.3.3 作用于host的变量
- 主机变量
主机变量是指作用在某一台主机上的变量。位置可以与主机清单写在一起也可以写在inventory/host_vars/a_host_name.yml文件里。通常前者使用INI格式,后者使用YAML格式。
如果组变量和主机变量都对同一个主机定义了相同的变量,那么ansible最终会采用主机变量而放弃组变量
- 组变量
和主机变量类似,组变量作用于主机组,即多个主机。位置可以与主机组定义写在一起也可以写在inventory/group_vars/a_group_name.yml文件里。
1.4 变量的使用
一个变量被定义后,在它的作用域内的play可以直接调用, 例如:
我们定义了整个play作用域的变量name
和age
,那么在之后的两个debug模块内可以直接调用
---
- hosts: node2
vars:
name: sunquan
age: 21
tasks:
- debug:
msg: "My name is {{ name }} and I'm {{ age }} years old"
2. 管理机密
2.1 ansible vault
什么是ansible vault
-
ansible提供的ansible vault可以加密和解密任何由ansible使用的结构化数据文件
-
若要使用ansible vault,可通过一个名为ansible-vault的命令行工具创建、编辑、加密、解密和查看文件
-
ansible vault可以加密任何由ansible使用的结构化数据文件
- 包括清单变量、playbook中含有的变量文件、以及在执行playbook时作为参数传递的变量文件,或者ansible角色中定义的变量
2.1.1 使用ansible-vault创建加密文件
-
用
ansible-vault create
命令创建加密的文件,该文件在执行时会提示输入新的vault密码,然后利用vi编辑器打开文件[root@node1 ~]# ansible-vault create test.yml New Vault password: Confirm New Vault password: [root@node1 ~]# cat test.yml $ANSIBLE_VAULT;1.1;AES256 3530393933383336666261613563326561326263333261376130623232663236626433666136653 3561393334386561633137356266383866323362666130660a62303064363139636334623039633 6266636533656435343762333934383162623331346538343234396631616438303432643836646 345313866386462610a303033373666313736666665343435623230383631306165323762613632 6663
-
使用vault密码文件来存储vault密码,而不是通过标准输入途径输入vault密码
//首先创建密码文件 [root@node1 ~]# cat password.txt 123456 //创建加密的YAML文件 [root@node1 ~]# ansible-vault create --vault-password-file=./password.txt test1.yml [root@node1 ~]# cat test1.yml $ANSIBLE_VAULT;1.1;AES256 3364613832386331656462653764373532316337616465373038346336303362343230643130376 6632626436366337646561333936653339303239346436640a35623537393136373735313439613 6566613530303239353435323964643538626364386639616365353235653331343565323238656 6262613335373830360a31303739633135626231376633636535346232336165393433363766303 3234 //已经加密完成
2.1.2 查看已经加密的文件
-
使用
ansible-vault view
命令查看ansible vault加密的文件,而不必打开它进行编辑//查看文件内容 [root@node1 ~]# cat test.yml $ANSIBLE_VAULT;1.1;AES256 3530393933383336666261613563326561326263333261376130623232663236626433666136653 3561393334386561633137356266383866323362666130660a62303064363139636334623039633 6266636533656435343762333934383162623331346538343234396631616438303432643836646 346313866386462610a303033373666313736666665343435623230383631306165323762613632 6663 //[root@node1 ~]# ansible-vault view test.yml Vault password: //这里输入加密的密码 123456
2.1.3 编辑已经加密的文件
-
ansible vault提供
ansible-vault edit
命令继续编辑已经加密的文件;工作时将文件解密为一个临时文件,并允许编辑;保存时,它将复制其内容并删除临时文件//查看已经加密的文件内容 [root@node1 ~]# ansible-vault view test.yml Vault password: 123456 //继续编辑文件内容 [root@node1 ~]# ansible-vault edit test.yml Vault password: [root@node1 ~]# ansible-vault view test.yml Vault password: 123456 654321
2.1.4 加密和解密现有的未加密文件
-
使用
ansible-vault encrypt
加密现有的未加密的文件;此命令可以一次加密多个现有的未加密文件//查看现有的未加密的文件 [root@node1 ~]# cat jiami.yml 1234567 //加密该文件 [root@node1 ~]# ansible-vault encrypt jiami.yml New Vault password: Confirm New Vault password: Encryption successful [root@node1 ~]# cat jiami.yml $ANSIBLE_VAULT;1.1;AES256 6538306336666336396237306534613765323661323737323465613735626663306165336265323 3633626566336438636264316637343435396338373534640a34363134646135356164373732313 3739323837613034386433643036636630646439383235333535653765653664653762383366376 3361393539376336610a38356631396664313736323335313161643931353236326466343866316 3136
-
使用
ansible-vault decrypt
解密现有的已加密的文件;并且是永久解密//查看刚刚加密的文件 [root@node1 ~]# cat jiami.yml $ANSIBLE_VAULT;1.1;AES256 6538306336666336396237306534613765323661323737323465613735626663306165336265323 3633626566336438636264316637343435396338373534640a34363134646135356164373732313 3739323837613034386433643036636630646439383235333535653765653664653762383366376 3361393539376336610a38356631396664313736323335313161643931353236326466343866316 3136 //对文件进行解密 [root@node1 ~]# ansible-vault decrypt jiami.yml Vault password: Decryption successful //查看该文件 [root@node1 ~]# cat jiami.yml 1234567
161643931353236326466343866316
3136
//对文件进行解密
[root@node1 ~]# ansible-vault decrypt jiami.yml
Vault password:
Decryption successful
//查看该文件
[root@node1 ~]# cat jiami.yml
1234567