一、变量的命名规则

变量由字母、下划线和数字组成,必须以字母开头

注意:保留关键字不能作为变量名称
比如:add, append, as_integer_ratio, bit_length, capitalize, center, clear等等

二、变量类型

  • 全局变量
  • 剧本变量
  • 资产变量

    1. 全局变量

    全局变量,是使用ansible 或使用ansible-playbook 时,手动通过 -e 参数传递给Ansible 的变量

    通过ansible 或 ansible-playbook 的 help 帮助, 可以获取具体格 式使用方式

Example:

1)传递普通的key=value 形式的变量
[root@localhost ~]# ansible all -i localhost, -m debug -a “msg=’my key is {{ key }}’” -e “key=value”
image.png
2) 传递YAML/JSON 形式的变量 ( 不管是YAML/JSON,它们最终的格式⼀定要是⼀个字典 )
[root@localhost ~]# cat a.json
image.png
[root@localhost ~]# ansible all -i localhost, -m debug -a “msg=’name is {{ name }}, type is {{ type }}’” -e @a.json
image.png

[root@localhost ~]# cat a.yml
image.png
[root@localhost ~]# ansible all -i localhost, -m debug -a “msg=’name is {{ name }}, type is {{ type }}’” -e @a.yml
image.png

2. 剧本变量

定义在PlayBook中的 ,它的定义方式有多种

1)通过PLAY 属性 vars 定义

  1. ---
  2. - name: test play vars
  3. hosts: all
  4. vars:
  5. user: lilei
  6. home: /home/lilei

2) 通过PLAY 属性 vars_files 定义

# 当通过vars属性定义的变量很多时,这个Play就会感觉特别臃肿,
# 此时我们可以将变量单独从Play中抽离出来,形成单独的YAML⽂件
---
- name: test play vars
  hosts: all
  vars_files:
    - vars/users.yml
[root@localhost ~]# cat vars/users.yml<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/667991/1645969210770-4b004d89-0e4b-4546-9eb2-8af40a2117f1.png#clientId=uf724bdd2-273a-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=89&id=ucf259c3f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=152&originWidth=854&originalType=binary&ratio=1&rotation=0&showTitle=false&size=11768&status=done&style=none&taskId=ub0214b40-43ca-4191-82d9-edba915b7f1&title=&width=500)

在PlayBook中使用剧本变量:
在PlayBook中使用剧本变量时,使用 {{ 变量名 }} 来使用
[root@localhost ~]# vim test.yml

---
- name: test play vars
  hosts: all
  vars:
     user: lilei
     home: /home/lilei
  tasks:
     - name: create the user {{ user }}
       user:
          name: "{{ user }}"
          home: "{{ home }}"

[root@localhost ~]# ansible-playbook -i localhost, test.yml -C
image.png

注意:使用剧本变量时,必须要用双引号;
当没使用双引号时, Ansible 分析YAML文件件有可能会误认为是字典 ;

3. 资产变量

1)资产中定义的主机变量,只对相应的主机有效

以下资产中,定义了⼀个主机变量 Muyb ,此变量只针对 192.168.10.102 这台服务器有效

[root@localhost ~]# cat hostsandhostvars
image.png
验证:
[root@localhost ~]# ansible 192.168.10.102 -i hostsandhostvars -m debug -a “msg=’{{user}} {{port}}’”
image.png

2)主机变量 VS 主机组变量

当在资产中定义了主机变量和组变量,则这台机器的主机变量优先级更高
[root@localhost ~]# cat host_v2
image.png
[root@localhost ~]# ansible webservers -i host_v2 -m debug -a “var=user”
image.png

3)变量的继承

在资产继承的同时,对应的变量也会继承
[root@localhost ~]# cat hosts_v3
image.png
[root@localhost ~]# ansible allservers -i hosts_v3 -m debug -a “var=user”
image.png
[root@localhost ~]# ansible dbservers -i hosts_v3 -m debug -a “var=user”
image.png
[root@localhost ~]# ansible webservers -i hosts_v3 -m debug -a “var=user”
image.png

4) Inventory 内置变量

内置变量几乎都是以 ansible_ 为前缀

