目录
1.变量命名
只能包含数字
,
下划线
,
字母
只能用下划线或字母开头
2.变量级别
全局
:
从命令行或配置文件中设定的
paly
:
在play和相关结构中设定的
主机
:
由清单,事实收集或注册的任务
变量优先级设定
:
狭窄范围有限与广域范围
3.变量设定和使用方式
在playbook中直接定义变量
- name: test var
hosts: all
vars:
USER: user
在文件中定义变量
vim user_list.yml
USER: user
vim westos.yml
- name: test var
hosts: all
vars_files:
- ./user_list.yml
使用变量
tasks:
- name: create user
user:
name: "{{ USER }}"
设定主机变量和清单变量
在定义主机变量和清单变量时使用
vim inventory
[host1]
192.168.81.11
[host2]
192.168.81.12
[host1:vars]
USER="user1"
[host2:vars]
USER="user2"
目录设定变量
mkdir group_vars
vim group_vars/host1
vim group_vars/host2
//清单变量,目录中的文件名称与主机清单名称一致
mkdir host_vars
vim host_vars/192.168.81.11
vim host_vars/192.168.81.12
//主机变量,目录中的文件名称与主机名称一致
用命令覆盖变量
ansible-playbook test.yml -e "USER=hahah"
使用数组设定变量
- name: test var
hosts: all
vars:
USER1:
name: user1
id: 123
USER2:
name: user2
id: 456
tasks:
- name:
user:
name: "{{USER1.name}}"
uid: "{{USER1.id}}"
state: present
- name:
user:
name: "{{USER2.name}}"
uid: "{{USER2.id}}"
state: present
注册变量
register
把模块输出注册到指定字符串中
- name: test register
hosts: host1
tasks:
- name: hostname command
shell: hostname
register: test
- name: show messages
debug:
msg: "{{test['stdout']}}"
事实变量
事实变量是
ansible
在受控主机中自动检测出的变量
事实变量中还有与主机相关的信息
ansible localhost -m setup //可以使用命令来查看当前主机的事实变量,并使用正确的变量名和格式在Ansible playbooks中引用这些变量。
当需要使用主机相关信息时不需要采集赋值
,
直接调用即可
因为变量信息为系统信息所以不能随意设定仅为采集信息
,
故被成为事实变量
- name: test fact
hosts: host1
tasks:
- name: show messages
debug:
msg: "{{ansible_facts['nodename']}}"
//host1主机上显示出当前主机的节点名称
gather_facts: no //在playbook中关闭事实变量收集
魔法变量
hostvars: //ansible软件的内部信息
group_names: //当前受管主机所在组
groups: //列出清单中所有的组和主机
inventory_hostname: //包含清单中配置的当前授管主机的名称
JINJA2模板
介绍
Jinja2
是
Python
下一个被广泛应用的模版引擎
他的设计思想来源于
Django
的模板引擎
,
并扩展了其语法和一系列强大的功能
。
其中最显著的一个是增加了沙箱执行功能和可选的自动转译功能
j2模板书写规则
{# /etc/hosts line #} //注释说明文件用途
127.0.0.1 localhost //文件内容
{{ ansible_facts['all_ipv4_addresses'] }} {{ansible_facts['fqdn']}} //使用事实变量
vim jinja.yml
- name: test j2
hosts: host1
tasks:
- name: create test file
template:
src: ./test.j2
dest: /mnt/test
for循环
vim user1.yml
users:
- westos
- linux
- ansible
vim for.j2
- name: test j2
vars_files: ./user1.yml
hosts: host1
tasks:
- name: create list
template:
src: ./test1.j2
dest: /mnt/user_list
if判定
vim test2.j2
{% for NAME in users %}
{% if NAME in "linux" %}
{{ loop.index0 }}
{% endif %}
{% if NAME not in "linux"%}
{{ loop.index0 }} {{ NAME }}
{% endif %}
{% endfor %}
//使用if语句来检查当前的"NAME"是否包含字符串"linux"。如果包含,则使用loop.index0来输出当前索引的值,并在后面添加一个换行。如果不包含,则使用loop.index0输出当前索引的值,并在元素后面添加一个空格和"NAME"本身的值
loop.index //循环迭代记数从1开始
loop.index0 //循环迭代计数从0开始
练习
创建一个名为"hosts"的文件,其中包含了所有主机的IP地址、主机名和完全限定域名。使用源模板文件"./hosts.j2"和目标文件路径"/mnt/hosts"
cat hosts.j2
{% for HOST in groups['all'] %}
{{hostvars[HOST]['ansible_facts']['ens33']['ipv4']['address']}} {{hostvars[HOST]['ansible_facts']['hostname']}} {{hostvars[HOST]['ansible_facts']['fqdn']}}
{% endfor %}
vim host.yml
- name: create hosts
hosts: all
tasks:
- name: create hosts file
template:
src: ./hosts.j2
dest: /mnt/hosts
Ansible的加密控制
创建加密文件
ansible-vault create westos //创建加密文件westos
vim westos-vault
lee
ansible-vault create --vault-password-file=westos-valut westos //创建了一个名为"westos"的Vault文件,并使用密码文件"westos-vault"中指定的密码为其加密
加密现有文件
ansible-vault encrypt test
查看加密文件
ansible-vault view westos
ansible-vault view --vault-password-file=westos-valut westos
编辑加密文件
ansible-vault edit westos1
ansible-vault edit --vault-password-file=westos-valut westos
解密文件
ansible-vault decrypt westos //文件永久解密
ansible-vault decrypt westos --output=linux //文件解密保存在linux
更改密码
ansible-vault rekey westos1
ansible-vault rekey westos1 --new-vault-password-file=key1