Linux —— ansible自动化运维(三)

目录

1. 变量

1.1 变量内容

1.2 变量命名

1.3 变量定义

1.4 playbook中定义变量

1.5 playbook中变量的使用

1.6 主机变量和组变量 

1.6.1 定义主机变量和组变量

1.7 数组作为变量

1.8 已注册变量捕获命令输出

1.9 管理变量的练习

2. 管理机密

2.1 目标

2.2 ansible vault

2.3 创建加密文件

创建加密文件

查看加密文件 

编辑加密文件

加密现有文件

解密现有文件 

更改加密文件密码

playbook和ansible vault

3. 管理事实

3.1 描述ansible事实

3.2 ansible事实作为变量注入

3.3 创建自定义事实

4. 魔法变量

5. 管理事实练习 


1. 变量

将playbook中的某些值使用变量代替,从而简化playbook的编写。

1.1 变量内容

  • 要创建的用户
  • 要安装的软件包
  • 要重启的服务
  • 要删除的文件
  • 要从互联网检索的文档

1.2 变量命名

  • 变量名称必须以字母开头,并且只能含有字母、数字和下划线

1.3 变量定义

范围级别该范围变量定义
全局范围从命令行或 ansible 配置设置的变量
play范围在 play 和相关结构中设置的变量
主机范围由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量

如果多个级别上定义了相同名称的变量,优先采用级别最高的变量,窄范围优先于广范围 

1.4 playbook中定义变量

  • 在 playbook 开头的 vars 块中

  • 在外部文件定义 playbook 变量 
vim users.yml
###
user: westos
home: /home/westos 
###

1.5 playbook中变量的使用

将变量名称放在花括号内即可 

---
vars: 
  user: wesots                        ## 定义变量user内容为westos
tasks:
  - name: Create user {{ user }}      ## 通过{{ }}使用变量
    user:
      name: "{{user}}"                ## 当变量用作开始一个值的第一元素时,必须使用引号,不然会报错
...

若缺少引号: 

1.6 主机变量和组变量 

直接应用于主机清单变量分为两大类:

  • 主机变量:应用于特定主机
  • 组变量:应用于一个主机组或一组主机组中的所有主机

主机变量优先于组变量,但是playbook中定义的变量比这两者更高 

1.6.1 定义主机变量和组变量

方法一:[旧方法,不建议]

## 定义servera.dsd.com的ansible_user主机变量
[webserver]
servera.dsd.com ansible_user=westos

## 定义dbservers主机组的user组变量
[dbservers]
dbserver1.dsd.com
dbserver2.dsd.com

[dbservers:vars]
user=westos

## 定义嵌套组user变量
[servers1]
node1.dsd.com
node2.dsd.com
[servers2]
node3.dsd.com
node4.dsd.com
[servers:children]
servers1
servers2
[servers:vars]
user=westos

缺点:清单文件难以处理,在同一文件中混合提供主机和变量信息,语法也过时 

方法二:使用目录填充主机和组变量

定义主机和主机组变量,在工作目录下包含ansible.cfg文件、inventory文件以及playbook文件,创建host_vars【主机变量目录】和group_vars【组变量目录】两个目录,分别包含用于定义组变量和主机变量的文件

项目目录包含:ansible.vfg、inventory、playbook.yml以及group_vars和host_vars

1.7 数组作为变量

调用方式一:

user.lilei.first_name
user.hanmeimei.last_name 

调用方式二:

user['lilei']['first_name']
user['hanmeimei']['last_name']

1.8 已注册变量捕获命令输出

管理员通过register注册一个变量,通过debug将结果显示出来

---
- name: install a package
  hosts: all
  tasks:
    - name: install
      yum:
        name: httpd
        state: installed
      register: install_result

    - debug: var=install_result
...

1.9 管理变量的练习

 创建playbook,安装apahce并开启,使其可以被访问,并且查询web服务器并确认它已经设置好并在运行

---
# web_package
# firewall_package
# web_service
# firewall_service
# python_package
# rule 规则变量

