ansible-变量-03

1.变量概述

什么是变量?

变量:以一个固定的字符串去表示一个不固定的值。 x = 12
shell中变量:
定义: Host=oldxu.com
使用:${Host}
ansible变量
定义: Host=cry.com
使用:{{ Host }}

2.定义变量方式

ansible定义变量方式

1.通过命令行进行变量定义
2.在play文件中进行定义变量
3.通过inventory在主机组或单个主机中设置变量

2.1 通过传参的方式定义变量

[root@manager  ansible_variables]# cat var7.yml
- hosts: webservers
  tasks:
    - name: Install Rpm Packages "{{ test_packages }}"
      yum:
        name:
          - "{{ test_packages }}"
        state: present
[root@manager  ansible_variables]# ansible-playbook var7.yml -e "test_packages=sl"

2.2 通过在playbook文件中进行定义变量

①vars:在playbook中直接定义

举例说明 我们把部署nfs服务剧本中的共享目录 进行定义变量
vars填写在play层

1>首先在play层用vars把变量定义出来

- hosts: nfs
  vars:
    - nfs_share_dir: /ansible_data1
  tasks:

2> 更改管理端的nfs主配置文件

vim exports.j2
[root@ansible playbook]# vim exports.j2 
{{nfs_share_dir}}  172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

3> 我们剧本中推送主配置文件用的是copy模块,但是copy无法识别变量,所以我们更改使用template模块,两个模块用法相似。

- name: configure nfs server
      template:
        src: exports.j2
        dest: /etc/exports
        owner: root
        group: root
        mode: '0644'
        backup: yes
      notify: systemctl restart nfs

4>把我主配置文件中定义的共享目录,更改成调用变量的写法

 - name: create nfs directory
      file:
        path: "{{ nfs_share_dir }}"
        owner: www
        group: www
        mode: 0755
        state: directory
        recurse: yes

5>这样定义变量就更加灵活以后我们如果共享目录使用别的,我们只需要更改赋予变量的值就可以了

 vars:
    - nfs_share_dir: /ansible_data1

②vars_files

1>先把定义的变量放在一个文件中

[root@manager ansible_variables]# cat test.yml
web_packages: httpd-tools
ftp_packages: vsftpd

2>在剧本中调用这个文件

[root@manager  ansible_variables]# cat var1.yml
- hosts: webservers
  vars_files: test.yml

  tasks:
    - name: Installed Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
      yum:
        name:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
        state: present

2.3 在Inventory清单中定义变量,但是要注意:单个主机变量优先级高于主机组变量

① 在inventory主机清单中对主机组进行定义变量

[root@m01 project1]# vim /etc/ansible/hosts
1.对主机定义变量
[webservers]
172.16.1.7 hostname=web01
172.16.1.8 hostname=web02
2.对主机组定义变量 
[webservers]
172.16.1.7
172.16.1.8
[webservers:vars]
filename=group_vars

② playbook直接调用变量,最终结果则是在/tmp目录创建group_vars文件

[root@m01 project1]# cat p3.yml
- hosts: webservers
  tasks: 
    - name: create file
      file: path=/tmp/{{ filename }} state=touch

③ 实列 (keepalived)

[webservers]
172.16.1.7 id=web01  priority=150  state=Master 
172.16.1.8 id=web02  priority=100  state=Backup

[root@mananger playbook]# cat keep.conf.j2 
global_defs {     
	router_id {{ id }}
}
vrrp_instance VI_1 {
	priority {{ priority }}
	state {{ state }}
	interface eth0
	virtual_router_id 50
	advert_int 1

	authentication {
	auth_type PASS
	auth_pass 1111
}
	virtual_ipaddress {
		10.0.0.3
	}
}

[root@mananger playbook]# cat f4.yaml 
- hosts: webservers
  tasks:
    - name: Copy keeplaived.conf.j2
      template:
        src: keep.conf.j2
        dest: /tmp/keep.conf

2.4 官方的建议是在ansible项目中创建额外的两个变量目录host_vars和group_vars

