Ansible自动化运维之playbook详解(含yaml介绍)及ansible的加密控制
Posted Tuki_a
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible自动化运维之playbook详解(含yaml介绍)及ansible的加密控制相关的知识,希望对你有一定的参考价值。
playbook
playbook简介
Playbooks 记录并执行 Ansible 的配置、部署和编排功能。它们可以描述希望远程系统执行的策略,或一般 IT 流程中的一组步骤。
如果 Ansible 模块是工具,那么Playbooks就是说明手册,主机清单inventory就是原材料。
在基本层面上,Playbooks可用于管理远程机器的配置和部署。在更高级的层面上,他们可以对涉及滚动更新的多层部署进行排序,并且可以将操作委托给其他主机,并在此过程中与监控服务器和负载平衡器进行交互。
Playbooks 被设计为人类可读的,并且是用基本的文本语言开发的。有多种方法可以组织 playbook 及其包含的文件。
playbook 是由一个或多个play组成的列表。Playbook 文件使用YAML来写的。
官网:https://docs.ansible.com/ansible/latest/user_guide/playbooks.html#working-with-playbooks
YAML语言
YAML(Yet Another Markup Language)不是标记语言,它是适用于所有编程语言的人类友好数据序列化标准。
使用 YAML 是因为它比 XML 或 JSON 等其他常见数据格式更易于人类读写。此外,大多数编程语言中都有可用于 YAML 的库。
yaml官网:https://yaml.org/
ansible官网:https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
特点:
可读性好、和脚本语言交互性号、易于实现、适用程序执行流梳理方式、可扩展性强
语法简介:
几乎每个 YAML 文件都以列表开头。列表中的每一项都是一个键/值对列表,通常称为“哈希”或“字典”。
所有 YAML 文件(无论它们是否与 Ansible 关联)都可以选择---
以...
,表示文档的开始和结束。
列表的所有成员都是以相同缩进级别开头的行,以破折号和空格开头:"- "
。
字典以简单的形式表示(冒号后面必须跟一个空格):key: value
。
次行一般书写文件内容、缩进严格、大小写敏感。
key/value可以多行书写也可一行书写,一行书写用,
隔开。
value可以是个字符串,也可是list。
一个play需要包括name和tasks,name 是描述;tasks 是动作。
一个name只能包含一个task。
扩展名称yml或者yaml。
列表和字典另一种表示方法(麻烦,不推荐):
1、这种形式[Linux,C++,Java,Python]
等价于:
- Linux
- C++
- Java
- Python
2、这种形式
- file: {path: /mnt/file1, state: touch}
等价于:
- file:
path: /mnt/file1
state: touch
演示环境
三台虚拟机:rhel7.6的OS
server1(controller) 192.168.122.11 ansible管理端
server2(node1) 192.168.122.12 远程主机
server3(node1) 192.168.122.13 远程主机
查看帮助
使用如下命令查看某一模块的帮助,EXAMPLE就是一个很好的playbook的模板。不会写的时候可以看着仿照着写
[devops@controller ansible]$ ansible-doc service | less
playbook执行命令
格式:ansible-playbook xxx.yml ...
常用参数 | 含义 |
---|---|
–check/-C | 预执行检测 |
–syntax-check | check language,检查语法有没有问题 |
–list-hosts | 列出hosts |
–list-tags | 列出tag |
–list-tasks | 列出task |
–limit | 指定执行主机 |
-v -vv | 实现过程 |
编写一个yaml脚本
[devops@controller ansible]$ vim test.yaml
---
- name: test
hosts: all
tasks:
- name: debug
debug:
msg: hello world
检查语法有没有问题,如下图就是没有
预执行检测
列出主机和任务
执行没有问题,当有多台受控主机时可以--limit
指定执行主机
playbook中变量的命名和变量的级别
- 变量的命名:
只能包含数字,下划线,字母
只能用下划线或字母开头 - 变量级别
1、全局:从命令行或配置文件中设定的
2、paly:在play和相关结构中设定的
3、主机:由清单,事实收集或注册的任务 - 变量优先级设定:
狭窄范围有限与广域范围
playbook中变量设定和使用方式
1.在playbook中直接定义变量
直接在yaml脚本里定义变量并使用
[devops@controller ansible]$ vim test.yaml
---
- name: test
hosts: all
vars:
string_1: hello world #定义了一个变量
tasks:
- name: test
debug:
msg: "{{ string_1 }}" #使用上边定义的变量
执行成功
2.在文件中定义变量
变量定义在其他文件,引用过来
[devops@controller ansible]$ vim value.yaml
---
lucky: hello world #在这个文件里定义了lucky这个变量
#多个时可如下定义
#---
#lucky:
# - hello world
# - hello linux
[devops@controller ansible]$ vim test.yaml
---
- name: test
hosts: all
vars_files: ./value.yaml #使用value.yaml文件定义的变量
tasks:
- name: test
debug:
msg: "{{ lucky }}" #使用value.yaml文件定义的变量lucky
执行成功
使用多个文件中的变量
[devops@controller ansible]$ vim value.yaml
---
lucky: hello world
[devops@controller ansible]$ vim value2.yaml
---
two: this is second value
[devops@controller ansible]$ vim test.yaml
---
- name: test
hosts: all
vars_files:
- ./value.yaml
- ./value2.yaml
tasks:
- name: test
debug:
msg: "{{ lucky }} {{ two }}" #将两个变量当作一个输出
执行成功
循环使用一个变量里的多个值创建用户
[devops@controller ansible]$ vim value.yaml
---
lucky:
- user1
- user2
[devops@controller ansible]$ vim test.yaml
---
- name: test
hosts: all
vars_files:
- ./value.yaml
tasks:
- name: user
user:
name: "{{ item }}"
state: present
loop:
"{{ lucky }}"
[devops@controller ansible]$ ansible-playbook test.yaml
[root@node1 mnt]# tail -n 6 /etc/passwd | awk -F : '{ print $1 }'
执行成功
到node端查看用户创建成功
编写一个下载httpd和ftp并开启的脚本
[devops@controller ansible]$ vim service.yaml
---
service:
- httpd
- vsftpd
[devops@controller ansible]$ vim install.yaml
---
- name: httpd and vsftpd
vars_files:
- ./service.yaml
hosts: all
tasks:
- name: install
yum:
name: "{{ service }}" #yum模块可以引用多个变量所以不需要循环,系统是8的用dnf模块
state: present
- name: start service
service:
name: "{{ item }}" #service一次只能一个所以要循环
state: restarted
enabled: yes
loop:
"{{ service }}"
执行成功
到node端查看服务开启成功
3.设定主机变量和清单变量
在定义主机变量和清单变量时使用,直接在主机清单里定义变量
[devops@controller ansible]$ vim hosts
[test]
node1
[test:vars] #这儿要与前面的名称一致,都是test。相当于是主机变量
USER=test1
[devops@controller ansible]$ vim user.yaml
---
- name: create user
hosts: all
tasks:
- name: user mode
user:
name: "{{ USER }}" #直接引用即可,主机变量已经采集到
state: present
执行成功
用户创建成功
4.目录设定变量
group_vars:清单变量,目录中的文件名称与主机清单名称一致
host_vars:主机变量,目录中的文件名称与主机名称一致
创建清单变量
[devops@controller ansible]$ mkdir group_vars #固定目录名,只有这个目录下的才能采集到,随便其他的目录不行
[devops@controller ansible]$ cd group_vars/
[devops@controller group_vars]$ vim test.yaml #文件名要和主机清单里的组名一致,否则采集不到
---
USER: testuser1 #一个变量时必须这么写,否则会报错
[devops@controller ansible]$ vim user.yaml #文件和上面一样
---
- name: create user
hosts: all
tasks:
- name: user mode
user:
name: "{{ USER }}" #直接引用即可,主机变量自动采集
state: present
执行成功
创建主机变量
[devops@controller ansible]$ mkdir host_vars
[devops@controller ansible]$ cd host_vars/
[devops@controller host_vars]$ vim node1.yaml #这个要和主机清单里写的一致,如果清单里写的是ip那这里也要写ip,主机名就写主机名
---
USER: testuser2
[devops@controller ansible]$ vim user.yaml #文件和上面一样
---
- name: create user
hosts: all
tasks:
- name: user mode
user:
name: "{{ USER }}" #直接引用即可,主机变量自动采集
state: present
执行成功
用户创建成功
5.用命令覆盖变量
直接在命令后边跟变量
[devops@controller ansible]$ ansible-playbook user.yaml -e "USER=hello"
Ansible的加密控制
shell脚本的加密
shell脚本加密:使用shc工具,安装步骤如下
下载并编译shc工具:
yum -y install gcc gcc-c++
wget http://www.datsi.fi.upm.es/%7Efrosal/sources/shc-3.8.7.tgz
tar zxf shc-3.8.7.tgz
mkdir -p /usr/local/man/man1
cd shc-3.8.7
make test && make strings && make expiration &&make install
使用示例:
[root@controller ~]# shc -r -f test.sh #脚本前一定要加#!/bin/bash
r其他系统也能用,f指定要编译的shell的路径及文件名
xxxx.sh.x 二进制文件,重命名后用 chmod +x xxxx.sh 赋予权限后可执行
xxxx.sh.x.c C语言文件,无用,可以删除
ansible中的加密
1、创建加密文件
2、文本密钥形式创建加密文件
3、交互式查看加密文件
4、文本密钥形式查看加密文件
5、编辑加密文件
也可以指定密钥文件编辑
6、更改密码
也可以指定密钥文件编辑
7、解密文件
也可以指定密钥文件编辑,解密后可以直接看
8、加密现有文件
也可以指定密钥文件编辑
9、执行加密脚本
也可以指定密钥文件
以上是关于Ansible自动化运维之playbook详解(含yaml介绍)及ansible的加密控制的主要内容,如果未能解决你的问题,请参考以下文章