- name: Configure Apache
  hosts: web
  vars:
    web_package: httpd
    firewall_package: firewalld
    web_service: httpd
    firewall_service: firewalld
    python_package: python3-PyMySQL
    rule: http

  tasks:
    - name: Install Package                                        # 确保安装软件包且是最新版本
      yum:
        name:
          - "{{ web_package }}"
          - "{{ firewall_package }}"
          - "{{ python_package }}"
        state: latest

    - name: The {{ firewall_service }} started and enabled         # 确保firewalld开机启动
      service: 
        name: "{{ firewall_service }}"
        enabled: true
        state: started

    - name: The {{ web_service }} started and enabled              # 确保apache开机启动
      service:
        name: "{{ web_service }}"
        enabled: true
        state: started

    - name: Configure index.html                                   # 配置默认发布页面
      copy:
        content: "Hello Westos!"
        dest: /var/www/html/index.html

    - name: firewall permits http                                  # 配置防火墙允许访问http
      firewalld:
        service: "{{ rule }}"
        permanent: true
        immediate: true
        state: enabled

- name: verify the apache                                          # 检测apache服务
  hosts: localhost
  become: false                                                    # 本机测试 ,不必更改身份
  tasks:
    - name: curl webserver
      uri:                                                         # uri由python提供,为了在这里测试,因此我们安装python
        url: http://servera.dsd.com
        status_code: 200                                           # 状态码为200,正常
...

检测语法:

运行:

2. 管理机密

2.1 目标

使用ansible vault加密敏感变量,并运行vault加密变量文件的playbook

2.2 ansible vault

ansible可能需要访问密码或者api密钥等敏感数据,以便于配置主机

2.3 创建加密文件

方法:ansible-vault create filename

创建加密文件

ansible-vault create secret.yml   ## 需要输入两次密码
ansible-vault create --vault-password-file=westos secret.yml   ## 创建加密文件并同时保存密码,westos文件中必须先写入密码

若westos文件中没有密码时,报该错误 

查看加密文件 

 在进行加密操作后,我们会发现通过cat命令读取到文件内容为加密后内容

##方法:
ansible-vault view filename
ansible-vault view secret.yml

编辑加密文件

原理:将文件解密为一个临时文件并编辑,保存时,复制内容并删除临时文件,'edit'命令始终重写文件,因此只有在更改文件时使用,查看用'view'

ansible-vault edit secret.yml   ## 刚该加密文件内容

加密现有文件

## 方法:
ansible-vault encrypt filename ## filename参数可以是多个
## 
可以使用--output=filename将加密文件保存为新的名称,使用此参数时输入文件只能是一个

解密现有文件 

## 方法:
ansible-vault decrypt filename   ## 解密该文件
ansible-vault decrypt westos.yml --output=redhat.yml    ## 解密文件同时修改文件名称

更改加密文件密码

## 方法:
ansible-vault rekey filename
ansible-vault rekey dsd.yml   ## 修改dsd.yml文件密码

## 若密码不是通过交互,而是在一个文件中时,我们修改密码最好使用--new-vault-password-file
ansible-vault rekey --new-vault-passwprd-file=dsd westos.yml

playbook和ansible vault

ansible-playbook user.yml   ## 运行加密的playbook,没有密码则报错
ansible-playbook --vault-id @prompt user.yml  ##交互式提供密码
## 2.4之前的ansible,使用--ask-vault-pass提供交互式密码
## 也可以将密码保存在文件中(注意使用文件系统权限对文件进行保护)
ansible-playbook --vault-password-file=password user.yml

3. 管理事实

事实包括:主机名称、内核版本、网络接口、IP地址等

3.1 描述ansible事实

  • 查看主机信息
[root@workstation facts]# cat fact.yml 
---
- name: Fact
  hosts: all
  tasks:
    - name: print fact
      debug:
        var: ansible_facts                     # 系统变量名
...
  • 将事实替换成动态的值
