ansible 变量
目录
命名规范
变量的命名应该符如下合两个规范:
- 变量应该由字母、数字、下划线组成
- 变量应该以字母开头
例:
无效的变量名称 | 有效的变量名称 |
---|---|
web server | web_server |
remote.file | remote_file |
1st file | file_1 file1 |
remoteserver$1 | remote_server_1 remote_server1 |
定义变量
优先级顺序:命令行>主机变量>playbook变量
1.Playbook:在play和相关结构中设置的变量
[root@ansible opt]# cat inventory
[lamp]
# 192.168.75.128 #php
# 192.168.75.143 #mysql
[apache]
192.168.75.150 #apache
[apache:vars]
user=yang //设置apache主机的变量,登录用户为yang
//编写一个脚本文件,测试
[root@ansible opt]# cat test.yml
---
- hosts: apache
- tasks: create user
- name:
user:
name: "{{user}}" //创建用户,由于变量user=yang,所以最后创建的用户应该是yang
state: present
//执行
[root@localhost opt]# ansible-playbook /test.yml
PLAY [192.168.75.150] *********************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.75.150]
TASK [install package] *********************************************************
changed: [192.168.75.150]
PLAY RECAP *********************************************************************
192.168.75.150 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
//在受控主机上查看
[root@apache ~]# id yang
uid=1001(yang) gid=1001(yang) 组=1001(yang)
2.在playbook中引用变量
声明了变量后,可以在任务中使用这些变量。若要引用变量,可以将变量名放在双大括号内。在任务执行时,Ansible会将变量替换为其值。
主机变量
直接应用于主机的清单变量分为两在类:
- 主机变量,应用于特定主机
- 组管理,应用于一个主机组或一组主机组中的所有主机
主机变量优先于组变量,但playbook中定义的变量的优先级比这两者更高。
若要定义主机变量和组变量,一种方法是直接在清单文件中定义。这是较旧的做法,不建议采用,但你可能会在未来的工作当中遇到。
定义主机变量
[root@ansible opt]# cat inventory
[lamp]
# 192.168.75.128 #php
# 192.168.75.143 #mysql
[apache]
192.168.75.150 ansible_user=yang #apache //添加apache这台主机的变量
定义组变量
[apache]
192.168.75.150
[apache:vars]
user=yang
通过命令定义变量
清单变量可被playbook中设置的变量覆盖,这两种变量又可通过在命令行中传递参数到ansible或ansible-playbook命令来覆盖。在命令行上设置的变量称为额外变量。
当需要覆盖一次性运行的playbook的变量的已定义值时,额外变量非常有用。例如:
ansible-playbook test.yml -e "user=yang"
定义servers组的user组变量,该组由两个主机组成,每个主机组有两个服务器:
[servers1]
node1.example.com
node2.example.com
[servers2]
node3.example.com
node4.example.com
[servers:children]
servers1
servers2
[servers:vars]
user=joe
此做法存在一些缺点,它使得清单文件更难以处理,在同一文件中混合提供了主机和变量信息,而且采用的也是过时的语法
通过register注册变量
//编写测试文件,使其输出在/root/bai下
---
- hosts: httpd
tasks:
- name:
command: "echo wuhu"
register: result
- name:
shell: "echo {{ result['stdout']}} > /root/bai"
[root@localhost opt]# ansible-playbook playbook/test.yml
PLAY [httpd] *******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.75.150]
TASK [command] *****************************************************************
changed: [192.168.75.150]
TASK [shell] *******************************************************************
changed: [192.168.75.150]
PLAY RECAP *********************************************************************
192.168.75.150 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
//在apache主机上查看结果
[root@www ~]# cat bai
wuhu
机密管理
Ansible可能需要访问密码或API密钥等敏感数据,以便能配置受管主机。通常,此信息可能以纯文本形式存储在清单变量或其他Ansible文件中。但若如此,任何有权访问Ansible文件的用户或存储这些Ansible文件的版本控制系统都能够访问此敏感数据。这显示存在安全风险。
Ansible提供的Ansible Vault可以加密和解密任何由Ansible使用的结构化数据文件。若要使用Ansible Vault,可通过一个名为ansible-vault的命令行工具创建、编辑、加密、解密和查看文件。Ansible Vault可以加密任何由Ansible使用的结构化数据文件。这可能包括清单变量、playbook中含有的变量文件、在执行playbook时作为参数传递的变量文件,或者Ansible角色中定义的变量。
创建加密文件
[root@ansible opt]# ansible-vault create ang.yml //创建机密文件ang.yml
New Vault password:
Confirm New Vault password:
[root@ansible opt]# cat a
ang.yml ansible.cfg apache/
[root@ansible opt]# cat ang.yml //测试是否加密成功
$ANSIBLE_VAULT;1.1;AES256
35336163333631613433636165656163653437633063383737653163663934633236353236333738
6630653861343030663364663864386361353533363338650a333538646439636638613364663734
33326133636365643861336435383338363765393461333235646137373432303564333066336462
3537313566666239350a353866616161353138386238613862643535653463306439663930656335
35393430353931343334303066636366323366366132643335623634636131633633306362376435
6437366261363130626334393862313366393339653434333464
查看加密文件
//查看加密文件,输入密码后即可查看
[root@ansible opt]# ansible-vault view ang.yml
Vault password:
江月何年初照人。江人何年初见月
解密加密文件
[root@ansible opt]# ansible-vault decrypt ang.yml
Vault password:
Decryption successful
[root@ansible opt]# cat ang.yml
江月何年初照人。江人何年初见月
[root@ansible opt]#
加密现有文件
[root@ansible opt]# ansible-vault encrypt ang.yml
New Vault password:
Confirm New Vault password:
Encryption successful
[root@ansible opt]# cat ang.yml
$ANSIBLE_VAULT;1.1;AES256
36636335643732316365623633646438653131376262363538623635323838613939393436326637
3333646166306530323563356338373033323465666262310a356463633666363239646638343037
63636634336164616164623562343861353864303035656564323436393930663831663963373331
3762646136633737300a363136623730303030343630333264633331653933663131616433613435
32643330646466653835393132613231353461373130376364316336303533373465313866636231
3535613134386136616333303733366335646634333730313035
[root@ansible opt]#
更改加密文件密码
[root@ansible opt]# ansible-vault rekey ang.yml
Vault password:
New Vault password:
Confirm New Vault password:
Rekey successful
[root@ansible opt]#