ansible_ssh_host :将要连接的远程主机名与你想要设定的主机的别名不同时,可通过此变量进行设置
ansible_ssh_port :ssh端口号  如果不是默认的端口号,通过此变量设置.
ansible_ssh_user :修改默认的 ssh 用户(注意:如果是新设用户,新用户须与被管理节点建立信任关系)
ansible_ssh_pass :ssh 密码 (这种⽅式并不安全,官⽅强烈建议使⽤ --askpass 或 SSH 密钥)
ansible_sudo_pass :sudo 密码(这种⽅式并不安全,官⽅强烈建议使⽤ --asksudo-pass)
ansible_sudo_exe :sudo 命令路径(适⽤于1.8及以上版本)
ansible_ssh_private_key_file :ssh 使用的私钥⽂件(适⽤于有多个密钥,⽽不想使用SSH 代理的情况)
ansible_python_interpreter :⽬标主机的 python 路径(适用于系统中有多个Python, 或者命令路径不是"/usr/bin/python")

192.168.10.103 的ssh 端口为2222
[root@localhost ~]# netstat -anlp | grep sshd
image.png
[root@localhost ~]# cat hosts_v3
image.png
[root@localhost ~]# ansible dbservers -i hosts_v3 -m shell -a”ls”
image.png
此时,修改hosts_v3,给192.168.10.103添加port端口的内置变量
[root@localhost ~]# cat hosts_v3
image.png
[root@localhost ~]# ansible dbservers -i hosts_v3 -m shell -a”ls”
image.png

4. Facts变量

Facts变量收集有关被管理服务器的操作系统版本、服务器IP地址、主机 名、磁盘的使用情况、CPU个数、内存大小等有关被管理服务器的私有信息

备注: 在每次PlayBook运行的时候都会发现在PlayBook执行前都会有一个Gathering Facts的过程。这个过程就是收集被管理服务器的Facts信息过程。

1) 手动收集Facts 变量

[root@localhost ~]# ansible all -i localhost, -c local -m setup
image.png

2) 过滤Facts 信息

手动收集的Facts信息量很大, 可通过使用Facts 模块中的filter参数过滤我们想要的信息

获取服务器的内存情况信息 :
[root@localhost ~]# ansible all -i localhost, -m setup -a “filter=memory“ -c local
image.png
获取服务器的磁盘挂载情况 :
[root@localhost ~]# ansible all -i localhost, -m setup -a “filter=mount“ -c local
image.png

3) PlayBook中使用Facts 变量

默认情况下,在执行PlayBook的时候,会去自动获取每台被管理服务器的facts信息

[root@localhost ~]# ansible-playbook -i hosts myplaybook.yml -C
image.png

可以像使用其他变量⼀样,去使用facts 变量

---
- name: print facts variable
  hosts: all
  tasks:
     - name: print facts variable
        debug:
          msg: "The default IPV4 address is {{ ansible_default_ipv4.address }}"
...

4) PlayBook中关闭Facts 变量的获取

若在整个PlayBook 的执行过程中,未使用过 Facts 变量,此时可将其关闭,以加快PlayBook的执行速度
[root@localhost ~]# cat myplaybook2.yml

---
- name: a play example
  hosts: webservers
  # 关闭 facts 变量收集功能
  gather_facts: no
  remote_user: root
  tasks:
    - name: install nginx package
      yum: name=nginx state=present
    - name: copy nginx.conf to remote server
      copy: src=nginx.conf dest=/etc/nginx/nginx.conf
    - name: start nginx server
      service:
        name: nginx
        enabled: true
        state: started
[root@localhost ~]# ansible-playbook -i hosts myplaybook2.yml -C<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/667991/1646022913736-de243558-2914-43f8-b0ca-bfe1247fe77b.png#clientId=ub92b1423-2b55-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=179&id=u46f9b234&margin=%5Bobject%20Object%5D&name=image.png&originHeight=443&originWidth=1489&originalType=binary&ratio=1&rotation=0&showTitle=false&size=47078&status=done&style=none&taskId=u91a6ef7d-2bd8-468e-bbf4-e0e4b52ab0f&title=&width=600)

5. 注册变量

用于保存⼀个task任务的执行结果, 以便于debug时使用;
或者将此次task任务的结果作为条件,去判断是否去执行其他task 任务;

注册变量在PlayBook用register关键字去实现

[root@localhost ~]# cat myplaybook3.yml

---
- name: myplaybook3.yml
  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

[root@localhost ~]# ansible-playbook -i hosts myplaybook3.yml -C
image.png

三、变量优先级

Facts变量不需要人为去声明、赋值;
注册变量只需通过关键 字register去声明,而不需要赋值 ;
全局变量、剧本变量及资产变量需要人为的去声明、赋值 ;

1) 当变量同时定义在全局变量、剧本变量及资产变量中时,全局变量的优先级最高
2) 取消全局变量,发现剧本变量的优先级要高于资产变量的优先级
3) 不使用全局变量、且注释掉剧本变量后,资产变量才最终生效