Ansible 中变量及加密
Posted 123坤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible 中变量及加密相关的知识,希望对你有一定的参考价值。
Ansible 中变量及加密
1. 变量命名
- 只能包含数字,下划线,字母
- 只能用下划线或字母开头
2. 变量级别
- 全局: 从命令行或配置文件中设定的
- paly: 在play和相关结构中设定的
- 主机: 由清单,事实收集或注册的任务
- 变量优先级设定:狭窄范围优先级高于广域范围
3. 变量设定和使用方式
- 在playbook中直接定义变量
---
- name: test var
hosts: all
vars:
USER: westosuser
- 使用变量
tasks:
- name: create user
user:
name: "{{ USER }}"
编辑剧本在受控主机中新建用户;
执行后效果如图所示:
- 在文件中定义变量
vim user_list.yml
---
user: westosuser
vim westos.yml
---
- name: Create User
hosts: all
vars_files:
- ./user_list.yml
在文件中指定变量,文件内容和剧本内容如下图所示:
执行效果如图所示:
- 设定主机变量和清单变量
在定义主机变量和清单变量时使用
vim inventory
[westos_list1]
172.25.0.254
172.25.0.1
[westos_list2]
172.25.0.2
[westos_list3]
172.25.0.3
[westos_group:children]
westos_list2
westos_list3
[westos_list1:vars] ##清单变量
USER=westos1
如在清单中指定时,编写的剧本如图所示:
执行效果如图所示:
- 目录设定变量
group_vars ##清单变量,目录中的文件名称与主机清单名称一致
host_vars ##主机变量,目录中的文件名称与主机名称一致
编写剧本内容以及目录中文件名称和内容如图所示:
执行剧本的效果如图所示:
对于主机变量:编写剧本内容以及目录中文件名称和内容如图所示
执行剧本的效果如图所示:
- 用命令覆盖变量
ansible-playbook user.yml -e “USER=hello”
对于变量的指定,可以直接在命令行后指定,会默认覆盖文件中的变量信息:
- 使用数组设定变量
---
USER:
lee:
age: 18
obj: linux
westos:
age: 20
obj: java
#vim user.yml
- name: Create User
hosts: all
gather_facts: no
vars_files: ./user_var.yml
tasks:
- name: create user
shell:
echo "{{USER['lee']['age']}}"
echo "{{USER.westos.obj}}"
编写剧本内容和数组信息如图所示:
执行效果如图所示:
编写两个取值信息如图所示:
执行效果如图所示:
测试:
创建一个create web vhost ,具体信息要求如下所示:
www.westos.com 80 默认发布文件在 /var/www/html 中,默认发布文件内容为 www.westos.com;
linux.westos.com 80 默认发布文件在 /var/www/virtual/westos.com/linux 中,默认发布文件内容为 linux.westos.com;
编写剧本内容如下所示:
1 ---
2 - name: Apache vhosts
3 hosts: 172.25.254.100
4 vars: ##赋予变量值
5 - DEFAULT_WEB:
6 Doc: /var/www/html
7 Logs: logs/default.log
8 INDEX: /var/www/html/index.html
9
10 - LINUX_VHOST:
11 Doc: /var/www/virtual/westos.com/linux
12 Logs: logs/linux.log
13 INDEX: /var/www/virtual/westos.com/linux/index.html
14
15 tasks:
16 - name: install Apache ##安装 httpd
17 dnf:
18 name: httpd
19 state: latest
20
21 - name: create index directory ##创建虚拟主机发布目录
22 file:
23 path: /var/www/virtual/westos.com/linux
24 state: directory
25
26 - name: create www index ##创建发布文件
27 lineinfile:
28 path: "{{DEFAULT_WEB ['INDEX']}}"
29 line: www.westos.org
30 create: yes
31
32 - name: create linux index ##创建虚拟主机发布文件
33 lineinfile:
34 path: "{{LINUX_VHOST['INDEX']}}"
35 line: linux.westos.org
36 create: yes
37
38 - name: create vhost.conf ##创建 apache 虚拟主机文件
39 lineinfile:
40 path: /etc/httpd/conf.d/vhost.conf
41 line: "<VirtualHost _default_:80>\\n\\tDocumentRoot {{DEFAULT_WEB['Doc']}}\\n\\tCustomLog {{DEFAULT_WEB['Logs' ]}}\\n</VirtualHost>\\n<VirtualHost *:80>\\n\\tServerName linux.westos.org\\n\\tDocumentRoot {{LINUX_VHOST['Doc']}}\\n\\tC ustomLog {{LINUX_VHOST['Logs']}}\\n</VirtualHost>"
42 create: yes
43
44 - name: configure firewalld ##设定火墙
45 firewalld:
46 service: http
47 state: enabled
48 zone: public
49 permanent: yes
50 state: enabled
51 immediate: yes
执行效果如图所示:
结果如下图所示:
- 注册变量
register 把模块输出注册到指定字符串中
---
- name: test register
hosts: 172.25.0.254
tasks:
- name: hostname command
shell:
hostname
register: info
- name: show messages
shell:
echo "{{info['stdout']}}"
编辑剧本及执行效果如图所示,参数 register
表示将输出结果赋值给变量,然后在将变量的结果进行处理;
如果编写的剧本信息如图所示,没有对赋予的变量值进行处理,将其直接输出的结果如图所示:
- 事实变量
事实变量是 ansible 在受控主机中自动检测出的变量,事实变量中还有与主机相关的信息;
当需要使用主机相关信息时不需要采集赋值,直接调用即可;因为变量信息为系统信息所以不能随意设定仅为采集信息,故被称为事实变量。
---
- name: test register
hosts: 172.25.0.254
tasks:
- name: show messages
debug:
msg: "{{ansible_facts['architecture']}}"
gather_facts: no ##在playbook中关闭事实变量收集
编辑剧本来捕捉受控主机中的 ip ,可以用命令 ansible 172.25.254.100 -m setup |less
来查看其信息,然后根据信息来写 playbook 来采集信息;
对于事实变量的信息采集,在编写 playbook 时,由于前面已经写了 ansible_facts
信息,后面需要写除了 ansible
之外的信息;
如下图所示为编写的剧本以及执行的效果;
注:用命令的方式不能采集事实变量的信息。
编辑一个剧本来采集受控主机的主机名到指定的文件中去;此时虽然没有定义变量,但是也可以采集到,这是因为默认会执行 Gathering Facts
也就是 setup ,会采集事实变量的原因;
如果在剧本中加入gather_facts: no
此时便不再执行 setup 的过程,事实变量此时也便不能在继续使用。
- 魔法变量
hostvars :ansible软件的内部信息;
对于 ansible 的内部变量可以用命令ansible localhost -m debug -a "var=hostvars"
来查看;
group_names: 当前受管主机所在组;
对于当前受管主机所在组可以用命令 ansible 172.25.254.100 -m debug -a "var=group_names"
来查看;
groups: 列出清单中所有的组和主机;
可以用命令 ansible localhost -m debug -a "var=groups"
来列出当前主机清单中所有的组和主机;
inventory_hostname: 包含清单中配置的当前授管主机的名称;
如下所示为显示当前清单中 westos 组中配置的受控主机的名称。
4. JINJA2模板
-
介绍 :
Jinja2 是 Python 下一个被广泛应用的模版引擎;设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。
其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能。 -
j2 模板在playbook中的应用
编写剧本如下所示:
---
- name: test register
hosts: xxxx
tasks:
- name: create hosts
template:
src: ./xxxx.j2
dest: /mnt/hosts
-
j2 模板书写规则
{# /etc/hosts line #} ##注释说明文件用途
127.0.0.1 localhost ##文件内容
{{ ansible_facts[‘all_ipv4_addresses’] }} {{ansible_facts[‘fqdn’]}} ##使用事实变量
如编写剧本内容和 j2 文件内容以及执行剧本的结果如如下图所示:
从生成的文件内容可以看到,此模板的好处就是根据主机的信息生成内容,而不是固定不变的内容。
for循环
如编写一个 j2 和 剧本的内容如下所示:
[root@Ansible .ansible]# cat westos.yml
---
- name: test j2
hosts: westos
vars:
user:
- westos
- zxk
- linux
tasks:
- name: test.j2
template:
src: ./test.j2
dest: /mnt/forfile
[root@Ansible .ansible]# cat test.j2
{% for NAME in user %}
{{NAME}}
{% endfor %}
执行剧本之后的效果查看:
if 判定
如编写一个 j2 和 剧本的内容如下所示:
[root@Ansible .ansible]# vim test.j2
[root@Ansible .ansible]# cat test.j2
{% for NAME in user if not NAME == "zxk" %}
{{loop.index0}}-{{NAME}}
{% endfor %}
其中 loop.index
表示循环迭代记数从1开始;如果是 loop.index0
表示循环迭代计数从0开始。
[root@Ansible .ansible]# vim westos.yml
[root@Ansible .ansible]# cat westos.yml
---
- name: test j2
hosts: westos
vars:
user:
- westos
- zxk
- linux
tasks:
- name: test.j2
template:
src: ./test.j2
dest: /mnt/forfile
执行剧本之后的效果查看如下图所示;如果去掉 j2 文件中的 not
此时只会显示等于的名称;
如编写一个剧本和 j2 来判断信息一个表中是否有对应的信息,有对应的信息时显示对应的信息,没有对应信息的时候显示指定的信息;
编辑 j2 模板文件如下图所示:
[root@Ansible .ansible]# vim test.j2
[root@Ansible .ansible]# cat test.j2
{% for NAME in user %}
name: {{NAME['name']}}
{% if NAME['age'] is defined %} ##表示当 age 被定义时
age: {{NAME['age']}}
{% endif %}
{% if NAME['age'] is not defined %} ##表示当 age 未被定义时
age: X
{% endif %}
{% endfor %}
编写剧本如下所示:
[root@Ansible .ansible]# vim westos.yml
[root@Ansible .ansible]# cat westos.yml
---
- name: test j2
hosts: westos
vars:
user:
- name: zxk
age: 24
- name: ayl
age: 20
- name: yl
- name: jdd
age: 23
tasks:
- name: test.j2
template:
src: ./test.j2
dest: /mnt/agefile
执行效果查看如下图所示:
5. Ansible的加密控制
- 创建建立文件
对于前面我们所写的剧本都是非加密的,如果需要对其加密,可以在书写时用如下的命令来对其加密;ansible-vault create westos
如图用命令 ansible-vault create westos
来所写的剧本需要输入两次密码,在写好之后默认是不能被查看的,而之前方式所写的剧本是可以被查看到的。
除了以上交互式输入密码的方式之外,还可以用非交互的文件的模式来用命令指定文件;ansible-vault create --vault-password-file=kkk linux.yml
,其中kkk 表示文件中指定的密码;westos.yml 表示新建的名称。
- 加密现有文件
对于之前已经存在文件的加密可以用命令ansible-vault encrypt westos1.yml
来对其加密;如图所示对现有文件加密时也需要输入两次密码。
也可以用交互式来指定文件ansible-vault encrypt westos1.yml --vault-password-file=kkk
对其加密。
- 查看加密文件
对于加密文件的查看用命令ansible-vault view westos.yml
来对其查看;
也可以采用非交互的方式用命令ansible-vault view --vault-password-file=kkk westos.yml
指定正确的文件来查看文件。
- 编辑加密文件
对于加密文件的编辑可以用命令 ansible-vault edit westos1.yml
来编辑,也可以用命令ansible-vault edit --vault-password-file=kkk westos1.yml
采用非交互的模式来对其编辑。
- 解密文件
对于加密文件的执行,需要先对其解密,或者加入其他的参数来执行;解密可以用命令ansible-vault decrypt westos.yml
来对其永久解密;也可以用命令ansible-vault decrypt westos.yml --output=linux
将加密文件解密保存为 linux;
加入的参数用命令 ansible-playbook apache_install.yml --ask-vault-pass
来执行加密的剧本;
- 更改密码
对于密码的更改可以用命令ansible-vault rekey westos1.yml
来对其更改密码;
也可以用非交互的模式来对其更改密码ansible-vault rekey westos1 --new-vault-password-file=key1
。
以上是关于Ansible 中变量及加密的主要内容,如果未能解决你的问题,请参考以下文章
ansible自动化运维详解ansible中变量的设定使用JINJA2模板的使用以及ansible的加密控制
ansible自动化运维详解ansible中变量的设定使用JINJA2模板的使用以及ansible的加密控制