管理变量
Ansible变量简介
Ansible支持利用变量来存储值,并在Ansible项目的所有文件中重复使用这些值。这可以简化项目的创建和维护,并减少错误的数量。
通过变量,可以轻松地在Ansible项目中管理给定环境的动态值。例如:
要创建的用户
要安装的软件包
要重新启动的服务
要删除的文件
要从互联网检索的存档
命名变量
变量的名称必须以字母开头,并且只能包含字母、数字和下划线。
示例:web server:错误的变量名 web_server:正确的变量名
定义变量
可以在Ansible项目中的多个位置定义变量。这些变量大致可简化为三个范围级别:
全局范围:从命令行或Ansible配置设置的变量
play范围:在play和相关结构中设置的变量
主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量
如果在多个级别定义了相同名称的变量,则采用优先级别最高的变量。窄范围优先于更广泛的范围:由清单定义的变量将被playbook定义的变量覆盖,后者将被命令行中定义的变量覆盖。
playbook中的变量
变量在Ansible Playbook中发挥着重要作用,因为它们可以简化playbook中变量数据的管理。
在Playbook中定义变量
Playbook变量可以通过多种方式定义。一种常见的方式是将变量放在playbook开头的vars块中:
---
- hosts: 192.168.194.138
vars:
user: joee
home: /home/joee
[root@localhost ~]# ansible-playbook -C h.yml
PLAY [192.168.194.138] *********************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.194.138]
PLAY RECAP *********************************************************************
192.168.194.138 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
也可以在外部文件中定义playbook变量。不使用playbook中的vars模块,可以改为使用vars_files指令,
---
- hosts: 192.168.194.138
vars_files:
- vars/users.yml
使用已注册变量捕获命令输出
[root@localhost ~]# vim uo.yml
- name: installs a package and prints the result
hosts: 192.168.194.139
tasks:
- name: install the package
yum:
name: httpd
state: installed
register: install_result
- debug: var=install_result
运行该playbook时,debug模块用于将install_result注册变量的值转储到终端。
[root@localhost ~]# ansible-playbook -C uo.yml
PLAY [installs a package and prints the result] *******************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.194.139]
TASK [install the package] *****************************************************
ok: [192.168.194.139]
TASK [debug] *******************************************************************
ok: [192.168.194.139] => {
"install_result": {
"changed": false,
"failed": false,
"msg": "",
"rc": 0,
"results": [
"httpd-2.4.6-93.el7.centos.x86_64 providing httpd is already installed"
]
}
}
PLAY RECAP *********************************************************************
192.168.194.139 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
---
- name: Fact dump
hosts: all
tasks:
- name: Print all facts
debug:
var: ansible_facts
[root@localhost ~]# ansible-playbook hy.yml
管理变量
Ansible可能需要访问密码或API密钥等敏感数据,以便能配置受管主机。
[root@localhost ~]# mkdir /opt/taobao
[root@localhost ~]# cd /opt/taobao
[root@localhost taobao]# touch playbook.yml
[root@localhost taobao]# touch inveentory
[root@localhost taobao]# ls
inveentory playbook.yml
[root@localhost taobao]# mkdir files
[root@localhost taobao]# mkdir group_vars
[root@localhost taobao]# mkdir host_vars
[root@localhost taobao]# cd
[root@localhost ~]# tree /opt/taobao
/opt/taobao
├── files
├── group_vars
├── host_vars
├── inveentory
└── playbook.yml
3 directories, 2 files
[root@localhost ~]#
创建加密文件
[root@localhost ~]# ansible-vault create htt.yml
New Vault password:
Confirm New Vault password:
[root@localhost ~]#
查看加密的文件
[root@localhost ~]# ansible-vault view htt.yml
Vault password:
编辑现有的加密文件
要编辑现有的加密文件,Ansible Vault提供了ansible-vault edit filename命令。此命令将文件解密为一个临时文件,并允许编辑。保存时,它将复制其内容并删除临时文件。
[root@localhost ~]# ansible-vault edit htt.yml
Vault password: // 编辑时需要密码
解密现有的文件
[root@localhost ~]# ansible-vault decrypt htt.yml --output=secretl-decrypted.yml
Vault password:
更改加密文件的密码
[root@localhost ~]# ansible-vault rekey htt.yml
Vault password: //当前密码
New Vault password: //输入要更改的新密码
Confirm New Vault password: //再次输入要更改的新密码
Rekey successful
管理事实
描述Ansible事实
Ansible事实是Ansible在受管主机上自动检测到的变量。事实中包含有与主机相关的信息,可以像play中的常规变量、条件、循环或依赖于从受管主机收集的值的任何其他语句那样使用。
为受管主机收集的一些事实可能包括:
主机名称
内核版本
网络接口
IP地址
操作系统版本
各种环境变量
CPU数量
提供的或可用的内存
可用磁盘空间
借助事实,可以方便地检索受管主机的状态,并根据该状态确定要执行的操作。例如:
可以根据含有受管主机当前内核版本的事实运行条件任务,以此来重启服务器
可以根据通过事实报告的可用内存来自定义MySQL配置文件
可以根据事实的值设置配置文件中使用的IPv4地址
通常,每个play在执行第一个任务之前会先自动运行setup模块来收集事实
[root@localhost ~]# vim h.yml
- name: Fact dump
hosts: 192.168.194.139
tasks:
- name: Print all facts
debug:
var: ansible_facts
事实 | 变量 |
---|---|
短主机名 | ansible_facts[‘hostname’] |
完全限定域名 | ansible_facts[‘fqdn’] |
IPv4地址 | ansible_facts[‘default_ipv4’][‘address’] |
所有网络接口的名称列表 | ansible_facts[‘interfaces’] |
/dev/vda1磁盘分区的大小 | ansible_facts[‘devices’][‘vda’][‘partitions’][‘vda1’][‘size’] |
DNS服务器列表 | ansible_facts[‘dns’][‘nameservers’] |
当前运行的内核版本 | ansible_facts[‘kernel’] |
如果变量的值为散列/字典类型,则可使用两种语法来获取其值。比如:
ansible_facts['default_ipv4']['address']也可以写成ansible_facts.default_ipv4.address
ansible_facts['dns']['nameservers']也可以写成ansible_facts.dns.nameservers
[root@localhost ~]# ansible-playbook h.yml
PLAY [192.168.194.139]
---
- hosts: 192.168.194.139
tasks:
- name: Prints various Ansible facts
debug:
msg: >
The de fault IPv4 address of {{ ansible_facts.fqdn }}
is {{ ansible_facts.default_ipv4.address }}
~ *************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************
ok: [192.168.194.139]
TASK [Prints various Ansible facts] ************************************************************************************************************************************
ok: [192.168.194.139] => {
"msg": "The de fault IPv4 address of localhost.localdomain is 192.168.194.139\n"
}
PLAY RECAP *************************************************************************************************************************************************************
192.168.194.139 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0