Linux下ansible自动化运维工具(3)

一、管理变量和事实
管理变量目的:将playbook中的某些值使用变量代替,简化playbook的编写;
1.1ansible变量简介 :
变量可能包含以下值:
要创建的用户
要安装的软件包
要重启的服务
要删除的文件
要从互联网检索的文档
1.2变量命名
变量名称:必须以字母开头,并且只能含有字母、数字和下划线 列如:web_server 、remote_file 、file1
1.3定义变量
三个范围级别
全局范围:从命令行或ansible配置设置的变量
play范围:在play和相关结构中设置的变量
主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量
注意:若多个级别上定义了相同名称的变量,优先采用级别最高的变量,窄范围优先于广范围’
1.4playbook中的变量

1.4.1.常见方式:在playbook开头的vars块中:

- host: all 
  vars: 
    user: student 
    home: /home/student 

1.4.2.在外部文件定义playbook变量

外部设置好变量,剧本中直接使用指定文件
 - hosts: all 
   vars_files: 
     - vars/users.yml    建立此文件此写入变量
  如下所示:
 在/vars/users.yml文件中写入 
 user: student 
 home: /home/student
 编写剧本是可以使用以上设置的变量  
 vars:       
   user: westos 
   tasks: -name: Createuser {{user}} 在playbook中使用变量 将变量名称放在花括号内即可
   user: 
     name: "{{user}}"   注意:当变量用做开始的第一个元素时,必须使用引号

二、主机变量和组变量
2.1直接应用于主机的清单变量分为两大类:
1.主机变量:应用于特定主机
2.组变量:应用于一个主机组或一组主机组中的所有主机
主机变量优先于组变量,但是playbook中定义的变量比这两者更高
定义主机变量和组变量:
使用目录填充主机和组变量定义主机和主机组变量的做法是:
建立与清单文件在相同的工作目录中,创建group_vars 和host_vars两个目录,这两个目录分别包含用于定义组变量和主机变量的文件
创建group_vars/servers的YAML文件,设置变量为值: user:student
同样需要在host_vars目录中创建名称与主机匹配的文件来存放主机变量
所以一个项目目录中包含: ansible.cfg、group_vars、host_vars、inventory、playbook.yml
(五个文件)
清单变量可以被playbook中设置的变量覆盖 ;两者又可通过命令行参数覆盖
在这里插入图片描述
2.2使用已注册变量捕获命令输出
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三、管理变量的练习
创建playbook,安装Apache并开启服务,可以被访问,playbook查询web服务器并确认已经设置好正在运行

变量指定
web_pkg         要安装的web服务器安装包
firewall_pkg    要安装的防火墙的软件包
web_service     要管理的web 服务
firewall_service 要管理的防火墙服务
python_pkg uri    模块所需要的软件包
rule   httpd           要打开的服务

第一个playbook
 - name: Delploy and start Apache service  安装部署http并开启服务
     hosts: webserver   制定受管主机组
     vars:         定义变量
       web_pkg: httpd
       firewall_pkg: firewalld
       web_service: httpd
       firewall_service: firewalld
       python_pkg: python3-PyMySQL
       rule: httpd
    tasks: 
      - name: Required packages are installed and last  所需的软件包已安装并且是最新的
        yum:  安装
          name: 软件包名称
            - "{{ web_pkg }}" 
            - "{{ firewall_pkg }}"
            - "{{ python_pkg }}"
        state: latest  检测是否最新版本 
         
      - name: The {{ firewall_service }} started and enabled  火墙服务是启动的和开启启动
        service:  服务
          name:  "{{ firewall_service }}"  火墙服务    
          enabled: true  开机启动
          state: started  开启状态
         
      - name:  The {{ web_service }} started and enabled  web服务是启动的和开启启动      
        service:
          name: "{{ web_service }}" apache服务  
          enabled: true
          state: started
      - name: Configure index.html  设置http发布页面
        copy:  上传
          content: "peizhifabuyemian!!"  更改内容
          dest: /var/www/html/index.html    上传到此目录下 
          
      - name: Firewalld permits http    是防火墙允许访问http
        firewalld:           
          service: "{{ rule }}"     允许
          permanent: true
          immediate: true
          state: enabled
第二个playbook  
- name: Verify the Apache  判定证实apache
    hosts: localhost  本机测试访问http
    becom: false   不需要认证
    tasks:     动作任务
      - name: Curl web   访问主机组
        uri:   uri访问模块
          url: http://servera.lab.examole.com    指定主机名称
          status_code: 200     状态返回码

在这里插入图片描述
在这里插入图片描述
受管主机检查
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本机测默认试访问界面

[root@workstation data-variables]# curl servera.lab.example.com
peizhifabuyemian!!

四、管理机密
4.1目标:使用ansible-vault加密敏感变量,并运行vault加密变量文件的playbook
4.2介绍: ansible vault
ansible可能需要访问密码或者api密钥等敏感数据,以便配置主机。
4.3加密解密工具:命令 ansible-vault
‘ansiblevault不实施自有的加密函数,而使用外部python工具集’
4.4创建加密文件

