1.playbook的概念:

  • 临时命令可以作为一次性对一组主机运行简单的任务。不过,若要真正发挥Ansible的力量,需要使用playbook

  • playbook:

    • playbook是ansible用于配置,部署,和管理被节点的剧本
    • playbook是一个文本文件,playbook可以轻松重复的方式对一组主机执行多项复杂的任务。
    • playbook包含有一个或者多个按特定顺序运行的play组成的列表
    • play是针对对清单中选定的主机运行一组有序任务
  • yaml 标记语言

    • yaml 标记语言是一个可读性高的用来表达资料序列的格式

    • YAML 语言特性

      • YAML的可读性好
      • YAML和脚本语言的交互性好
      • YAML使用实现语言的数据类型
      • YAML有一个一致的信息模型
      • YAML易于实现
      • YAML可以基于流来处理
      • YAML表达能力强,扩展性好
    • YAML的三种数据结构

      数据结构 说明
      对象 键值对的集合,又称为映射、哈希、字典
      数组 一组按次序排列的值,又称为序列/列表
      纯量 单个的、不可再分的值
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # 对象:
      key:
      key1: vaule1
      key2: vaule2
      key: {key1: value1,key2: value2}
      # 数组:
      key:
      - value1
      - value2
      key:[value1,value2]

2.playbook的使用场景:

  • 执行一些简单的任务,使用ad-hoc命令可以方便的解决问题
  • 需要大量的操作的时候,执行的ad-hoc命令是不合适的,这时候最好使用playbook

3.playbook的属性:

属性 必选 说明
name no 剧本的说明信息
hosts 主机组
remote_user no 远程用户
t asks 任务列表
Tasks属性 必选 说明
name no 任务的名字,本任务的说明
[模块] 表示本任务使用的模块

4.playbook的格式:

  • YAML的格式如下:

    • 文件的第一行应该以“—”(三个连字符)开始,表明YAML文件的开始。

    • #之后的内容表示注释

    • YAML中的列表元素以“-”开头并且跟着一个空格

  • 修改/etc/.vimrc文件,使用所有用户的yaml文件缩进变为2字符

    1
    autocmd FileType yaml setlocal ai ts=2 sw=2 et
  • 示例一:创建uid为3333,shell为不可登录,名字为user1的剧本

    1
    vim user.yml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ---
    - name: create user
    remote_user: root
    hosts: webservers
    tasks:
    - name: create user1
    user:
    name: user1
    uid: 3333
    shell: /sbin/nologin
    state: present
  • 示例二:创建redhat.repo的yum源,并安装redis数据库,开机自启启动服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    - name: yum install
    hosts: webservers
    remote_user: root
    tasks:
    - name: wget centos....repo
    get_url:
    url: https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
    dest: /etc/yum.repos.d/Centos-8.5.repo
    - name: yum repolist
    shell: yum repolist
    - name: install redis
    yum:
    name: redis
    state: present
    - name: systemctl redis
    service:
    name: reids
    state: restarted
    enabled: yes

5.Playbook的运行方式:

  • 语法:

    1
    ansible-playbook <filename.yml> ... [options]
  • 参数类型:

    参数 说明
    –check or -C 只检测可能会发生的改变,但不真正执行操作
    –list-hosts 列出运行任务的主机
    –list-tags 列出playbook文件中定义所有的tags
    –list-tasks 列出playbook文件中定义的所以任务集
    –limit 主机列表 只针对主机列表中的某个主机或者某个组执行
    -f 指定并发数,默认为5个
    -t 指定tags运行,运行某一个或者多个tags。(前提playbook中有定义tags)
    -v 显示任务结果
    -vv 显示任务结果和配置
    -vvv 显示任务结果和配置,受管主机连接信息
    -vvvv 更详细

6.playbook变量

  • 变量名称必须是以字母开头,并且只能含有字母、数字和下划线
  • 变量优先级:(高–低)
    1. 全局范围:从命令行或ansible配置设置的变量

    2. play范围:在play和相关结构中设置的变量

    3. 主机范围:由清单、事实收集或注册的任务,在主机和个别主机上设置的变量