---
- hosts: all
  tasks:
    - name: print ansible facts
      debug:
        msg:
          The IPv4 address of {{ ansible_facts.fqdn }}    
          is {{ ansible_facts.all_ipv4_addresses }}
...
######
          The IPv4 address of {{ ansible_facts.fqdn }}    # 使用字典的方式查询值
          is {{ ansible_facts.all_ipv4_addresses }}

3.2 ansible事实作为变量注入

  • 使用setup模块显示所有事实信息
ansible servera.dsd.com -m setup
  • 关闭事实收集,来提升执行速度
---
- name: Configure User
  hosts: servera.dsd.com
  gather_facts: no
  tasks:
    - name: wesots user
      user:
        name: westos
        uid: 1000
        state: present
...

3.3 创建自定义事实

  •  INI格式
[packages]
web_package = httpd
db_package = mariadb-server

[users]
user1 = westos
user2 = redhat
  • JSON格式
{
  "packages": {
    "web_package": "httpd",
    "db_package": "mariadb-server"
  },
  "users": {
    "user1": "westos",
    "user2": "redhat"
  }
}
  • 自定义事实
[root@workstation ~]# mkdir /etc/ansible/facts.d
[root@workstation ~]# cd /etc/ansible/facts.d/
[root@workstation facts.d]# vim custom.fact
[root@workstation facts.d]# ansible localhost -m setup

4. 魔法变量

魔法变量作用
hostvars包含受管主机的变量,可以用于获取另一台受管主机的变量的值
group_names列出当前受管主机所属的所有组
groups列出清单中的所有组和主机
inventory_hostname包含清单中配置的当前受管主机的主机名称
  • 使用debug模块报告特定主机的hostvars的值
ansible localhost -m debug -a 'var=hostvars["servera.dsd.com"]'

5. 管理事实练习 

[root@workstation~]#mkdirdata-facts

[root@workstation data-facts]#cat ansible.cfg 
[defaults] 
inventory=./inventory 

[root@workstation data-facts]#cat inventory 
[web] 
servera.dsd.com 

[root@workstation data-facts]#ansiblewebservers-msetup  #显示信息

## 创建自定义变量
[root@workstation data-facts]#vim custom.fact
[root@workstation data-facts]#cat custom.fact 
[westos] 
package = httpd 
service = httpd 
state = started 
enabled = true

## 创建playbook
[root@workstation data-facts]#vim facts.yml 
---
- name: Install facts 
  hosts: web 
  vars:
    remote_dir: /etc/ansible/facts.d 
    facts_file: custom.fact 
  tasks: 
    -name: Create directory 
    file: 
      state: directory 
      recurse: yes 
      path: "{{remote_dir}}" 
    -name: Install new facts 
    copy: 
      src: "{{facts_file}}" 
      dest: "{{remote_dir}}" 

## 检测ansible_local变量,当前没有
[root@workstation data-facts]#ansible web -m setup

## 语法检测
[root@workstation data-facts]#ansible-playbook--syntax-checkfacts.yml 

## 运行
[root@workstation data-facts]#ansible-playbook facts.yml


## 编写主playbook
---
- name: Install Apache and starts 
  hosts: webservers 
  tasks: 
    -name: Install Packages #安装httpd 
    yum:
      name: "{{ ansible_facts['ansible_local']['custom']['westos']['package'] }}" 
      state: latest 
    -name: Starthttpd #启动 
    service: 
      name: "{{ ansible_facts['ansible_local']['custom']['westos']['service'] }}"  
      state: "{{ ansible_facts['ansible_local']['custom']['westos']['state'] }}" 
      enabled: "{{ ansible_facts['ansible_local']['custom']['westos']['enabled'] }}" 

## 验证httpd服务没有在servera上运行
[root@workstation data-facts]#ansible servera.dsd.com -m command-a 'systemctl status httpd' 

## 语法检测
[root@workstationdata-facts]#ansible-playbook--syntax-check playbook.yml 

## 运行
[root@workstation data-facts]#ansible-playbook playbook.yml

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值