Ansible中的变量及加密
- 一、变量的设定
- 一、变量命名规则
- 二、变量级别
- 三、变量设定和使用方式
- 二、JINJIA2模板
- 一、简介
- 二、使用方法
- 三、jinjia2模板的for循环,if用法
- 一、for循环
- 二、if判断语句
- 三、练习
- 四、文件加密
一、变量的设定
一、变量命名规则
只能包含数字,下划线,字母
只能用下划线或字母开头
二、变量级别
全局:
从命令行或配置文件中设定的
paly:
在play和相关结构中设定的
主机:
由清单,事实收集或注册的任务
三、变量设定和使用方式
这里使用循环定义的方式,使用loop和item实现循环执行
1、在playbook中直接定义变量
---
- name: test
hosts: 172.25.42.200
vars:
user:
- ttt
- qqq
tasks:
- name: user
user:
name: "{{ item }}" 代表循环的每一个变量
state: present
loop: 定义循环
"{{ user }}"
2、在文件中定义变量
定义变量
[ck@ansible ansible]$ cat westos.yml
---
westos:
- hhh
- kkk
使用变量、建立多个用户
[ck@ansible ansible]$ cat test1.yml
---
- name: test
hosts: 172.25.42.200
vars_files:
- ./westos.yml 定义文件位置
tasks:
- name: user
user:
name: "{{ item }}" 每次执行一个westos的值
state: present
loop: 循环定义语句,定义westos的值为多个个
"{{ westos }}"
3、清单使用变量
清单中直接给出变量,yml文件直接执行清单即可引用清单中的变量
清单内容
[westos:vars]
USER=test 直接给予变量
文件内容
[ck@ansible ansible]$ cat test2.yml
/
---
- name: create user
hosts: westos 执行清单,将会直接执行清单的变量
tasks:
- name: user mode
user:
name: "{{ USER }}"
state: present
//
修改清单路径
执行ymal文件,得到结果
4、针对清单生效
设定清单里面的变量
主机的执行清单
[ck@ansible ansible]$ cat westos
[westos]
172.25.42.200
建立用户yml文件
[ck@ansible ansible]$ cat useradd.yml
---
- name: create user
hosts: westos 执行westos清单
tasks:
- name: user mode
user:
name: "{{ USER }}"
state: present
但是目前没有定义USER的变量,可以直接新建特定名称的group_vars文件,系统会自动识别此目录。在文件里设定执行清单westos里的变量USER,注意定义变量清单的名字和定义执行的清单名称必须一致
建立清单、设定清单变量
[ck@ansible ansible]$ mkdir group_vars
[ck@ansible ansible]$ cd group_vars
[ck@ansible group_vars]$ vim westos 此文件必须和执行清单的名字保持一致
///
USER: ppppppp
/
5、针对主机生效
可以针对特定的主机设定特定变量
建立特定的host_vars文件,ansible会自动读取。注意目录中的文件名称与主机名称一致。
[ck@ansible ansible]$ mkdir host_vars
[ck@ansible ansible]$ cd host_vars/
[ck@ansible host_vars]$ vim 172.25.42.200
///
---
USER: ckckckck
///
yml文件为
[ck@ansible ansible]$ cat useradd.yml
---
- name: create user
hosts: westos
tasks:
- name: user mode
user:
name: "{{ USER }}"
state: present
//
6、针对列表生效
单独建立列表,使用数组设定变量。
建立列表
[ck@ansible ansible]$ cat list.yaml
---
LIST:
- name: user1
path: /home/user1
- name: user2
path: /home/user2
设定yml执行文件
[ck@ansible ansible]$ cat test3.yml
///
---
- name: test
vars_files:
- ./list.yml
hosts: westos
tasks:
- name: test
debug:
msg: "{{ item.name }} {{ item.path }}"
loop:
"{{ LIST }}"
7、变量覆盖
使用时加上参数则会覆盖掉yml文件里面变量的设定
ansible-playbook user.yml -e "USER=hello"
8、变量注册
将运行输出的值通过register注册输出给一个变量
[ck@ansible ansible]$ cat test2.yml
///
---
- name: test register
hosts: westos
tasks:
- name: shell
shell: echo hello world
register: westos 将输出全部注册给变量westos
- name: show
debug: debug输出模块
msg: "{{westos}}" msg展示返回的变量westos
当需要输出某个具体的参数时:需要具体指定输出变量
9、事实变量
事实变量是ansible在受控主机中自动检测出的变量,和采集到的主机信息有关
事实变量中还有与主机相关的信息,其变量都是真实存在的,不需要赋值,直接调用即可。
(1)、查看所有的值
[root@ansible ansible] ansible localhost -m setup
(2)、用yml文件看具体值
注意事实变量不用写变量参数前面的ansible
[ck@ansible ansible]$ cat test2.yml
///
---
- name: test fact
hosts: westos
tasks:
- name: show
debug:
msg: "{{ansible_facts['nodename']}}" 修改[]里面参数即可
//
10、魔法变量
和事实变量类似,都是真实存在的变量,和ansible有关
直接执行以下变量即可
列如:
1、ansible软件的内部信息(hostvars:)
ansible localhost -m debug -a "var=hostvars"
2、当前受管主机所在组 (group_names:)
ansible localhost -m debug -a "var=group_names"
3、列出清单中所有的组和主机 (groups:)
ansible localhost -m debug -a "var=groups"
4、包含清单中配置的当前授管主机的名称(inventory_hostname:)
ansible localhost -m debug -a "var=inventory_hostname"
令var变量等于某个参数即可获得该参数信息
二、JINJIA2模板
一、简介
Jinja2是Python下一个被广泛应用的模版引擎
并扩展了其语法和一系列强大的功能。
其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能,可以实现所有变量的运用
二、使用方法
1、jinjia模板的实现
建立yml文件,采用j2模板
[ck@ansible ansible]$ cat test4.yml
//
- name: test j2
hosts: westos
tasks:
- name: create test file
template:
src: ./test.j2 j2文件来源
dest: /mnt/test 被控端执行文件地址
///
建立jtest.j2模板
[ck@ansible ansible]$ cat test.j2
///
{ # test file }
hello world
//
实现了文件的创造
2、jinjia模板实现变量输出
输出被控主机地址解析文件到指定位置
[ck@ansible ansible]$ cat test5.yml
//
- name: test j2
hosts: westos
tasks:
- name: create test file
template:
src: ./hosts.j2
dest: /mnt/test
//
建立hosts.j2文件
[ck@ansible ansible]$ cat hosts.j2
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
{{ ansible_facts['ens3']['ipv4']['address'] }} {{ ansible_facts['fqdn'] }} {{ ansible_facts['hostname'] }}
成功在受控主机端查看到变量生成的解析地址
三、jinjia2模板的for循环,if用法
一、for循环
设定变量
[ck@ansible ansible]$ cat user.yml
users:
- westos
- linux
- ansible
设定jinjia2模板
变量用{{ }}括起来
[ck@ansible ansible]$ cat test1.j2
{% for NAME in users %} for循环设定变量NAME,值来源于变量文件
{{ NAME }} 变量用{{}},每次循环NAME的值都不同
{% endfor %} for循环结束
设定yaml文件
[ck@ansible ansible]$ cat test5.yml
- name: test j2
vars_files: ./user.yml 变量文件
hosts: westos
tasks:
- name: create list
template:
src: ./test1.j2 j2文件来源
dest: /mnt/user_list
成功输出结果
二、if判断语句
当变量等于linux时,只显示记数,不等于linux时,显示记数和变量名称。
设定变量
[ck@ansible ansible]$ cat user.yml
users:
- westos
- linux
- ansible
设定j2文件
loop.index ##循环迭代记数从1开始
loop.index0 ##循环迭代计数从0开始
[ck@ansible ansible]$ cat test1.j2
{% for NAME in users %}
{% if NAME in "linux"%} in 代表“是否等于”
{{ loop.index0 }}
{% endif %}
{% if NAME not in "linux"%}
{{ loop.index0 }} {{ NAME }}
{% endif %}
{% endfor %}
设定yml文件
[ck@ansible ansible]$ cat test5.yml
- name: test j2
vars_files: ./user.yml
hosts: westos
tasks:
- name: create list
template:
src: ./test1.j2
dest: /mnt/user_list
三、练习
在被控主机端生成所有ansible主机的全部地址解析文件
[ck@ansible ansible]$ cat create.yml
//
- name: create hosts
hosts: westos
tasks:
- name: create hosts
template:
src: ./hosts.j2
dest: /mnt/reslove
/
jinjia2模板
在for循环下,利用魔法变量和事实变量结合
[ck@ansible ansible]$ cat hosts.j2
///
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
{% for WESTOS in groups['all'] %}
{{ hostvars[WESTOS]['ansible_facts']['ens3']['ipv4']['address'] }} {{ hostvars[WESTOS]['ansible_facts']['fqdn'] }} {{ hostvars[WESTOS]['ansible_facts']['hostname'] }}
{% endfor %}
四、文件加密
1、创建加密文件、给予密码
[ck@ansible ansible]$ ansible-vault create westos111
///
hello
///
2、普通查看、发现文件已经加密,查看不到密码
3、使用加密的方式查看文件内容
[ck@ansible ansible]$ ansible-vault view westos111
4、编辑加密文件、输入密码更改文件
[ck@ansible ansible]$ ansible-vault edit westos111
可以更改位文件
5、永久解密文件
[ck@ansible ansible]$ ansible-vault decrypt westos111
解密成功,可以直接查看到文件
6、加密现有文件
对刚才解密的文件进行加密
[ck@ansible ansible]$ ansible-vault encrypt westos111
7、更改密码
[ck@ansible ansible]$ ansible-vault encrypt westos111
8、执行加密文件
[ck@ansible ansible]$ ansible-vault encrypt westos111