方法:ansible-vault   create    filename

创建加密文件同时将密码保存,file1文件中必须先写入密码
在这里插入图片描述
4.5编辑现有的加密文件
原理:将文件解密为一个临时文件,并编辑;保存时,复制内容并删除临时文件 ‘edit命令始终重写文件,因此只有在更改文件时使用,查看尽量使用view’。

[root@workstation dir]# ansible-vault edit file2
Vault password: 

4.5加密现有的文件

方法:ansible-vault  encrypt    filename   filename可以是多个文件一起加密
可以使用--output=filename将加密文件保存为新的名称,使用此参数时输入文件只能是一个
[root@workstation dir]# vim playbook.yml
[root@workstation dir]# vim westos.yml
[root@workstation dir]# ls
playbook.yml  westos.yml
[root@workstation dir]# cat playbook.yml 
123
[root@workstation dir]# cat westos.yml 
456
[root@workstation dir]# ansible-vault encrypt westos.yml playbook.yml 加密多个文件
New Vault password: Lee
Confirm New Vault password: Lee
Encryption successful
[root@workstation dir]# ansible-vault view westos.yml  查看
Vault password: Lee
456
[root@workstation dir]# ansible-vault view playbook.yml 查看
Vault password: Lee
123

加密文件使用encrypt参数、解密使用decrypt参数、更改加密文件使用rekey 参数
注意:对密码文件的保护可以设置文件权限
在这里插入图片描述

使用vault密码文件时,最好使用–new-vault-password-file
密码文件必须存在才可以创建

 [root@workstation dir]# ansible-vault rekey --new-vault-password-file=file2 wbserver.yml 
Vault password: Lee
Rekey successful

五、playbook和ansible-vault

 交互式提供密码--vault-id  @prompt

在这里插入图片描述
注意:2.4版本之前的ansible,使用–ask-vault-pass提供交互式密码’

创建密码文件file2:内容为Lee
[root@workstation dir]# ansible-playbook --vault-password-file=file2 wbserver.yml   不用手动输入密码直接执行

PLAY [Setup Webserver] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************
ok: [serverb.lab.example.com]

TASK [Http Installed] **********************************************************************************************************************
ok: [serverb.lab.example.com]

PLAY RECAP *********************************************************************************************************************************
serverb.lab.example.com    : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

六、管理事实
事实包括:主机名称、内核版本、网络借口、IP地址等
描述ansible事实
6.1查看主机信息 ansible_facts系统变量不用定义
在这里插入图片描述
6.2再将事实替换为动态的值
在这里插入图片描述
在这里插入图片描述
6.3ansible事实作为变量注入
使用setup模块显示所有事实信息
在这里插入图片描述
在这里插入图片描述
6.4创建自定义事实 *****
可以使用INI格式或者JSON格式
INI格式

INI格式
  [packages]
   web_package = httpd
   db_package = mariadb-server
   
   [user]
   user1 = westos
   user2 = lee
    

JSON格式

  JSON格式
  {   
    "pacgages": {    
      "web_package": "httpd",
      "db_package": "mariadb-server"
      },
     "users": {
       "user1": "westos",
       "user2": "lee"  
     },
  }

自定义格式不能使用ymal格式,使用最为接近的json最好

[root@workstation ~]# ls /etc/ansible/facts.d/wes.fact 
/etc/ansible/facts.d/wes.fact
[root@workstation ~]# cat  /etc/ansible/facts.d/wes.fact 
{
  "packages": {
    "web_package": "httpd",
    "db_package": "mariadb-server"
  },
  "users": {
    "user1": "westos",
    "user2": "lee"
  },
}

自定义事实的使用方式和默认事实相同’
6.5使用魔法变量
常用的有四个:
hostvars 包含受管主机的变量,可以用于获取另一台受管主机的变量的值
group_names 列出当前受管主机所属的所有组
groups 列出清单中的所有组和主机
inventory_hostname包含清单中配置的当前受管主机的主机名称
用途之一:使用debug模块报告特定主机的hostvars的值
在这里插入图片描述
管理事实:练习1
检测ansible_local变量当前是不存在的(未设定变量之前)

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

  [root@workstation data-facts]# ansible web -m setup  检测ansible_local变量

在这里插入图片描述
受管主机上检查文件变量是否存在


变量文件已经上传
[root@serverb ~]# ls /etc/ansible/facts.d/  
custom.fact   
[root@servera ~]# ls /etc/ansible/facts.d/
custom.fact

6.5.1编写主playbook
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
受管主机上测试(在运行playbook时受管主机上不能有http服务)
在这里插入图片描述
在这里插入图片描述

发布了46 篇原创文章 · 获赞 6 · 访问量 1340

猜你喜欢

转载自blog.csdn.net/qq_46089299/article/details/105369400