ansible变量
变量名的定义
- 变量名应该由字母、数字、下划线组成
- 变量名需要以字母开头
- ansible内置的关键字不能作为变量名
定义变量的三个范围级别
- 全局范围:从命令行或 ansible 配置设置的变量
- play 范围:在 play 和相关结构中设置的变量
- 主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量
注意:如果多个级别上定义了相同名称的变量,优先采用级别最高的变量,窄范围优先于广范围
变量的实现方式
playbook定义变量
name: test
hosts: 192.168.190.133
vars:
test_user: zhangsan 对test_user变量赋值
tasks:
- name: add user
user:
name: '{{ test_user }}' 定义变量,变量名为:test_user
state: present
命令行中赋值变量
[root@localhost project]# ansible-playbook -i inventory -e 'test_user=zhangsan' playbook/ceshi1.yml -e 选项后把zhangsan赋值给变量test_user。
在外部文件定义playbook变量
注意:编写外部变量文件时,注意此文件和playbook最好在同一目录
[root@localhost project]# [root@localhost project]# vim files/vars
port_name: 81
service1_name: web_1
service2_name: web_2
[root@localhost project]# vim apache_server.yml
---
- name: 配置yum与apache
hosts: 192.168.190.133
vars_files:
- files/vars 指定外部变量文件
register 变量注册
对playbook中的某一任务的结果存入到变量中,其后用debug模块调用此变量。
[root@localhost project]# vim playbook/ceshi1.yml
---
- hosts: 192.168.190.134
tasks:
- name: yum install and register
yum:
name: vsftpd
state: present
register: install_log 新建install_log变量,并把yum安装输出内容赋值其中。
- debug: var=install_log 输出变量中内容
TASK [debug] *******************************************************************
ok: [192.168.190.134] => {
"install_log": {
"changed": true,
"failed": false,
"msg": "Check mode: No changes made, but would have if not in check mode",
"rc": 0,
"results": []
}
}
......
使用变量
将变量名称放在双花括号内即可
注意:当变量用作开始一个值的第一元素时,必须使用引号
- name: 创建配置主页文件
shell: cd /var/www/html && mkdir {{ service1_name }} {{ service2_name }}
- copy:
src: files/index1.html
dest: /var/www/html/{{ service1_name }}/index.html
.....
变量分类
- 主机变量(host_vars)
应用于特定主机 - 组变量 (group_vars)
应用于一个主机组或一组主机组中的所有主机
主机变量优先于组变量,但是 playbook 中定义的变量比这两者更高。
常见配置方法
步骤:
(1)创建 group_vars和 host_vars 两个目录,这两个目录分别包含用于定义组变量和主机变量的文件
(2)在 host_vars/group_vars 目录中创建名称与主机/组名匹配的文件来存放变量
创建 group_vars和 host_vars 两个目录时,要与inventory(清单)文件相同目录下创建。
所以一个项目目录中最起码包含:group_vars、host_vars、inventory、playbook.yml
.
├── apache_server.yml
├── files
│ ├── CentOS-Base.repo
│ ├── index1.html
│ ├── index2.html
│ └── vars
├── group_vars
├── host_vars
│ └── 192.168.190.133 创建时必须与被控机IP一致。
│ ├── vars
│ └── vault
├── inventory
└── template
└── vhosts.j2
ansible机密
当我们写的 playbook 中涉及敏感信息,如:数据库账号密码;主机账号密码。这时为了防止这些敏感信息泄露,就可以使用 vault 进行加密。
ansible-vault 命令行操作
创建加密文件
- ansible-vault create
此种方式生成的加密密码需要自己记住,优点在于在系统中没有痕迹。
缺点在于需要手动输入密码,操作较繁琐。
[root@localhost project]# ansible-vault create host_vars/192.168.190.133/vault2
New Vault password:
Confirm New Vault password:
root@localhost project]# vim host_vars/192.168.190.133/vault2 vault2已加密
$ANSIBLE_VAULT;1.1;AES256
643533396434366633326135643830636632313765613662656536386536326165366434
35393938
3436343939303131303062343336313665666237303465640a3
......
对加密的密码进行保护并创建加密文件
此种加密的方式优点在于不用每次都手动输入密码,系统会直接读取配置好的密码文件中的密码。
缺点在于系统中存在密码文件。安全系数下降。
[root@localhost project]# vim .va_key 先准备好自己的加密密码。
123456
[root@localhost project]# ansible-vault create --vault-password-file=.va_key host_vars/192.168.190.133/vault2 创建加密文件vault2,并指向此文件的加密密码为.va_key中的内容。
[root@localhost project]# vim 加密成功 host_vars/192.168.190.133/vault2
$ANSIBLE_VAULT;1.1;AES256
353163393762613439326665626164376233623863653766356163336533626533363437
32373665
......
解密文件
-
ansible-vault view 查看加密的文件名
-
ansible-vault edit 编辑加密的文件名
[root@localhost 192.168.190.133]# ansible-vault view vault2
Vault password: 需要输入加密的密码
key=123456
[root@localhost 192.168.190.133]# ansible-vault edit vault2
Vault password: 用edit编辑之后,默认用vim打开,可以进行编辑。
key=123456
对已存在的文件进行加密
- ansible-vault encrypt
[root@localhost 192.168.190.133]# vim vault2
key=123 新建文件
[root@localhost 192.168.190.133]# ansible-vault encrypt vault2
New Vault password: 需要设置加密的密码
Confirm New Vault password:
Encryption successful
对已加密的问及那进行解密
- ansible-vault decrypt
[root@localhost 192.168.190.133]# ansible-vault decrypt vault2
Vault password: 需要输入加密的密码进行解密
Decryption successful
对加密的密码进行修改
- ansible-vault rekey
[root@localhost 192.168.190.133]# ansible-vault rekey vault2 对vault2修改加密的密码。
Vault password:
New Vault password:
Confirm New Vault password:
Rekey successful
playbook 与 ansible vault
- ansible-playbook --vault-id @prompt
id 后面的内容可选写。默认为default
[root@localhost playbook]# ansible-playbook --vault-id @prompt ceshi1.yml -i /project/inventory 直接在playbook命令行中输入文件的加密的密码。
Vault password (default):
PLAY [192.168.190.133] *********************************************************************************
PLAY RECAP *********************************************************************************************
192.168.190.133 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
变量文件管理的推荐做法
把单独需要加密的内容单独生成一个文件。方便加密文件的管理。通常我们以一个项目为一个主体。
- group_vars:管理主机组的变量
- hosts_vars:管理主机的变量
- 争对每个主机可以新建一个变量目录,下面可分贝存放加密与不加密的变量文件
- inventory: 被控机的存放清单。执行playbook时-i指定清单。
- playbook: 这个project中的playbook存放位置。
[root@localhost project]# tree .
.
├── files
├── group_vars
├── host_vars
│ └── 192.168.190.133
│ ├── vars
│ └── vault
├── inventory
└── playbook
└── ceshi1.yml
ansible事实(facts)
主控机连接被控机后,被控机上对应生成的变量称之为事实。
常见事实包括:主机名称、内核版本、网络接口、IP 地址等
查看被控机事实
使用filter可以筛选指定的facts
- 方法1: Ad-hoc调用对应模块查看
[root@localhost project]# ansible 192.168.190.133 -m setup
192.168.190.133 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.190.133"
],
"ansible_all_ipv6_addresses": [
"fe80::a1fe:e941:fbaf:43cc"
],
"ansible_apparmor": {
......
[root@localhost project]# ansible 192.168.190.133 -m setup -a 'filter=hostname' 查看指定的facts
192.168.190.133 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
- 方法2:playbook利用debug模块查看事实
[root@localhost project]# vim ceshi1.yml
---
- hosts: 192.168.190.133
tasks:
- name: view facts
debug:
var: ansible_facts
动态调用被控机事实
debug模块的msg可以打印自定义信息。
例如:{{ ansible_facts.all_ipv4_addresses }}即可获取事实中ipv4的地址信息。
[root@localhost project]# !vim
vim ceshi1.yml
---
- hosts: 192.168.190.133
tasks:
- name: view facts
debug:
msg:
The IPV4 address of {{ ansible_facts.all_ipv4_addresses }}
效果见下:
TASK [view facts] **************************************************************************************
ok: [192.168.190.133] => {
"msg": "The IPV4 address of ['192.168.190.133']"
}
关闭事实
vim ceshi1.yml
---
- hosts: 192.168.190.133
gather_facts: no 某些情况为了提升系统处理效率,可关闭事实。
tasks:
- name: view facts
debug:
msg:
The IPV4 address of {{ ansible_facts.all_ipv4_addresses }}
自定义事实
注意:创建自定义事实时,最好在目录 /etc/ansible/facts.d下创建,并且事实必须以.fact结尾
如果没有此目录可手动新增,或者在主控机上编写playbook进行新建。
"ansible_local": {
"ceshi": {
"customize": {
"group": "sawyer",
"url": "baidu.com",
"user": "sawyer"
}
}
},
效果见下:
- hosts: 192.168.190.133
tasks:
- name: view facts
debug:
msg:
The host url of {{ ansible_facts['ansible_local']['ceshi']['cu
stomize']['url'] }} 取对应自定义事实的值
ok: [192.168.190.133] => {
"msg": "The host url of baidu.com" OK!!!
}