[root@ansible playbook]# cat hosts
[webservers]
172.16.1.7
172.16.1.8
----------------------------group_Vars------------------------------------------
1)在当前的项目目录中创建两个变量的目录
[root@ansible playbook]#  mkdir host_vars
[root@ansible playbook]#  mkdir group_vars
2)在group_vars目录创建一个文件,文件名与inventory清单中的组名称要保持完全一致
[root@ansible playbook]# cat group_vars/webservers
web_packages: wget
ftp_packages: tree
3)编写playbook,只需要在playbook文件中使用变量即可
[root@ansible playbook]# cat f5.yaml
- hosts: webservers
  tasks:
    - name: install rpm packages "{{ web_packages }}""{{ ftp_packages }}"
      debug:
        msg:
          - "{{ web_packages}}"
          - "{{ ftp_packages }}"
        state: present
 但是只有webservers这个定义的主机组才可以使用我们定义的变量
 如果想是所有主机组都可以使用变量 我们创建一个名称为all(特殊组,针对所有主机设定变量)
 [root@ansible playbook]# cat group_vars/all
 web_packages: wget
 ftp_packages: tree
 [root@ansible playbook]# cat f6.yaml
- hosts: dbservers
  tasks:
    - name: install rpm packages "{{ web_packages }}""{{ ftp_packages }}"
      debug:
        msg:
          - "{{ web_packages}}"
          - "{{ ftp_packages }}"
        state: present
这样我们的db组,所有组都可以使用
----------------------hosts_Vars-----------------------------------------
就是在hosts_vars目录下创建单台节点命名的文件
[root@ansible playbook]# cat  /hosts_vars/172.16.1.7
[root@ansible playbook]# cat  /hosts_vars/172.16.1.8
不如直接在inventory清单中直接单台节点定义

3 ansible变量的优先级

从上到下,依次优先级降低

1.外部传参 ansible-playbook -e 
2. playbook关键字
  2.1 vars_files
  2.2 vars
3.inventory清单
    3.1 hosts(单台主机)
    3.2 group_vars/组名
    3.3 group_vars/all

4. ansible 变量注册

Register

Jumpserver实列

1.tasks: shell 命令 —> 生成 --> 变量存储 register关键字
2.打印生成的key的结果 jumpserver key

4.1 编辑剧本

- hosts: webservers
  tasks:
    - name: Run Shell Command Random string
      shell:
        cmd: 'if ! grep "SECRET_KEY" ~/.bashrc; then
                SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50`;
                echo "SECRET_KEY=$SECRET_KEY" >> ~/.bashrc;
                echo $SECRET_KEY;
              else
                 echo $SECRET_KEY;
              fi'
      register: SECRET_KEY


    - name: Run Shell Command BOOTSTRAP_TOKEN
      shell:
        cmd: 'if ! grep "BOOTSTRAP_TOKEN" ~/.bashrc; then
                BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16`;
                echo "BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN" >> ~/.bashrc;
                echo $BOOTSTRAP_TOKEN;
-             else
                echo $BOOTSTRAP_TOKEN;
             fi'
      register: BOOTSTRAP_TOKEN

    - name: Copy Jms Configure 
      template:
        src: ./files/j-config.yaml
        dest: /tmp/jms_config.yml

    - name: Copy Koko Configure 
      template:
        src: ./files/k-config.yaml
        dest: /tmp/koko_config.yml


4.2 配置文件中使用变量写法

cat /etc/files/j-config.yaml
# SECURITY WARNING: keep the secret key used in production secret!
# 加密秘钥 生产环境中请修改为随机字符串,请勿外泄, 可使用命令生成 
# $ cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 49;echo
SECRET_KEY: {{ SECRET_KEY.stdout.split('=')[1] }}

# SECURITY WARNING: keep the bootstrap token used in production secret!
# 预共享Token coco和guacamole用来注册服务账号,不在使用原来的注册接受机制
BOOTSTRAP_TOKEN: {{ BOOTSTRAP_TOKEN.stdout.split('=')[1] }}

cat /etc/files/k-config.yaml
# SECURITY WARNING: keep the secret key used in production secret!
# 加密秘钥 生产环境中请修改为随机字符串,请勿外泄, 可使用命令生成 
# $ cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 49;echo
SECRET_KEY: {{ SECRET_KEY.stdout.split('=')[1] }}

# SECURITY WARNING: keep the bootstrap token used in production secret!
# 预共享Token coco和guacamole用来注册服务账号,不在使用原来的注册接受机制
BOOTSTRAP_TOKEN: {{ BOOTSTRAP_TOKEN.stdout.split('=')[1] }}

