ansible临时命令ad-hoc

ansible中有两种模式,分别是ad-hoc模式和playbook模式

ad-hoc简而言之,就是"临时命令"
https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html
临时命令非常适合您很少重复的任务。例如,如果您想在圣诞节假期关闭实验室中的所有机器。

Ansible ad hoc 命令使用/usr/bin/ansible命令行工具在一个或多个托管节点上自动执行单个任务。ad hoc 命令既快速又简单,但它们不可重复使用。

ansible-playbook

Ansible Playbooks 提供了一个可重复、可重用、简单的配置管理和多机部署系统,非常适合部署复杂的应用程序。

如果您需要多次使用 Ansible 执行任务,请编写剧本并将其置于源代码控制之下。

例如,于超老师的快乐生活

- 演员列表: 于超,樵夫
    场景:
        - 场景1: 于超老师开始授课linux
          动作1: 头戴麦克风,手拿机械键盘,一顿噼里啪啦疯狂输出

        - 场景2: 樵夫老师开始授课python
          动作1: 一顿狮吼功,震耳欲聋,讲过的爬虫程序如同蝗虫过境,没讲一次课,就有一个网站崩溃

对比playbook的语法

- hosts: 需要执行的机器,nfs
  tasks:
    - 任务1:安装nfs
      动作: yum install nfs
    - 任务2:创建数据目录
        动作: mkdir -p xxxx

yaml语法

ansible软件的playbook编写需要遵循YAML语法,因此我们得先学一下YAML语法结构

yaml特点

1.严格的缩进(空格数)表示层级关系(一般敲2个空格表示一个层级关系)
2.不要使用tab键
3.冒号: 后面一定得有空格
4.短横线- 后面一定得有空格
5.剧本文件名必须是yaml或者yml,程序可以读取,以及vim提供颜色高亮

修改ansible的输出结果为json

修改ansible的配置文件,让它输出的结果是一个json
[root@master-61 /opt]#vim /etc/ansible/ansible.cfg 

[defaults]
stdout_callback = json
bin_ansible_callbacks = True


json的作用就是
定义了一堆 键值对的数据格式

根据key就可以拿到value

{ "key": "value"  } 读作字典形式


可以看到,此时ansible的命令输出结果,全部变为了json的格式

playbook组成规范

hosts: 需要执行的机器
tasks: 需要执行的任务
name: 任务名称

安装nginx的示例对比

yaml风格1
字典参数格式

1.先写好yaml
[root@master-61 /opt]#cat install_nginx.yml 
---
- name: 这是一个安装nginx的剧本
  hosts: nfs
  tasks: 
  - name: 01 安装nginx
    yum: 
      name: nginx
      state: installed
  - name: 02 启动nginx
    systemd:
      name: nginx
      state: started



2.可以去验证yaml语法是否正确

方法1,用ansible-playbook命令
ansible-playbook  -C  install_nginx.yml 

yaml中定义hosts的信息语法

# 方式一:定义所管理的主机IP地址
- hosts: 192.168.178.111
  tasks: 
    动作...

# 方式二:定义所管理主机的名字
- hosts: backup01
  tasks:
    动作...

# 方式三:定义管理主机
- hosts: 192.168.178.111, rsync01
  tasks:
    动作...

# 方式四:管理所有主机
- hosts: all
  tasks:
    动作...

关于剧本的tasks任务部分

tasks任务部分,就是决定用什么模块,做什么事,以及模块对应的参数的风格
字典风格的模块参数

[root@master-61 /opt]#cat install_nginx.yml 
---
- name: 这是一个安装nginx的剧本
  hosts: 172.16.1.7,172.16.1.8,nfs
  tasks: 
  - name: 01 安装nginx
    yum: 
      name: nginx
      state: installed
  - name: 02 启动nginx
    systemd:
      name: nginx
      state: started

简化版模块参数

[root@master-61 /opt]#cat vars_install_nginx.yml 
---
- name: 这是一个安装nginx的剧本
  hosts: 172.16.1.7,172.16.1.8,nfs
  tasks: 
  - name: 01 安装nginx
    yum: name=nginx state=installed 
  - name: 02 启动nginx
    systemd: name=nginx state=started
  - name: 03 设置nginx开机自启
    systemd: name=nginx enabled=yes

yaml支持的数据类型

yaml这个语法中,只有三个数据类型

  • 字典类型,特点就是 key : value形式
  • 列表形式,特点是 通过 短横线定义
  • 纯变量形式
数据类型
YAML 支持以下几种数据类型:

对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

纯量(scalars):单个的、不可再分的值

我们都以python的数据类型来称呼yaml中支持的数据类型

yaml中字典

key : value类型

字典键值对使用冒号结构表示 key: value,冒号后面要加一个空格。

支持字典嵌套

yaml中列表

python

[ 1,2,3,"汉字","你好"  ,["我是嵌套的列表,第一个元素"]  ]

shell中也支持列表,(数组)
以 - 短横线开头,表示构成一个列表

在python中列表形式为 [1,2,3,'a','b','老王'],非常强大

shell也支持列表(数组),表示形式为,功能比较单一
[root@yuchao-tx-server ~]#students=("于超" "老王" "狗蛋")
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]#set|grep students
students=([0]="于超" [1]="老王" [2]="狗蛋")

[root@yuchao-tx-server ~]#echo ${students[0]}
于超
[root@yuchao-tx-server ~]#echo ${students[1]}
老王
[root@yuchao-tx-server ~]#echo ${students[2]}
狗蛋

yaml中纯变量

表示单纯的变量,支持数据类型有

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期

