playbook特殊用法与变量的使用

YAML

1. YAML语言简介

YAML是一个可读性高的用来表达资料序列的格式。 YAML参考了其他多种语言,包括: XML、C语言、 Python、 Perl以及电子邮件格式RFC2822等。 Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。
YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时, YAML的意思其实是: "Yet Another Markup Language"(仍是一种标记语言)。
特性:
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好
2. YAML语法简介
在单一文件中,可用连续三个连字号(——)区分多个文件。另外,还有选择性的连续三个点号( ... )用来表示文件结尾
 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
 使用#号注释代码
 缩进必须是统一的,不能空格和tab混用
 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
 YAML文件内容是区别大小写的, k/v的值均需大小写敏感
 k/v的值可同行写也可换行写。同行使用:分隔
 v可是个字符串,也可是另一个列表
 一个完整的代码块功能需最少元素需包括 name: task
 一个name只能包括一个task
 YAML文件扩展名通常为yml或yaml
3. YAML演示
[root@localhost ansible]# cat playbook/firewalld.yml 
---
- name: apache
  hosts: 192.168.145.163
  tasks:
    - name: stop and disabled firewalld
      service:
        name: firewalld
        state: stopped
        enabled: no


    - name: disabled selinux
      lineinfile:
        path: /etc/selinux/config
        regexp: "^SELINUX="
        line: "SELINUX=disabled"
        state: present
[root@localhost ansible]# ansible-playbook playbook/firewalld.yml 

PLAY [apache] ***********************************************************************

TASK [Gathering Facts] **************************************************************
ok: [192.168.145.163]

TASK [stop and disabled firewalld] **************************************************
changed: [192.168.145.163]

TASK [disabled selinux] *************************************************************
changed: [192.168.145.163]

PLAY RECAP **************************************************************************
192.168.145.163            : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

管理变量

1.Ansible变量简介
Ansible支持利用变量来存储值,并在Ansible项目的所有文件中重复使用这些值。这可以简化项目的创建和维护,并减少错误的数量。
通过变量,可以轻松地在Ansible项目中管理给定环境的动态值。例如,变量可能包含下面这些值:
要创建的用户
要安装的软件包
要重新启动的服务
要删除的文件
要从互联网检索的存档

命名变量
变量的名称必须以字母开头,并且只能包含字母、数字和下划线。
无效和有效的Ansible变量名称示例
无效的变量名称 有效的变量名称
web server      web_server
remote.file     remote_file
1st file        file_1
                file1
remoteserver$1  remote_server_1
                remote_server1
定义变量
可以在Ansible项目中的多个位置定义变量。不过,这些变量大致可简化为三个范围级别:
全局范围:从命令行或Ansible配置设置的变量
Play范围:在play和相关结构中设置的变量
主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量

如果在多个xeklh定义了相同名称的变量,则采用优先级别最高的变量。窄范围优先于更广泛的范围:由清单定义的变量将被playbook定义的变量覆盖,后者将被命令行中定义的变量覆盖。

在Playbook中使用变量
声明了变量后,可以在任务中使用这些变量。若要引用变量,可以将变量名放在双大括号内。在任务执行时,Ansible会将变量替换为其值。
例如:
vars:
user: joe

tasks:
  - name: creates the user {{ user }}
    user:
      name: "{{ user }}"

主机变量和组变量
直接应用于主机的清单变量分为两在类:
主机变量,应用于特定主机
组管理,应用于一个主机组或一组主机组中的所有主机
主机变量优先于组变量,但playbook中定义的变量的优先级比这两者更高。
若要定义主机变量和组变量,一种方法是直接在清单文件中定义。这是较旧的做法,不建议采用,但你可能会在未来的工作当中遇到。
单个自己的user变量定义
[servers]
192.168.145.164  user=ash

主机组的user变量定义
[apache]
192.168.145.163
192.168.145.164

[server:vars]
user=ash

server组的user组变量定义
[server1]
192.168.145.163
192.168.145.164

[server2]
192.168.145.165
192.168.145.167

[server:children]
server1
server2


使用目录填充主机和组变量
定义主机和主机组的变量的首选做法是在与清单文件或目录相同的工作目录中,创建group_vars和host_vars两个目录。这两个目录分别包含用于定义组变量和主机变量的文件。
建议的做法是使用host_vars和group_vars目录定义清单变量,而不直接在清单文件中定义它们。
为了定义用于servers组的组变量,需要创建名为group_vars/servers的YAML文件,然后该文件的内容将使用与playbook相同的语法将变量设置为值:
user:joe
类似的,为了定义用于特定主机的主机变量,需要在host_vars目录中创建名称与主机匹配的文件来存放主机变量。

[root@localhost ansible]# vim inventory 
[root@localhost ansible]# cat inventory 
[apache]
192.168.145.163
[root@localhost ansible]# vim host_vars/192.168.145.163
[root@localhost ansible]# cat host_vars/192.168.145.163 
ansinle_user: root
ansible_password: zs123
[root@localhost ansible]# ansible apache -m ping
192.168.145.163 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
[root@localhost ansible]# mkdir group_vars
[root@localhost ansible]# vim group_vars/192.168.145.163
[root@localhost ansible]# cat group_vars/192.168.145.163 
ansible_user: root
ansible_password: zs123
[root@localhost ansible]# ansible apache -m ping
192.168.145.163 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
[root@localhost ansible]# tree 
.
├── ansible.cfg
├── group_vars
│   └── 192.168.145.163
├── hosts
├── host_vars
│   └── 192.168.145.163
├── inventory
├── playbook
│   ├── firewalld.yml
│   ├── host_vars
│   │   └── apache.yml
│   ├── install.yml
│   └── packages
│       ├── apr-1.7.0.tar.gz
│       ├── apr-util-1.6.1.tar.gz
│       └── httpd-2.4.48.tar.gz
└── roles

6 directories, 11 files
 
posted @ 2021-07-23 20:18  Aimmi  阅读(125)  评论(0)    收藏  举报