Ansible4--------ansible中的变量及加密

变量

1.变量命名

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

2.变量级别

全局 从命令行后配置文件中设定的
paly: 在play和相关结构中设定的
主机: 由清单,事实收集或注册的任务

变量优先级设定:
狭窄范围有限与广域范围

3.变量设定和使用方式

3.1.在playbook中直接定义变量

---
- name: test var
  hosts: all
  vars:
    USER: westosuser

3.2.在文件中定义变量

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

3.3.使用变量

  tasks:
    - name: create user
      user:
        name: "{
   
   { USER }}"

playbook 1 (在playbook中直接使用变量并使用)

[westos@ansible ~]$ cat create_user.yml 
---
- name: create user
  hosts: 172.25.11.1
  vars:
    user: westosuser
  tasks:
    - name: create user
      user:
        name: "{
   
   { user}}"

在这里插入图片描述
在受控主机中查看

在这里插入图片描述
playbook 2(在文件中定义变量并使用)

[westos@ansible ~]$ cat create_user.yml 
---
- name: create user
  hosts: 172.25.11.1
  vars_files: 
    - user_list.yml
  tasks:
    - name: create user
      user:  
        name: "{
   
   {user}}"
[westos@ansible ~]$ cat user_list.yml    ##建立用户的名单;相比较于直接写,文件中可以被多次利用
---
user: westosuser3


在这里插入图片描述
在受控主机1中查看结果
在这里插入图片描述

3.4.设定主机变量和清单变量

在定义主机变量和清单变量时使用

vim inventory

[westos_list1]
172.25.11.1

[westos_list2]
172.25.11.2


[westos_list3]

172.25.11.3

[westos_list1:vars]    ##在清单中设置变量
user=inventory

vim create_user.yml

---
- name: create user
  hosts: 172.25.11.1
  tasks:
    - name: create user
      user:  
        name: "{
   
   {user}}"

受控主机中

[root@nod1 ~]# grep bash$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
westos:x:1000:1000::/home/westos:/bin/bash
westosuser1:x:1001:444::/mnt/westosuser1:/bin/bash
westosuser2:x:1002:6666::/mnt/westosuser2:/bin/bash
westosuser:x:1003:100::/home/westosuser:/bin/bash
westosuser3:x:1004:1004::/home/westosuser3:/bin/bash
inventory:x:1005:1005::/home/inventory:/bin/bash    

3.5.目录设定变量

group_vars清单变量,目录中的文件名称与主机清单名称一致
host_vars ##主机变量,目录中的文件名称与主机名称一致
host_vars的内容会覆盖group_vars的内容

[westos@ansible ~]$ mkdir group_vars

[westos@ansible ~]$ cat inventory


[westos_list1]
172.25.11.1

[westos_list2]
172.25.11.2


[westos_list3]

172.25.11.3

[westos@ansible ~]$ cat group_vars/westos_list1 
---
user: westos3
[westos@ansible ~]$ cat create_user.yml 
---
- name: create user
  hosts: 172.25.11.1
  tasks:
    - name: create user
      user:  
        name: "{
   
   {user}}"
        state: present 
     

[westos@ansible ~]$ mkdir host_vars

[westos@ansible ~]$ vim hosts_vars/172.25.11.1
[westos@ansible ~]$ cat host_vars/172.25.11.1
---
user: westos2

[westos@ansible ~]$ cat create_user.yml 
---
- name: create user
  hosts: 172.25.11.1
  tasks:
    - name: create user
      user:  
        name: "{
   
   {user}}"
        state: present 

[westos@ansible ~]$ ansible-playbook create_user.yml

[root@nod1 ~]# grep bash$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
westos:x:1000:1000::/home/westos:/bin/bash
westosuser:x:1003:100::/home/westosuser:/bin/bash
inventory:x:1005:1005::/home/inventory:/bin/bash
westos2:x:1006:1006::/home/westos2:/bin/bash   ##westos2在主机1中被建立出来
[root@nod1 ~]# 

3.6.用命令覆盖变量

ansible-playbook user.yml -e "USER=hello"

3.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}}"

create web vhost
www.westos.com 80 ------ > /var/www/html

linux.westos.com 80 ------> /var/www/virtual/westos.com/linux

####建立两个虚拟主机及设置默认发布测试页########

