Ansible自动化运维之playbook详解(含yaml介绍)及ansible的加密控制

Posted Tuki_a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible自动化运维之playbook详解(含yaml介绍)及ansible的加密控制相关的知识,希望对你有一定的参考价值。

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-checkcheck 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的加密控制的主要内容,如果未能解决你的问题,请参考以下文章

Ansible自动化运维之Playbook详解及体验

自动化运维之ansible详解

自动化运维Ansible之Playbook剧本(持续更新)

自动化运维之 Ansible——安装配置

Linux学习总结(七十四)自动化运维之ansible

走进自动化运维之Ansible服务部署,附带(参数及模块)详解!