Ansible变量
变量命名规则
变量的名字由字母、下划线和数字组成,必须以字母开头如:
good_a
ok_b
传递一个YAML/JSON的形式(注意不管是YAML还是JSON,它们的最终格式一定要是字典)
# cat a.json
{"name":"gyq","type":"student"}
ansible all -i localhost, -m debug -a "msg='name is {{ name }} type is {{type}}'" -e @a.json
# cat a.yaml
---
name: gyq
type: student
...
剧本变量
通过PLAY属性vars定义
通过PLAY属性vars_files定义
如何在PlayBook中使用这些变量
使用{{} 变量名 }
---
- name: test play vars
hosts: all
vars:
user: lilei
home: /home/lilei
tasks:
- name: create the user {{ user }}
user:
name: "{{ user }}"
home: "{{ home }}"
...
在PLayBook中使用变量的注意点,为{}加上双引号避免Ansible把它当字典
资产变量
资产变量分为主机变量和主机组变量,分别针对资产中的单个主机和主机组
主机变量
以下资产中,定义了一个主机变量lilei,此变量只针对192.168.40.137这台服务器有效。
# cat hostsandhostvars
[webservers]
192.168.40.137 user=lilei port=3309
192.168.40.138
验证
//获取定义的变量值
[root@GYQ-master ~]# ansible 192.168.40.137 -i hostsandhostvars -m debug -a "msg='{{user}} {{port}}'"
192.168.40.137 | SUCCESS => {
"msg": "lilei 3309"
}
//未获取到定义的变量值,因为lilei这个变量针对192.168.40.138主机无效
ansible 192.168.40.138 -i hostsandhostvars -m debug -a "var=user"
192.168.40.138 | SUCCESS => {
"user": "VARIABLE IS NOT DEFINED!"
}
主机组变量
以下资产中,定义了一个组变量home,此变量将针对webservers这个主机组的所有服务器有效
# cat hostsandhostvars
[webservers]
192.168.40.137 user=lilei port=3309
192.168.40.138
[webservers:vars]
home="/home/lilei"
验证
ansible webservers -i hostsandhostvars -m debug -a "var=home"
主机变量VS主机组变量
当主机变量和组变量在同一个资产中发生重名的情况,会有什么效果?
# cat hosts_v2
[webservers]
192.168.40.137 user=lilei
192.168.40.138
[webservers:vars]
user=tom
验证
//在资产中定义了主机变量和组变量user,此时发现192.168.40.137这台机器的主机变量user的优先级更高
//优于组变量user使用。
ansible webservers -i hosts_v2 -m debug -a "var=user"
变量的继承
# cat hosts_v3
[webservers]
192.168.40.137
[dbservers]
192.168.40.138
[allservers]
[allservers:children]
dbservers
webservers
[allservers:vars]
user=lilei
验证
//在资产继承的同时,对应的变量也发生了继承
ansible allservers -i hosts_v3 -m debug -a "var=user"
Inventory内置变量的说明
内置变量几乎都是以ansible_为前缀。
ansible_ssh_host
将要连接的远程主机名与你想要设定的主机的别名不同的话,可通过此变量设置。
ansible_ssh_port
ssh端口号.如果不是默认的端口号,通过此变量设置
ansible_ss_user
默认的 ssh 用户名
ansible ssh pass
ssh 密码(这种方式并不安全,官方强烈建议使用 --ask-pass 或ssh 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 使用的私钥文件适用于有多个密钥,而你不想使用SS代理的情况
ansible_python_interpreter
目标主机的 python 路径适用于的情况:系统中有多个 Python或者命令路径不是"/usr/bin/python",比如/usr/local/bin/python3
Facts变量
不需要人为去声明及赋值,完全由setup模块帮我们完成。
它收集了有关被管理服务器的操作系统版本、服务器IP地址、主机名,,磁盘的使用情况、CPU个数、内存大小等等有关被管理服务器的私有信息。
在每次PlayBook运行的时候都会发现在PlayBook执行前都会有一个GatheringFacts的过程。这个过程就是收集被管理服务器的Facts信息过程。
手动手机Facts变量
ansible all -i localhost, -c local -m setup
过滤Facts
通过使用Facts模块中的filter参数去过滤我们想要的信息。
ansible all -i localhost, -m setup -a "filter=*memory*" -c local
在PlayBook中使用Facts变量
默认情况下,在执行PlayBook的时候,它会去自动的获取每台被管理服务器的facts信息。
[root@GYQ-master ~]# cat facts.yml
---
- name: print facts variable
hosts: all
tasks:
- name: print facts variable
debug:
msg: "The default IPV4 address is {{ ansible_default_ipv4.address }}"
...
在PlayBook中去关闭Facts变量的获取
若在整个PlayBook的执行过程中,完全未使用过Facts变量,此时我们可以将其关闭,以加快PlayBook的执行速度。
[root@GYQ-master ~]# cat myplaybook.yml
---
- name: mange web servers
hosts: webservers
gather_facts: no #关闭Facts变量
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=present
- name: copy ngixn.conf to remote server
copy: src=nginx.conf dest=/etc/nginx/nginx.conf
- name: start nginx server
service:
name: nginx
enabled: true
state: started
...
注册变量
往往用于保存一个task任务的执行结果,以便于debug时使用。
或者将此次task任务的结果作为条件,去判断是否去执行其他task任务注册变量在PlayBook中通过register关键字去实现。
[root@GYQ-master ~]# cat myplaybook3.yml
---
- name: install a package and print the result
hosts: webservers
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=present
register: install_result
- name: print result
debug: var=install_result
#执行
ansible-playbook -i hosts myplaybook3.yml
变量优先级
环境准备
1、定义一份资产、且定义了资产变量user
# cat user
[dbservers]
192.168.40.137
[webservers]
192.168.40.138
[allservers:children]
dbservers
webservers
[allservers:vars]
user=tomcat
2、编写一份PlayBook、同样定义剧本变量user
# cat user.yml
---
- name: test variable priority
hosts: all
remote_user: root
vars:
user: mysql
tasks:
- name: print the user value
debug: msg='the user value is {{ user }}'
...
验证测试
同时使用全局变量、剧本变量、资产变量
当变量user同时定义在全局变量、剧本变量及资产变量中时,全局变量的优先级最高。
ansible-playbook -i hosts priority.yml -e "user=www"