1.自定义变量的定义和引入:

  • 命令行定义变量:

    1
    ansible-playbook -e 'pkname1=httpd pkname2=vsftpd' app.yml 
    1
    2
    3
    4
    5
    6
    7
    - hosts:  all
    - name: install package
    yum:
    name: "{{ pkname1 }}"
    - name: install package
    yum:
    name: "{{ pkname2 }}"=
  • playbook中定义变量 vars

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    - hosts:  all
    vars: # 定义var
    - pkname1: httpd
    - pkname2: vsftpd
    - name: install package
    yum:
    name: "{{ pkname1 }}"
    - name: install package
    yum:
    name: "{{ pkname2 }}"
  • playbook中导入变量文件vars_files

    1
    2
    3
    4
    vim var.yml
    # 修改内容:
    var1: httpd
    var2: vsftpd
    1
    2
    3
    4
    5
    6
    7
    8
    - hosts:  all
    vars_files: ./user_var.yml # 导入文件
    - name: install package
    yum:
    name: "{{ pkname1 }}"
    - name: install package
    yum:
    name: "{{ pkname2 }}"
  • 定义主机变量:(主机清单)group_vars/文件名,host_vars/文件名

    1
    2
    3
    [web]
    172.16.20.131 http_port=81
    172.16.20.132 http_port=82
    1
    2
    3
    4
    5
    6
    [web:vars]                        ----主机组变量
    nodename=www
    domainname=openlab.com
    [server1]
    demo1.example.com
    demo2.example.com
    1
    2
    3
    [servers:children]                -----嵌套主机组变量
    Server1
    Server2
  • 使用数组作为变量

    1
    2
    3
    4
    5
    6
    7
    8
    vim user.yml
    USERLIST:
    lee:
    age:18
    obj:linux
    westos:
    age:20
    obj:java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 引入方式一
    - name: test
    hosts:test
    vars_files:./user.yml
    tasks:
    - name: create user
    debug:
    msg: "{{USERLIST.lee.age}}"
    # 引入方式二
    - name: test
    hosts:test
    vars_files:./user.yml
    tasks:
    - name: create user
    debug:
    var:USERLIST['lee']['age']

2.系统变量的注册:

1
2
3
4
5
6
7
8
9
- name:test
hosts:172.25.254.100
tasks:
- name:shell
shell:
date
register: WESTOS # 把date这个命令的所有输出全部注册成了WESTOS这个变量
- debug:
var: WESTOS.rc # 变量引用

3.事实变量

1
2
3
4
5
6
- name: test
hosts: 172.25.254.100
tasks:
- debug:
var: ansible_facts['ens3']['ipv4']['address'] #取地址
var: ansible_facts['fqdn'] #取主机名称

7.ansible vault加密文件:

1.ansible vault概念:

  • ansible可能需要访问密码或者API秘钥等敏感数据
  • 通常,此信息可能以纯文本形式存储在清单变量或其他ansible文件中
  • 任何有权访问ansible文件的用户或存储这些ansible文件的版本控制系统都能访问如此敏感数据。这显然存在安全风险。
  • 作用: 可以加密和解密任何由ansible使用的结构化数据文件
  • 范围:Ansible vault可以加密任何由ansible使用的结构化数据文件。
    • 清单变量
    • playbook中含有的变量文件
    • 在执行playbook时作为参数传递的变量文件
    • ansible角色中定义的变量
  • ansible-vault并不实施自有的加密函数,而是使用外部python工具

2.ansible vault增删改查

  • 创建加密文件

    1
    2
    3
    4
    5
    6
    [root@quruixiang ~]# ansible-vault create secrt.yml
    New Vault password:
    Confirm New Vault password:
    # 编辑内容:
    username: root
    password: 123456
  • 查看加密文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 方式一:
    [root@quruixiang ~]# ansible-vault view secrt.yml
    Vault password:
    username: root
    password: 110119
    # 方式二:文件指定(必须修改文件权限为600)
    echo 110119 > user_passwd.txt
    chmod 600 user_passwd.txt
    ansible-vault view create_user.yml --vault-password-file=user_passwd.txt
  • 编辑加密文件:

    1
    2
    [root@quruixiang /]# ansible-vault edit secrt.yml 
    Vault password:
  • 重置密码:

    1
    2
    3
    4
    5
    [root@quruixiang /]# ansible-vault rekey secrt.yml 
    Vault password:
    New Vault password:
    Confirm New Vault password:
    Rekey successful
  • 加密已有文件:(加上密码)

    1
    ansible-vault encryt secrt.yml
  • 对加密文件进行解密:(删除密码)

    1
    ansible-vault decrypt secrt.yml

3.在引用和执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
---
- name: create user
remote_user: root
hosts: webservers
vars_files:
- ./secrt.yml # 引入加密文件
tasks:
- name: create user1
user:
name: "{{ username1 }}"
password: "{{ password1 }}" # 传递的用户密码需要使用python进行加密,否者失败
shell: /sbin/nologin
state: present
1
2
3
4
5
6
7
8
9
10
# 方式一:咨询
ansible-playbook /etc/ansible/playbook/user1.yml --ask-vault-pass
# 方式二:指定密码文件,
ansible-playbook /etc/ansible/playbook/user1.yml --ask-vault-file=passwd
# 方式三:直接在ansible配置文件中配置vault_password_file
vim /etc/ansible/ansible.cfg

vault_password_file=./secrt/passwd

ansible-playbook /etc/ansible/playbook/user1.yml

8.jinjia2模板: