我们在PlayBook一节中,将PlayBook类比成了Linux中的shell。那么它作为一门Ansible特殊的语言,肯定要涉及到变量定义、控制结构的使用等特性。在这一节中主要讨论变量的定义和使用
变量的名字由字母、下划线和数字组成,必须以字母开头
保留关键字不能作为变量名称
手动通过 -e 参数传递给Ansible 的全局变量
全局变量,是我们使用ansible 或使用ansible-playbook 时,手动通过 -e 参数传递给Ansible 的变量。通过ansible 或 ansible-playbook 的 help 帮助, 可以获取具体格式使用方式
ansible --help | grep var
ansible-playbook --help | grep var
ansible 10.11.67.19 -i hosts -m debug -a “msg=‘i love { {var}}’” -e “var=chenzhiqing”
-e 全局变量写在文件里面,用 -e 传递文件
传递一个YAML/JSON 的形式(注意不管是YAML还是JSON,它们的最终格式一定要是一个字典)
json必须双引号
playbook中的变量用双引号
# cat a.json
{“user”:" qfedu",“type”:" school"}
ansible all -i localhost, -m debug -a “msg=‘user is { { name }}, type is { { type }}’” -e @a.json
# cat a.yml
—
name: qfedu
type: school
…
# ansible all -i localhost, -m debug -a “msg=‘name is { { name }}, type is { { type }}’” -e @a.yml
playbook属性vars定义剧本变量
—
- name: test play vars
hosts: all
vars:
user: lilei
home: /home/lilei
tasks:
- name: create the user { { user }}
user:
name: “{ { user }}”
home: “{ { home }}”
playbook属性vars_files定义剧本变量
当通过vars属性定义的变量很多时,这个Play就会感觉特别臃肿。此时我们可以将变量单独从Play中抽离出来,形成单独的YAML 文件
—
- name: create new user
hosts: web_server
remote_user: root
vars_files:
- /home/kakaops/ansible/vars/users.yaml
tasks:
- name: create “{ { user }}”
user:
name: “{ { user }}”
home: “{ { home }}”
剧本变量的使用 “{ { vars }}” 格式
PlayBook 是YAML 的文件格式, 当Ansible 分析YAML 文件时,变量如果不加上引号,有可能会误解为name: { { user }} 是一个字典的开始。因此加针对变量的使用,加上了双引号,避免Ansible错误解析。msg中的变量不用引号直接{ { vars }}即可
在第二章中我们学习了资产。资产共分为静态资产和动态资产。这一节中学习的资产变量,就是和资产紧密相关的一种变量。
资产变量分为主机变量、组变量、父变量,分别针对资产中的单个主机和组
主机变量
以下资产中,定义了一个主机变量 lilei ,此变量只针对 172.18.0.3 这台服务器有效
[web_servers]
172.18.0.3 user=lilei
172.18.0.4
主机组变量
以下资产中,定义了一个组变量home ,此变量将针对web_servers 这个主机组中的所有服务器有效
[web_servers]
172.18.0.3 user=lilei
172.18.0.4
[web_servers:vars]
home="/home/lilei"
主机变量 VS 组变量
主机变量 > 组变量
变量的继承
在资产继承的同时,对应的变量也发生了继承
[web_servers]
10.11.67.19
[db_servers]
10.11.67.85
[all_servers]
[all_servers:children]
web_servers
[all_servers:vars]
user=sunlizhen
主机变量>组变量>父组变量
Inventory 内置变量的说明
在/etc/ansible/hosts里面定义内置变量
内置变量几乎都是以 ansible_ 为前缀
ansible_ssh_host:将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置
ansible_ssh_port:ssh端口号.如果不是默认的端口号,通过此变量设置
ansible_ssh_user:默认的 ssh 用户名,远程被管理资源的用户
ansible_ssh_pass:ssh 密码(这种方式并不安全,官方强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass:sudo 密码(这种方式并不安全,官方强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8):sudo 命令路径(适用于1.8及以上版本)
ansible_ssh_private_key_file:ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
ansible_python_interpreter:目标主机的 python 路径.适用于的情况:
系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 /usr/local/bin/python3
Facts变量不包含在前文中介绍的全局变量、剧本变量及资产变量之内
Facts变量不需要我们人为去声明变量名及赋值
它的声明和赋值完全由Ansible 中的Facts模块帮我们完成
类似于资产变量中的主机变量,它收集了有关被管理服务器的
操作系统的版本、服务器的IP地址、主机名,磁盘的使用情况、CPU个数、内存大小
等等有关被管理服务器的私有信息
在每次PlayBook运行的时候都会发现在PlayBook执行前都会有一个Gathering Facts的过程
这个过程就是收集被管理服务器的Facts信息过程
手动收集本机Facts变量(-c指定连接类型)
ansible all -i localhost, -c local -m setup
过滤Facts变量
通过刚刚的手动收集Facts,我们发现facts 信息量很大
能不能有针对性的显示我们想要的信息呢?
可以通过使用Facts 模块中的filter参数去过滤我们想要的信息
仅获取服务器的内存情况信息(memory)
ansible 10.11.67.19 -i hosts -m setup -a “filter=memory”
仅获取服务器的磁盘挂载情况
ansible 10.11.67.19 -i hosts -m setup -a “filter=mount”
Playbook中使用Facts变量
默认情况下,在执行PlayBook的时候,它会去自动的获取每台被管理服务器的facts信息,可以像使用其他变量一样,去使用facts 变量
—
- name: print facts variable
hosts: all
tasks:
- name: print facts variable
debug:
msg: “The default IPV4 address is { { ansible_default_ipv4.address }}”
在PlayBook中去关闭Facts 变量的获取
gather_facts: no
若在整个PlayBook 的执行过程中,完全未使用过Facts 变量,此时我们可以将其关闭,以加快PlayBook的执行速度
—
- name: a play example
hosts: all
# 关闭 facts 变量收集功能
gather_facts: no
remote_user: root
tasks:
注册变量往往用于保存一个task任务的执行结果, 以便于debug时使用
或者将此次task任务的结果作为条件,去判断是否去执行其他task任务
注册变量在PlayBook中通过register关键字去实现。
—
- name: install a package and print the result
hosts: all
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=present
register: install_result
- name: print result
debug: var=install_result
当一个变量同时在全局变量、剧本变量和资产变量中定义时,优先级最高的是全局变量;其次是剧本变量;最后才是资产变量。
全局>剧本>资产(主机>组>父组)