ansible中的变量及加密

1.变量命名

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

2.变量级别

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

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

3.变量设定和使用方式

1.在playbook中直接定义变量

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

2.在文件中定义变量

vim user_list.yml
---
user: westosuser

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

3.使用变量

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

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

#在定义主机变量和清单变量时使用
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
[westos_group:vars]
USER=westos2

5.目录设定变量

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

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

6.用命令覆盖变量

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

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@haha Desktop]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.11.1    www.westos.com linux.westos.com     

另一种练习


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=1
[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   

9.事实变量

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

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

抓取受控主机的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

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



[root@server1 ansible]# vim httpd.conf  httpd.conf.j2
[root@server1 ansible]# vim httpd.conf.j2 
Listen {{ http_port }}

[root@server1 ansible]# vim webserver.yml 
8000
[root@server2 ansible]# getenforce 
Enforcing
[root@server2 ansible]# setenforce 0
[root@server2 tmp]# curl localhost:8000
www.westos.org

[root@server1 ansible]# ansible-playbook  -e "http_port=80" webserver.yml 
[root@server1 ansible]# curl 192.168.0.2
www.westos.org

[root@server1 ansible]# vim webserver.yml      
[root@server1 ansible]# ansible-playbook webserver.yml 
[root@server1 ansible]# curl 192.168.0.2:8080
www.westos.org

Ansible的加密控制

#创建建立文件
1.ansible-vault create westos
2.vim westos-vault
  lee

ansible-vault create --vault-password-file=westos-valut westos

#加密现有文件
ansible-vault encrypt test

#查看加密文件
ansible-vault view westos
ansible-vault view --vault-password-file=westos-valut westos

#编辑加密文件
ansible-vault edit westos1
ansible-vault edit --vault-password-file=westos-valut westos

##解密文件
ansible-vault decrypt westos 			    ##文件永久解密
ansible-vault decrypt westos --output=linux	##文件解密保存为linux

##更改密码
ansible-vault rekey westos1
ansible-vault rekey westos1 --new-vault-password-file=key1

#playbook#
ansible-playbook apache_install.yml  --ask-vault-pass

上课做的一些练习(大的yml分成各个部分的yml,并将其playbook或者tasks导入、用playbook进行网页用户认证、变量的练习)

[root@server1 ansible]# vim webserver.yml 
  - import_tasks: task.yml  #取消注释
[root@server1 ansible]# ansible-playbook webserver.yml 
[root@server1 ansible]# vim task.yml
- name: Check that a page returns a status 200 
  uri:
    url: "http://172.25.15.2:{{ http_port }}"
    return_content: yes
    status_code: 200
  register: result
[root@server1 ansible]# ansible-playbook webserver.yml 

## 登陆网页需要进行用户认证
[root@server2 conf]# cd /var/www/html
[root@server2 html]# ls
index.html
[root@server2 html]# vim .htaccess
AuthType Basic
AuthName "westos auth"
AuthUserFile /etc/httpd/conf/htpasswd
require valid-user

[root@server2 httpd]# htpasswd -c /etc/httpd/conf/htpasswd linux
New password: 
Re-type new password: 
Adding password for user linux
[root@server2 httpd]# htpasswd /etc/httpd/conf/htpasswd admin
New password: 
Re-type new password: 
Adding password for user admin
[root@server2 httpd]# cat /etc/httpd/conf/htpasswd
linux:$apr1$903QlUf9$tGUxGQRLh58AtzxgnIcKf0
admin:$apr1$ai0ZpQvF$C1eoNHR5KwYt7T7GE7nVR1
[root@server2 html]# l.
.  ..  .htaccess
[root@server2 html]# pwd
/var/www/html
[root@server2 html]# scp .htaccess server1:/mnt/ansible/
[root@server2 html]# scp /etc/httpd/conf/htpasswd  server1:/mnt/ansible/

[root@server1 ansible]# pwd
/mnt/ansible
[root@server1 ansible]# ls
ansible.cfg  apache  database.yml  hosts  playbook.yml
[root@server1 ansible]# ansible-playbook apache/webserver.yml 
[root@server1 ansible]# curl 192.168.0.2:8080
401
[root@server1 apache]# vim webserver.yml 
80
[root@server1 apache]# vim httpd.conf.j2 
    AllowOverride All
[root@server1 apache]# l.
.  ..  .htaccess
[root@server1 apache]# mv .htaccess htaccess
[root@server1 apache]# ls
[root@server1 apache]# vim webserver.yml 
[root@server1 ansible]# ansible-playbook apache/webserver.yml 
[root@server1 ansible]# curl 192.168.0.2
401 

[root@server1 ansible]# vim apache/webserver.yml 
[root@server1 ansible]# vim apache/task.yml 
---
- name: Check webserver
  uri:
    url: "http://192.168.0.2:{{ http_port }}"
    user: linux
    password: westos
    return_content: yes
    status_code: 200
  register: result

- debug:
    var: result

[root@server1 ansible]# ansible-playbook --list-tasks apache/webserver.yml
[root@server1 ansible]# ansible-playbook --start-at-task "Check webserver" apache/webserver.yml
[root@server1 ansible]# vim apache/task.yml 
[root@server1 ansible]# ansible-playbook apache/task.yml

[root@server1 ansible]# vim apache/webserver.yml 
- import_playbook: task.yml  ##最后
[root@server1 ansible]# ansible-playbook apache/webserver.yml 

[root@server1 ansible]# vim apache/webserver.yml 
  - name: create index.html
    copy:
      content: "{{ ansible_hostname }}\n"
      dest: /var/www/html/index.html

#- import_playbook: task.yml

[root@server1 ansible]# vim apache/httpd.conf.j2 
    AllowOverride None

[root@server1 ansible]# ansible-playbook apache/webserver.yml 
[root@server1 ansible]# curl 192.168.0.2
server2
[root@server1 ansible]# curl 192.168.0.3
server3
[root@server1 ansible]# vim playbook.yml 
---
- hosts: all
  tasks:
  - name: system info
    template:
      src: hostinfo.j2
      dest: /tmp/hostinfo

[root@server1 ansible]# vim hostinfo.j2
hostname: {{ ansible_facts['hostname'] }}
ip: {{ ansible_facts["enp1s0"]["ipv4"]["address"] }}
DNS: {{ ansible_facts['dns']['nameservers'][-1] }}
vad1: {{ ansible_facts['devices']['vda']['partitions']['vda1']['size'] }}
kernel: {{ ansible_facts['kernel'] }}

[root@server1 ansible]# ansible-playbook playbook.yml
[root@server2 html]# cat /tmp/hostinfo 
hostname: server2
ip: 192.168.0.2
DNS: 114.114.114.114
vad1: 1021.00 MB
kernel: 4.18.0-193.el8.x86_64

[root@server1 ansible]# vim apache/httpd.conf.j2 
Listen {{ ansible_facts["enp1s0"]["ipv4"]["address"] }}:{{ http_port }}
[root@server1 ansible]# ansible-playbook apache/webserver.yml 
[root@server2 html]# netstat -antlp
tcp        0      0 192.168.0.2:80          0.0.0.0:*               LISTEN      40700/httpd   

IP负载均衡、变量与角色编写

链接: IP负载均衡、变量与角色编写.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值