目录
一、变量的设定
二、变量的使用方式
1、在playbook中直接定义变量
2、在文件中定义变量
3、设定主机变量和清单变量
4、目录设定变量
5、用命令覆盖变量
6、使用数组设定变量
7、注册变量
8、事实变量
9、魔法变量
三、JINJA2模板
四、加密控制
1、创建加密文件
2、查看加密文件
3、编辑加密文件
4、加密现有文件
5、更改加密文件密码
6、解密文件
7、执行加密文件
一、变量的设定
1、变量的命名规则:
(1)只能包含数字,下划线,字母;
(2)只能用下划线或字母开头;
(3)ansible内置的关键字不能作为变量名。
2、变量的级别:
3、变量优先级:
全局 > play
> 主机
全局 | 从命令行或配置文件中设定的 |
play | 在play 和相关结构中设定 |
主机 | 由清单,事实收集或注册的任务 |
二、变量的使用方式
- 这里使用循环定义的方式,使用
loop
和item
实现循环执行
1、在playbook中直接定义变量
vim test.yml- name: test varhosts: allvars:TEST: hello aletasks:- name: filedebug:msg: "{{ TEST }}"ansible-playbook test.yml
2、在文件中定义变量
vim file.ymlTEST: hello alevim test.yml- name: test varhosts: allvars_files:- ./file.ymltasks:- name: filedebug:msg: "{{ TEST }}"
3、设定主机变量和清单变量
[test1]
192.168.67.112[test2]
192.168.67.113[test1:vars]
TEST=hello yyl[test2:vars]
TEST=hello alevim test.yml- name: test varhosts: allvars:tasks:- name: filedebug:msg: "{{ TEST }}"
4、目录设定变量
group_vars | 清单变量,目录中的文件名称与主机清单名称一致 |
host_vars | 主机变量,目录中的文件名称与主机名称一致 |
group_vars和host_vars之前注释inventory 内定义的
mkdir group_vars
cd group_vars/vim test1
TEST: hello yyl
vim test2
TEST: hello alevim test.yml- name: test varhosts: allvars:tasks:- name: filedebug:msg: "{{ TEST }}"
host_vars:
mkdir host_vars
cd host_vars/vim 192.168.67.112
TEST: hello yyl
vim 192.168.67.113
TEST: hello ale- name: test varhosts: allvars:tasks:- name: filedebug:msg: "{{ TEST }}"
5、用命令覆盖变量
ansible-playbook test.yml -e "TEST=hahahaha"
6、使用数组设定变量
vim user_var.yml- name: test varhosts: allvars:USER1:name: user1id: 123USER2:name: user2id: 456tasks:- name:user:name: "{{USER1.name}}"uid: "{{USER1.id}}"state: present- name:user:name: "{{USER2.name}}"uid: "{{USER2.id}}"state: present
7、注册变量
register
:把模块输出注册到指定字符串中 要输出单独参数时,指定输出变量
vim reg.yml- name: test registerhosts: alltasks:- name: hostname commandshell:hostnameregister: info- name: show messagesshell:echo "{{info['stdout']}}"
8、事实变量
事实变量是ansible在受控主机中自动检测出的变量,事实变量中还有与主机相关的信息;
当需要使用主机相关信息时不需要采集赋值,直接调用即可;
因为变量信息为系统信息所以不能随意设定仅为采集信息,故被成为事实变量。
vim 1.yml- name: test registerhosts: alltasks:- name: show messagesdebug:msg: "{{ansible_facts['architecture']}}"
gather_facts: no ##在playbook中关闭事实变量收集
9、魔法变量
和事实变量类似,都是真实存在的变量,和ansible有关;直接执行以下变量即可。
##ansible软件的内部信息
ansible localhost -m debug -a "var=hostvars"
##当前受管主机所在组
ansible all -m debug -a "var=group_names"
##列出清单中所有的组和主机
ansible localhost -m debug -a "var=groups"
##包含清单中配置的当前授管主机的名称
ansible localhost -m debug -a "var=inventory_hostname"
三、JINJA2模板
Jinja2是Python下一个被广泛应用的模版引擎 他的设计思想来源于Django的模板引擎, 并扩展了其语法和一系列强大的功能。 其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能 。
j2模板书写规则
{# /etc/hosts line #} ##注释说明文件用途
127.0.0.1 localhost ##文件内容
{{ ansible_facts['all_ipv4_addresses'] }} {{ansible_facts['fqdn']}} ##使用事实变量
j2模板的实现:
vim jinja.yml---
- name: testjinjahosts: server2tasks:- name: create filetemplate:src: ./test.j2 ##j2模板来源dest: /mnt/test ##远程主机执行文件地址
for循环和 if 的用法:
for循环:
设定j2模板,变量要用{{ }}
括起来
{% for NAME in users %} ##for循环设定变量NAME,变量来源于变量文件
{{ loop.index }} {{ NAME }} ##变量用 {{ }} 括起来
{% endfor %} ##for循环结束
if判断:
{% for NAME in users %}
{% if NAME in "linux"%} ##in表示等于时
{{ loop.index0 }} ##等于时只记数
{% endif %}
{% if NAME not in "linux"%} ##not in表示不等于时
{{ loop.index0 }} {{ NAME }} ##不等于时记数加变量
{% endif %}
{% endfor %}
练习:
使用j2模板 写hosts解析文件
vim hosts.yml- name: create hostshosts: alltasks:- name: create hosts filetemplate:src: ./hosts.j2dest: /mnt/hostsvim hosts.j2{% for HOST in groups['all'] %}
{{hostvars[HOST]['ansible_facts']['ens33']['ipv4']['address'] }} {{hostvars[HOST]['ansible_facts']['hostname']}}
{% endfor %}
四、加密控制
1、创建加密文件
ansible-vault create yyl
cat yyl
2、查看加密文件
vim authyyl 123
ansible-vault view yyl
ansible-vault view --vault-password-file=authyyl yyl
3、编辑加密文件
ansible-vault edit --vault-password-file=authyyl yyl
ansible-vault view --vault-password-file=authyyl yyl
4、加密现有文件
ansible-vault encrypt yyl.yml
5、更改加密文件密码
ansible-vault rekey yyl文件更改密码
vim authyyl 123456
ansible-vault rekey yyl --new-vault-password-file=authyyl
ansible-vault view yyl
6、解密文件
ansible-vault decrypt yyl
ansible-vault decrypt test.yml
7、执行加密文件
ansible-playbook test.yml --ask-vault-pass