关于yaml的短横线定义列表

短横线用于定义列表

多个短横线,同一个缩进下的元素,表示一个列表中的多个元素
- xxx
- ooo
- ddd
- ccc

"xxx", "ooo","ddd","ccc"
识别为,同一个列表下的多个元素



一个短横线,同一个缩进下的元素,表示是一个整体,大字符串

- xxx
  ooo
  ddd
  ccc
  
其实处理的数据是 "xxx ooo ddd ccc"
将如下的ad-hoc转为yaml格式

# 1,先写ad-hoc命令模式
#2.对比理解转为yaml


ansible  web   -m  file -a "path=/etc/foo.conf     owner=foo    group=foo     mode=0644"  

# 写name字段,是表示定义剧本的注释,这一次任务的名称
# 写成字典风格的 模块参数
# 同一个缩进下,表示是一个整体,是一个大字符串

- name: 修改文件的属性
  file:
    path: /etc/foo.conf
    owner: foo
    group: foo
    mode: 0644

json学习

语法

JSON 语法是 JavaScript 对象表示语法的子集。

数据在名称/值对中

数据由逗号分隔

大括号 {} 保存字典

中括号 [] 保存列表,列表可以包含多个对象

JSON 值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在中括号中)
  • 对象(在大括号中)
  • null
    json的语法实例
{
    "students":null,
    "age":18,
    "male":true,
    "手机号":[
        152100000000,
        16800000000
    ],
    "你快乐吗":"我很快乐"
}

学习如何提取json的数据

根据key,提取value

前端通过js代码提取
后端 通过python代码提取

运维通过jq命令提取

jq命令学习

使用jq命令,得用jq支持的语法来提取key、value;

通过点.作为表达式,提取key。
通过逗号,,写多个提取表达式

通过管道符|串行执行,多层次提取

1. 安装jq命令
yum install jq -y

2.简单json数据提取

[root@master-61 ~]#echo   '{"name":"德玛西亚","price":6888}'   | jq  

提取名字的值,价格
必须使用jq命令的过滤器,如下的语法

语法是 通过 . 提取,比如 jq '.name,.price'


[root@master-61 ~]#echo   '{"name":"德玛西亚","price":6888}'   | jq  '.name'
"德玛西亚"
[root@master-61 ~]#
[root@master-61 ~]#
[root@master-61 ~]#echo   '{"name":"德玛西亚","price":6888}'   | jq  '.price'
6888
[root@master-61 ~]#
[root@master-61 ~]#
[root@master-61 ~]#echo   '{"name":"德玛西亚","price":6888}'   | jq  '.price,.name'
6888
"德玛西亚"


3.数据再多一点
[root@master-61 ~]#echo   '{"name":"德玛西亚","price":6888,"hero_logo":"https://www.tukuppt.com/muban/zanyjwnk.html"}'   | jq '.price,.hero_logo,.name'
6888
"https://www.tukuppt.com/muban/zanyjwnk.html"
"德玛西亚"

练习

json这个数据交互格式,语法是如下,是用于在网络中进行数据传输的
{ "key": "value" , "key2":"value2"  }

json传递给后端后,后端需要解析为当前编程语言的数据类型,才可以继续使用,解析
python举例

json数据 ,如{ "key": "value" , "key2":"value2"  }

发给python后,要进行解析 ↓

python中的字典类型,{ "key": "value" , "key2":"value2"  }

将如下json转为yaml

[
  {
    "0224": {
      "老师": "于超",
      "学生们": [
        {
          "黄彦": [
            {
              "年龄": 23,
              "地址": "深圳"
            }
          ],
          "陈亮亮": [
            {
              "年龄": 24,
              "地址": "广州"
            }
          ],
          "罗兴林": [
            {
              "年龄": 26,
              "地址": "贵州"
            }
          ]
        }
      ]
    }
  }
]
- "0224":               
    "老师": "于超"
    "学生们":
      - "黄彦": 
          - "年龄": 23
            "地址": "深圳"
        "陈亮亮":
          - "年龄": 24
            "地址": "广州"
        "罗兴林":
          - "年龄": 26
            "地址": "贵州"

使用jq命令

1.提取出 于超
[root@master-61 ~]#cat test1.json |   jq '.[0]   |  ."0224"   |  ."老师"'

2.提取出学生列表

[root@master-61 ~]#cat  test1.json |  jq '.[0]  |  ."0224"  |  ."学生们"  '

2.1 提取出这个列表中的值
[root@master-61 ~]#cat  test1.json |  jq '.[0]  |  ."0224"  |  ."学生们" |  .[0]   '

3.提取出罗兴林的资料
[root@master-61 ~]#cat test1.json | jq  ' .[] |  ."0224"  |  ."学生们"  |  .[]  |  ."罗兴林"  |  .[]  |  ."年龄",."地址"  '
26
"贵州"

4.提取出陈亮亮的资料
[root@master-61 ~]#cat test1.json | jq  ' .[] |  ."0224"  |  ."学生们"  |  .[]  |  ."陈亮亮"  |  .[]  |  ."年龄",."地址"  '
24
"广州"

5.提取出黄彦的地址
[root@master-61 ~]#cat test1.json | jq  ' .[] |  ."0224"  |  ."学生们"  |  .[]  |  ."黄彦"  |  .[]  |  ."地址"  '
"深圳"

6.提取出罗兴林的年龄

[root@master-61 ~]#cat test1.json | jq  ' .[] |  ."0224"  |  ."学生们"  |  .[]  |  ."罗兴林"  |  .[]  |  ."年龄"  '
26
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。