目录
一、变量命名
只能包含数字,下划线,字母
只能用下划线或字母开头
二、变量级别
全局 | 从命令行或配置文件中设定的 |
主机 | 由清单,事实收集或注册的任务 |
paly | 在play和相关结构中设定的 |
变量优先级设定:狭窄范围优先于广域范围(play > 主机 > 全局)
三、变量设定和使用方式
1、使用变量
2、在playbook中直接定义变量
1 ---
2 - name: test yml #项目名称
3 hosts: westos #远程主机名单
4 vars: #定义变量
5 NAME: zzh
6 tasks:
7 - name: create user #定义子项目
8 user:
9 name: "{{NAME}}" #使用变量
用法:
3、在文件中定义变量
1 ---
2 - name: test yml
3 hosts: westos
4 vars_files: user.yml #调用变量的文件
5 tasks:
6 - name: create user
7 user:
8 name: "{{NAME}}"
用法:先创建一个<user.yml>文件,文件中写入变量名。在剧本中按如下方式调用文件中的变量。
4、设定主机变量和清单变量
1 ---
2 - name: test yml
3 hosts: test #要指定的变量就在组中
4 tasks:
5 - name: create user
6 user:
7 name: "{{NAME}}"
在清单中添加变量,则变量只对具体的组生效。写法:[组名:vars]
用法:
5、目录设定变量
group_vars | 清单变量,目录中的文件名称与主机清单名称一致 |
host_vars | 主机变量,目录中的文件名称与主机名称一致 |
方法一:
方法二:
6.用命令覆盖变量
注意:此方法具有最高优先级
ansible-playbook test.yml -e "NAME=westos_zzh"
7.使用数组设定变量
适合多个变量的定义
1 ---
2 - name: test yml
3 hosts: test
4 vars_files: ./user.yml #指定变量存储文件
5 tasks:
6 - name: show vars #子项目1
7 debug:
8 var: USERLIST['lee']['age'] #显示USERLIST下的lee的age中的变量
9
10 - debug: #子项目2
11 msg: "{{USERLIST['westos']}}" #显示USERLIST下的westos部分的变量
在同一目录下创建存储变变量的文件。
显示多个变量
8.注册变量
register 把模块的输出捕捉并写入到到指定字符串中。
1 ---
2 - name: test register
3 hosts: test
4 tasks:
5 - name: hostname command
6 shell:
7 hostname
8 register: info #将子项目的输出存储为info列表里
9
10 - name: show messages
11 debug:
12 msg: "{{info['stdout']}}" #从info列表中选择输出“stdout”变量
13
14 - name: show rc #从info列表中选择输出“rc”变量
15 debug:
16 var: info['rc']
9.事实变量——ansible_facts
可用以下命令采集受控主机的事实信息:
ansible 172.25.254.151 -m setup
事实变量是ansible在受控主机中自动检测出的变量;
事实变量中还有与主机相关的信息;
当需要使用主机相关信息时不需要采集赋值,直接调用即可;
因为变量信息为系统信息所以不能随意设定仅为采集信息,故被成为事实变量。
1 ---
2 - name: test register
3 hosts: test
4 tasks:
5 - debug:
6 var: ansible_facts['enp1s0']['ipv4']['address'] #筛选事实变量下的数据
保存变量的值:
1 ---
2 - name: test register
3 hosts: test
4 tasks:
5 - lineinfile:
6 path: /mnt/address
7 line: "{{ ansible_facts['enp1s0']['ipv4']['address']}}"
8 create: yes
保存enp1s0网卡上的ipv4地址到受控主机的</mnt/address>文件中
注意: gather_facts: no ##在playbook中关闭事实变量收集
此参数会加快执行速度,但是不会收集事实变量导致结果不准确甚至报错。
10.魔法变量
hostvars: | ansible软件的内部信息 |
group_names: | 当前受管主机所在组 |
groups: | 列出清单中所有的组和主机 |
inventory_hostname: | 包含清单中配置的当前授管主机的名称 |
魔法变量也就是ansible主机的内部变量
ansible localhost -m debug -a 'var=hostvars' #显示ansible软件的内部信息
ansible test -m debug -a 'var=groups' #列出清单中所有的组和主机
ansible test -m debug -a 'var=inventory_hostname' #包含清单中配置的当前授管主机的名称
ansible test -m debug -a 'var=group_names' #当前受管主机所在组
四、JINJA2模板
Jinja2是Python下一个被广泛应用的模版引擎。他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能
j2模板书写规则
测试:
~~~~
测试:
~~~~~
实验:
测试:
五、Ansible的加密控制
练习:
在所有的客户机中的</mnt>下生成一个“hosts”文件,文件内容与</etc/hosts>中的文件内容相同。
本章总结
~~~~~~j2模板以后的内容由于时间原因尚未写完~~~~~~持续更新中~~~~~~