[westos@ansible ~]$ cat vhost.yml 
---
- name: vhost
  hosts: 172.25.11.1
  vars:
    - web1:
        name: www.westos.com
        port: 80
        documentroot: /var/www/html
        index: www.westos.com page
    - web2:
        name: linux.westos.com
        port: 80
        documentroot: /var/www/virtual/westos.com/linux/html
        index: linux.westos.com page
  tasks:   
    - name: install web server
      dnf:
        name: httpd
        state: latest
    - name: configure web server
      copy:
        dest: /etc/httpd/conf.d/vhost.conf
        content:
          "<VirtualHost _default_:80>\n  DocumentRoot /var/www/html\n  CustomLog logs/default.log combined\n</VirtualHost>\n<VirtualHost *:{
    
    {web1.port}}>\n  ServerName {
    
    {web1.name}}\n  DocumentRoot {
    
    {web1.documentroot}}\n  CustomLog logs/{
    
    {web1.name}}.log combined\n</VirtualHost>\n\n<VirtualHost *:{
    
    {web2.port}}>\n  ServerName {
    
    {web2.name}}\n   DocumentRoot {
    
    {web2.documentroot}}\n  CustomLog logs/{
    
    {web2.name}}.log combined\n</VirtualHost>"
    - name: create documentroot dir
      file:
        path: "{
    
    {item}}"
        state: directory
      loop:
        - "{
    
    {web1.documentroot}}"
        - "{
    
    {web2.documentroot}}"
    - name: create index
      copy:
        content: "{
    
    {item.index_content}}"
        dest: "{
    
    {item.index_file}}"
      loop:
        - index_file: "{
    
    {web1.documentroot}}/index.html"
          index_content: "{
    
    {web1.index}}"
        - index_file: "{
    
    {web2.documentroot}}/index.html"
          index_content: "{
    
    {web2.index}}"
    - name: restart apache
      service:
        name: httpd
        state: restarted
        enabled: yes
    - name: firewalld configure
      firewalld:
         service: http
         state: enabled
         permanent: yes
         immediate: yes
[westos@ansible ~]$ ansible-playbook vhost.yml  ###运行成功####

PLAY [vhost] ***********************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************
ok: [172.25.11.1]

TASK [install web server] **********************************************************************************************************
ok: [172.25.11.1]

TASK [configure web server] ********************************************************************************************************
ok: [172.25.11.1]

TASK [create documentroot dir] *****************************************************************************************************
ok: [172.25.11.1] => (item=/var/www/html)
ok: [172.25.11.1] => (item=/var/www/virtual/westos.com/linux/html)

TASK [create index] ****************************************************************************************************************
ok: [172.25.11.1] => (item={
    
    'index_file': '/var/www/html/index.html', 'index_content': 'www.westos.com page'})
ok: [172.25.11.1] => (item={
    
    'index_file': '/var/www/virtual/westos.com/linux/html/index.html', 'index_content': 'linux.westos.com page'})

TASK [restart apache] **************************************************************************************************************
changed: [172.25.11.1]

TASK [firewalld configure] *********************************************************************************************************
ok: [172.25.11.1]

PLAY RECAP *************************************************************************************************************************
172.25.11.1                : ok=7    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

在主机中做好解析,访问

[root@lyx_good Desktop]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.23 www.lyx.com news.lyx.com bbs.lyx.com login.lyx.com 
172.25.254.205 net.a.westos.com
172.25.11.1 www.westos.com linux.westos.com     #####

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.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']}}"

屏蔽错误输出

[westos@ansible ~]$ cat var.yml 
---
- name: test register
  hosts: 172.25.11.1
  tasks:
    - name: test
      shell:
        test -e /mnt/file 
      ignore_errors: yes   ##忽略错误输出继续执行
      register: westos

    - name: show westos
      debug:
        msg: "{
    
    {westos.rc}}"  ## 输出rc,成功rc=0.失败rc=0

[westos@ansible ~]$ ansible-playbook var.yml 

PLAY [test register] ***************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************
ok: [172.25.11.1]

TASK [test] ************************************************************************************************************************
fatal: [172.25.11.1]: FAILED! => {
    
    "changed": true, "cmd": "test -e /mnt/file", "delta": "0:00:00.005763", "end": "2020-09-13 06:44:56.752272", "msg": "non-zero return code", "rc": 1, "start": "2020-09-13 06:44:56.746509", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring

TASK [show westos] *****************************************************************************************************************
ok: [172.25.11.1] => {
    
    
    "msg": "1"      ##输出的错误结果
}

PLAY RECAP *************************************************************************************************************************
172.25.11.1                : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1   

3.9.事实变量

事实变量是ansible在受控主机中自动检测出的变量
事实变量中还有与主机相关的信息

当需要使用主机相关信息时不需要采集赋值,直接调用即可
因为变量信息为系统信息所以不能随意设定仅为采集信息,故被成为事实变量
---
- name: test register
  hosts: 172.25.0.254
  tasks:
    - name: show messages
      debug:
        msg: "{
   
   {ansible_facts['architecture']}}"

eg:抓取受控主机的ip,主机名,等等

[westos@ansible ~]$ cat hosts_messages.yml 
---
- name: test register
  hosts: 172.25.11.1
  tasks:
    - name: test
      copy:
        dest: /mnt/hosts_messages
        content:
           "{
   
   {ansible_facts.enp1s0.ipv4.address}}\n
             {
   
   {ansible_facts.fqdn}}\n
             {
   
   {ansible_facts.memtotal_mb}}"

ansible-playbook hosts_messages