4.3 Debug异常处理模块

debug模块使用方法
1. 执行模块, 获得输出结果
2. 捕获被控端数据的结果,并注册到 register
3. debug模块调试,获得具体的值----->>> 应用到 config.j2模板文件中
 hosts: webservers
  tasks:

    - name: Get Nginx Port Status
      shell:  netstat -lntp | grep nginx  #被控端的执行结果
      register: ngx_status                #注册一大堆的结果并打个标签
      changed_when: false         #该tasks任务不会发生changed提示了
      
    - name: Debug Nginx Status
      debug:
        msg: "{{ ngx_status.stdout_lines }}"    #定位一大堆结果中的具体的值

Facts变量

1.什么实际facts?

Ansible facts 用来自动采集,“被控端主机”自身的状态信息。
比如:主机名,IP地址,系统版本,CPU数量,内存状态,磁盘状态等等

2.facts使用场景?

1.通过facts变量检查被控端硬件CPU信息,从而生成不同的Nginx配置文件。
2.通过facts变量检查被控端内存状态信息,从而生成不同的memcached的配置文件
3.通过facts变量检查被控端主机名称信息,从而生成不同的zabbix配置文件
4.通过facts变量检查被控的主机IP地址信息,从而生成不同的redis配置文件。

3.facts使用举例

1> 通过facts变量检查被控的主机IP地址信息,从而生成不同的redis配置文件。

①编辑剧本
[root@mananger web_cluster]# cat redis_server.yaml 
- hosts: webservers
  tasks:
    - name: Installed Redis Server
      yum:
        name: redis
        state: present

    - name: Configure Redis Server
      template:
        src: ./files/redis.conf.j2
        dest: /etc/redis.conf
        owner: redis
        group: root
        mode: 0640
      notify: Restart Redis Server

    - name: Systemctl Redis Server Started
      systemd:
        name: redis
        state: started
        enabled: yes

  handlers:
    - name: Restart Redis Server
      systemd:
        name: redis
        state: restarted
②redis配置文件中使用变量
[root@mananger web_cluster]# less  ./files/redis.conf.j2
....
bind 127.0.0.1 {{ ansible_eth1.ipv4.address }}
....

2>通过facts变量检查被控端内存状态信息,从而生成不同的memcached的配置文件

① 编辑剧本
[root@mananger playbook]# cat f12.yaml 
- hosts: webservers
  tasks:
    - name: Installed Memcached Server
      yum:
        name: memcached
        state: present

    - name: Configure Memcached Server
      template:
        src: memcached.j2
        dest: /etc/sysconfig/memcached
      notify: Restart Memcached Server


    - name: Systemd Memcached Server
      systemd:
        name: memcached
        state: started
        enabled: yes

  handlers:
    - name: Restart Memcached Server
      systemd:
        name: memcached
        state: restarted
②编辑 memcached的配置文件使用变量
[root@mananger playbook]# cat memcached.j2
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ ansible_memtotal_mb // 2 }}"
OPTIONS=""
③ 被控端webservers检查mencached配置文件,达到虽然是相同的配置文件,但是在不同的主机上文件信息不一样

我们这里webservers中的web01内存是2G web02 是1G
我们应当给根据每台的物理内存大小分布内存空间(虚拟机内存大小=物理机内存大小/2)

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

3>通过facts变量检查被控端硬件CPU信息,从而生成不同的Nginx配置文件

web011核心worker = 1
web022核心worker = 4

我们先通过命令找到facts变量关于内核数量,和核心数的变量名称

ansible 172.16.1.8 -m setup |less ---->/cpu

在这里插入图片描述
在这里插入图片描述
我们得知
“ansible_processor_cores”: 4, # 核心数 ( 每颗物理CPU的核心数)
“ansible_processor_count”: 2, # 颗数 (有几个CPU )
“ansible_processor_vcpus”: 8, # 总核心数

①编辑剧本
[root@mananger playbook]# cat f13.yaml 
- hosts: webservers
  tasks:
    - name: Copy Nginx.conf Test
      template:
        src: nginx.conf.j2
        dest: /tmp/nginx.conf
② j2配置文件中使用变量ansible_processor_vcpus
[root@mananger playbook]# cat nginx.conf.j2 
user www;
work_process {{ ansible_processor_vcpus }};
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页