Linux自动化运维工程师
实验所用系统为Redhat
目录
Linux自动化运维工程师–Ansible中的变量及加密
一、变量命名
变量名只能包含数字,下划线和字母,且只能用下划线或字母开头。
二、变量级别
级别 | 设定 |
---|---|
全局变量 | 从命令行或配置文件中设定的 |
play变量 | 在play和相关结构中设定的 |
主机变量 | 清单,事实收集或注册的任务 |
变量优先级设定:狭窄范围有限与广域范围
三、变量设定和使用方式
1、在playbook中直接定义变量
---
- name: test var
hosts: all
vars:
USER: westosuser
实验:安装vsftp和httpd,并开启服务。变量直接在playbook中定义。
vim mean.yml
///
---
- name: install vsftpd httpd
hosts: westos
vars:
SERVICE: ##定义变量为两个服务
- vsftpd
- httpd
tasks:
- name: install ##安装
dnf:
name: "{{ item }}"
state: latest
loop:
"{{ SERVICE }}" ##调用变量
- name: start ##开启
service:
name: "{{ item }}"
state: started
enabled: yes
loop:
"{{ SERVICE }}" ##调用变量
///
2、在文件中定义变量
vim user_list.yml
---
user: westosuser
vim westos.yml
---
- name: Create User
hosts: all
vars_files:
- ./user_list.yml
实验:
安装vsftp和httpd,并开启服务。先编写一个文件用于存放变量,然后编写playbook调用变量文件。
vim mean_list.yml
///
---
SERVICE:
- vsftpd
- httpd
///
vim mean1.yml
///
---
- name: install vsftpd httpd
hosts: westos
vars_files:
- ./mean_list.yml ##调用变量文件
tasks:
- name: install
dnf:
name: "{{ item }}"
state: latest
loop:
"{{ SERVICE }}" ##调用变量文件中的变量
- name: start
service:
name: "{{ item }}"
state: started
enabled: yes
loop:
"{{ SERVICE }}" ##调用变量文件中的变量
///
3、使用变量
tasks:
- name: create user
user:
name: "{{ USER }}"
4、设定主机变量和清单变量
在主机变量下直接定义只属于改主机的清单变量,在playbook中调用主机变量后,可以直接调用其中的清单变量。
实验:
vim inventory
///
[westos] ##主机变量
172.25.254.214
[westos:vars] ##清单变量
USER=test
///
vim user_ctrl.yml
///
---
- name: create user
hosts: westos ##调用主机变量
tasks:
- name: user mode
user:
name: "{{ USER }}" ##调用主机变量中的清单变量
state: present
///
ansible-playbook user_ctrl.yml
###westosb
id test ##在受控机中查看是否建立用户
5、目录设定变量
目录名称 | 变量 |
---|---|
group_vars | 清单变量,目录中的文件名称与主机清单名称一致 |
host_vars | 主机变量,目录中的文件名称与主机名称一致 |
[注意] 目录名称不可变
实验:
实验前,需要删除上一个实验中inventory
中的变量设定
- 清单变量
先建立清单变量的目录,切入该目录,编写一个变量文件,注意文件名称与主机清单名称一致。切回ansible目录,并且执行playbook。此处的playbook内容与上一个实验相同。
mkdir group_vars ##建立清单变量的目录
ls
cd group_vars/ ##切入该目录
vim westos ##编写一个变量文件
///
---
USER: test1
///
cd - ##切回ansible目录
ansible-playbook user_ctrl.yml
###westosb
id test1 ##在受控机中查看是否建立用户
- 主机变量
先删除清单变量的目录,建立主机变量的目录,切入该目录,编写一个变量文件,注意文件名称需要为主机名。切回ansible目录,并且执行playbook。此处的playbook内容与上一个实验相同。
rm -rf group_vars/ ##删除清单变量的目录
mkdir host_vars ##建立主机变量的目录
cd host_vars/ ##切入该目录
vim 172.25.254.214
///
---
USER: test2
///
cd -
ansible-playbook user_ctrl.yml
###westosb
id test2
6、用命令覆盖变量
ansible-playbook user.yml -e "USER=hello"
实验:
ansible-playbook user_ctrl.yml -e "USER=test3"
###westosb
id test3
tips:一键删除这四个用户。
for name in `tail -n 4 /etc/passwd | awk -F : '{ printe $1 }'`
> do
> userdel -r $name
> done
7、使用数组设定变量
vim user_var.yml ##定义数组
---
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}}"
实验:
vim westos.yml ##编辑数组变量文件
///
---
LIST: ##定义数组
- name: user1
path: /home/user1
- name: user2
path: /home/user2
///
vim user_cre.yml
///
---
- name:
vars_files:
- ./westos.yml
hosts: westos
tasks:
- name: test
debug:
msg: "{{ item.name }} {{ item.path }}" ##调用变量
loop:
"{{ LIST }}" ##循环调用数组
///
ansible-playbook user_cre.yml
- 练习:建立apache的虚拟主机www.westos.com和linux.westos.com。
www.westos.com 端口80 ------ >发布目录/var/www/html ------> 发布内容www.westos.com
linux.westos.com 端口80 ------> 发布目录/var/www/virtual/westos.com/linux -----> 发布内容linux.westos.com - 思路分析:首先编写数组文件定义变量,内容需要包含虚拟主机名,发布目录和发布内容。然后编写playbook,首先需要安装httpd,然后建立发布目录并且建立发布文件。编辑httpd配置文件,清空配置,写入主机与对应端口,然后重启服务,并且写入火墙策略。
vim vhost_list.yml ##编写数组文件定义变量
---
WEBS:
- webname: www.westos.com ##虚拟主机名
doc: /var/www/html ##发布目录
index: www.westos.com ##发布内容
- webname: linux.westos.com
doc: /var/www/virtual/westos.com/linux
index:
///
vim vhost.yml
///
---
- name: install web ##安装httpd
vars_files: ./vhost_list.yml
hosts: westos
tasks:
- name: install web
dnf:
name: httpd
state: latest
- name: create index doc ##建立发布目录
file:
path: "{{ item.doc }}"
state: directory
loop:
"{{ WEBS }}"
- name: create index file ##建立发布文件
copy:
dest: "{{ item.doc }}/index.html"
content: "{{ item.index }}"
loop:
"{{ WEBS }}"
- name: clear config ##编辑httpd配置文件,清空配置
file:
name: /etc/httpd/conf.d/vhosts.conf
state: absent
- name: configure vhost ##写入主机与对应端口
lineinfile:
path: /etc/httpd/conf.d/vhosts.conf
create: yes
line: |+
<VirtualHost *:80>
DocumentRoot "{{ item.doc }}"
ServerName "{{ item.webname }}"
</VirtualHost>
loop:
"{{ WEBS }}"
- lineinfile:
path: /etc/httpd/conf.d/vhosts.conf
line: |+
<VirtualHost _default_:80>
DocumentRoot /var/www/html
</VirtualHost>
insertbefore: BOF
- name: start service ##重启服务
service:
name: httpd
state: restarted
enabled: yes
- name: configure firewalld ##写入火墙策略
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
///
8、注册变量
register
把模块输出注册到指定字符串中
---
- name: test register
hosts: 172.25.0.254
tasks:
- name: hostname command
shell:
hostname
register: info
- name: show messages
shell:
echo "{{info['stdout']}}"
实验:
vim register.yml
///
---
- name: test play
hosts: westos
tasks:
- name: shell
shell: echo hello westos
register: westos ##将以上所有输出赋值给westos
ignore_errors: yes
- debug:
msg: " {{westos}} "
///
如果需要捕捉某一个变量,则需要特别指出。
msg: " {{westos['stdout']}} "
9、事实变量
事实变量是ansible在受控主机中自动检测出的变量
事实变量中还有与主机相关的信息
当需要使用主机相关信息时不需要采集赋值,直接调用即可
因为变量信息为系统信息所以不能随意设定仅为采集信息,故被成为事实变量
---
- name: test register
hosts: 172.25.0.254
tasks:
- name: show messages
debug:
msg: "{{ansible_facts['architecture']}}"
gather_facts: no ##在playbook中关闭事实变量收集
实验:
vim fact.vml
///
---
- name: test play
hosts: westos
tasks:
- name: show
debug:
msg: "{{ ansible_facts['nodename']}}"
///
当在playbook中关闭事实变量收集,则会报错。
vim fact.yml
///
hosts: westos
gather_facts: no
10、魔法变量
hostvars: ##ansible软件的内部信息
#eg:
ansible localhost -m debug -a "var=hostvars"
group_names: ##当前受管主机所在组
#eg:
ansible localhost -m debug -a "var=group_names"
groups: ##列出清单中所有的组和主机
#eg:
ansible localhost -m debug -a "var=groups"
inventory_hostname: ##包含清单中配置的当前授管主机的名称
#eg:
ansible localhost -m debug -a "var=inventory_hostname"
四、JINJIA2模板
1、介绍
Jinja2是Python下一个被广泛应用的模版引擎
设计思想来源于Django的模板引擎,
并扩展了其语法和一系列强大的功能。
其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能
2、书写规则
{# /etc/hosts line #} ##注释说明文件用途
127.0.0.1 localhost ##文件内容
{{ ansible_facts['all_ipv4_addresses'] }} {{ansible_facts['fqdn']}} ##使用事实变量
实验:
编写一个j2文件,在playbook中调用。
vim example.j2
///
{# test file #} ##注释
hello westos
///
vim use_j2.yml
///
---
- name: test j2
hosts: westos
tasks:
- name: create test file
template: ##使用JINJIA2模板
src: ./example.j2 ##模板
dest: /mnt/test ##执行结束后结果保存位置
///
ansible-playbook test.yml
作用:
可以使用ansible的所有变量,比如复制文件可以使用copy模块,但是当需要使用变量时,便可以使用JINJIA2。
加入使用JINJIA2做地址解析,则解析文件中写入受控主机的IP,主机名和主机短名称。
cp /etc/hosts hosts.j2
ansible westos -m setup | less ##查看主机信息
vim hosts.j2
///
{{ ansible_facts['ens3']['ipv4']['address'] }} {{ ansible_facts['fqdn'] }} {{ansible_facts['hostname'] }} ##IP,主机名,主机短名称
///
vim use_j2.yml
///
---
- name: test j2
hosts: westos
tasks:
- name: create test file
template:
src: ./hosts.j2
dest: /mnt/hosts
///
ansible-playbook use_j2.yml
3、for循环
实验1:
vim users.yml
---
users:
- westos
- linux
- ansible
vim for.j2
{# test file #}
{% for NAME in users %}
{{ NAME }}
{% end for %}
vim use_j2.yml
---
- name: test j2
vars_files: ./users.yml
hosts: westos
tasks:
- name: create test file
template:
src: ./for.j2
dest: /mnt/for
实验2:迭代计数
vim loop.j2
{% for NAME in users %}
{{loop.index}}{{ NAME }} ##记录循环的次数(index表示从1开始计数,如果index0表示从0开始计数)
{%endfor%}
///
vim use_j2.yml
---
- name: test j2
vars_files: ./users.yml
hosts: westos
tasks:
- name: create test file
template:
src: ./loop.j2
dest: /mnt/loop
///
ansible-playbook use_j2.yml
4、if判定
{% for NAME in users if not NAME == "ansible" %}
User number {{loop.index}} - {{ NAME }}
{%endfor%}
实验:
vim if.j2
{% for NAME in users %}
{% if NAME in "linux" %}
{{loop.index0}}
{% endif %}
{% if NAME not in "linux" %}
{{ loop.index0 }}{{ NAME }}
{% endif %}
{% endfor %}
vim use_j2.yml
---
- name: test j2
vars_files: ./users.yml
hosts: westos
tasks:
- name: create test file
template:
src: ./if.j2
dest: /mnt/if
- 练习:在所有受控主机生成所有受控主机的ip与主机。
cp /etc/hosts hosts.j2
vim hosts1.j2
///
{%for WESTOS in groups['all']%}
{{ hostvars[WESTOS]['ansible_facts']['ens3']['ipv4']['address'] }} {{hostvars[WESTOS]['ansible_facts']['fqdn'] }} {{hostvars[WESTOS]['ansible_facts']['hostname'] }} ##IP,主机名,主机短名称
{%endfor%}
///
vim hosts.yml
///
---
- name: hosts
hosts: westos
tasks:
- name: create test file
template:
src: ./hosts1.j2
dest: /mnt/hosts1
///
ansible-playbook hosts.yml
五、Ansible的加密控制
1、建立并加密文件
ansible-vault create westos
- 使用密码文件westos-vault对westos1进行加密,此时新建westos1
vim westos-vault
///westos
ansible-vault create --vault-password-file=westos-vault westos1
##使用密码文件westos-vault对westos1进行加密,此时新建westos1
2、加密现有文件
ansible-vault encrypt test
3、查看加密文件
ansible-vault view westos
ansible-vault view --vault-password-file=westos-vault westos1
4、编辑加密文件
ansible-vault edit westos
ansible-vault edit --vault-password-file=westos-vault westos1
5、解密文件
- 文件永久解密
ansible-vault decrypt westos
- 文件解密保存为linux,原文件依旧是加密状态
ansible-vault decrypt westos1 --output=linux
6、更改密码
ansible-vault rekey westos1
ansible-vault rekey westos1 --new-vault-password-file=key ##需建立一个文件key,内容是新的密码