[root@nod1 www]# cat /mnt/hosts_messages   ###在受控主机中可以看到抓取的ip及主机名及内存
172.25.11.1
 nod1.westos.com
 726[root@nod1 www]# 

3.10.魔法便变量

hostvars ansible软件的内部信息
group_names: 当前受管主机所在组
groups: 列出清单中所有的组和主机
inventory_hostname: 包含清单中配置的当前授管主机的名称

ansible 192.168.3.1 -m debug -a 'var=groups' 列出清单中所有的组和主机

在这里插入图片描述ansible 192.168.3.1 -m debug -a 'var=hostvars' ansible软件的内部信息
在这里插入图片描述 ansible 192.168.3.1 -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']}}

for循环
vim users.yml
users:

  • westos
  • linux
  • ansible

vim test.j2
{% for NAME in users %}
{ { NAME }}
{%endfor%}

if 判定
{% for NAME in users if not NAME == “ansible” %}
User number { {loop.index}} - { { NAME }}
{%endfor%}

loop.index ##循环迭代记数从1开始
loop.index0 ##循环迭代计数从0开始

{% for user in students %}
name: { {user[‘name’]}}
{%if user[‘age’] is defined%}
age: { {user[‘age’]}}
{%endif%}
{% if user[‘age’] is not defined %}
age: null
{% endif%}
obj: { {user[‘obj’]}}
{%endfor%}

j2模板在playbook中的应用

playbook1 
---
- name: test register
  hosts: xxxx
  tasks:
    - name: create hosts
      template:
        src: ./xxxx.j2
        dest: /mnt/hosts


#playbook2
---
- name: test.j2
  hosts: 172.25.0.254
  vars:
    students:
      - name: student1
        obj: linux

      - name: student2
        age: 18
        obj: linux
  
  tasks:
    - template:
        src: ./test.j2
        dest: /mnt/list

在playbook中建立westos用户时没有age,所以在建立的时候,在j2模板中要判定age
USERNAME in userlist :userlist是在playbook中相对应的变量

[westos@ansible ~]$ cat userlist.j2 
{% for USERNAME in userlist if USERNAME['name'] != "lee" %}
######{
   
   {USERNAME['name']}} messages##
name: {
   
   {USERNAME['name']}}
class: {
   
   {USERNAME['class']}}
{% if UESRNAME['age'] is defined %}       ##如果age有,则建立,没有,就跳过
age:  {
   
   {USERNAME[age]}}
{% endif%}
{% endfor %}
[westos@ansible ~]$ cat userlist.yml 
---
- name: test
  hosts: 172.25.11.1
  vars:
    userlist:
      - name: lee
        class: linux
        age: 18
      - name: westos
        class: java
  tasks:
    - name: template
      template:
        src: ./userlist.j2       
        dest: /mnt/userlist
[lee@lee ~]$ cat vhost.j2 

{% for webserver in vhost %}
{% if webserver.name is not defined %}
<VirtualHost _default_:80>
{% endif %}
{% if webserver.name is defined %}
<VirtualHost *:80>
{% endif %}
{% if webserver.name is defined %}
  ServerName {
   
   { webserver.name }}
{% endif %}
  DocumentRoot {
   
   {webserver.root}}
{% if webserver.name is not defined %}
  CustomLog logs/default.log combined
{% endif %}
{% if webserver.name is not defined %}
  CustomLog logs/{
   
   { webserver.name }}.log combined
{% endif %}
</VirtualHost>
{% endfor %}
[lee@lee ~]$ cat apache.yml 
---
- name: install apache server
  hosts: 192.168.3.12
  vars: 
     vhost:
       - root: /var/www/html
       - root: /var/www/virtual/westos.com/www/html
         name: www.westos.com
       - root: /var/www/virtual/westos.com/linux/html
         name: linux.westos.com
  tasks:
    - name: configure apache
      template: 
        src: /mnt/vhost.j2
        dest: /mnt/vhost  

Ansible的加密控制

创建建立文件
1.
ansible-vault create westos
在这里插入图片描述

2.
vim westos-vault 有密码的建立
lee

ansible-vault create --vault-password-file=westos-valut test
在这里插入图片描述

加密现有文件
ansible-vault encrypt test
在这里插入图片描述

查看加密文件
ansible-vault view test
ansible-vault view --vault-password-file=westos-valut test
在这里插入图片描述

编辑加密文件

ansible-vault edit westos1
ansible-vault edit --vault-password-file=westos-valut westos

解密文件
ansible-vault decrypt test 文件永久解密

在这里插入图片描述ansible-vault decrypt westos --output=linux文件解密保存为linux,原文件不变
在这里插入图片描述

更改密码
ansible-vault rekey test
ansible-vault rekey test --new-vault-password-file=westos-vault
在这里插入图片描述
在这里插入图片描述

playbook
ansible-playbook httpd.yml --ask-vault-pass
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ninimino/article/details/108652475