Ansible 中变量及加密

Posted 123坤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible 中变量及加密相关的知识,希望对你有一定的参考价值。

1. 变量命名

  • 只能包含数字,下划线,字母
  • 只能用下划线或字母开头

2. 变量级别

  • 全局: 从命令行或配置文件中设定的
  • paly: 在play和相关结构中设定的
  • 主机: 由清单,事实收集或注册的任务
  • 变量优先级设定:狭窄范围优先级高于广域范围

3. 变量设定和使用方式

  1. 在playbook中直接定义变量
---
- name: test var
  hosts: all
  vars:
    USER: westosuser
  1. 使用变量
  tasks:
    - name: create user
      user:
        name: "{{ USER }}"

编辑剧本在受控主机中新建用户;

在这里插入图片描述

执行后效果如图所示:

在这里插入图片描述

  1. 在文件中定义变量
vim user_list.yml
---
user: westosuser

vim westos.yml
---
- name: Create User
  hosts: all
  vars_files:
    - ./user_list.yml

在文件中指定变量,文件内容和剧本内容如下图所示:

在这里插入图片描述

执行效果如图所示:

在这里插入图片描述

  1. 设定主机变量和清单变量
    在定义主机变量和清单变量时使用
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

如在清单中指定时,编写的剧本如图所示:

在这里插入图片描述

执行效果如图所示:

在这里插入图片描述

  1. 目录设定变量
    group_vars ##清单变量,目录中的文件名称与主机清单名称一致
    host_vars ##主机变量,目录中的文件名称与主机名称一致

编写剧本内容以及目录中文件名称和内容如图所示:

在这里插入图片描述
执行剧本的效果如图所示:

在这里插入图片描述
对于主机变量:编写剧本内容以及目录中文件名称和内容如图所示
在这里插入图片描述
执行剧本的效果如图所示:

在这里插入图片描述

  1. 用命令覆盖变量
    ansible-playbook user.yml -e “USER=hello”

对于变量的指定,可以直接在命令行后指定,会默认覆盖文件中的变量信息:

在这里插入图片描述

  1. 使用数组设定变量
---
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

执行效果如图所示:

在这里插入图片描述

结果如下图所示:

在这里插入图片描述

  1. 注册变量
    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 表示将输出结果赋值给变量,然后在将变量的结果进行处理;

在这里插入图片描述

如果编写的剧本信息如图所示,没有对赋予的变量值进行处理,将其直接输出的结果如图所示:

在这里插入图片描述

在这里插入图片描述

  1. 事实变量
    事实变量是 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 的过程,事实变量此时也便不能在继续使用。

在这里插入图片描述

  1. 魔法变量
    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的加密控制

ansible自动化运维详解ansible中变量的设定使用JINJA2模板的使用以及ansible的加密控制

Ansible Vault 加密

ansible 配置 vault 加密

如何在库存文件中使用ansible-vault加密密码?