自动化运维工具

Ansible批处理工具

Ansible批处理工具功能图

Ansible项目架构图

一、Ansible介绍
1、Ansible简介
简介
ansible是一种自动化运维工具,基于paramiko模块开发,实现了批量系统配置、批量程序部署、批量运行命令功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只提供一种框架。ansible这个框架主要包含以下功能:
(1)连接插件connection plugins:负责和被监控端事先通信;
(2)host inventory:操作主机清单;

(3)核心模块、扩展模块;
(4)借助与插件完成记录日志邮件等功能;
(5)Playbook:剧本
简单的说ansible是一个配置管理系统(configuration management system)。你只需要可以使用 ssh 访问你的服务器或设备就行。它也不同于其他工具,因为它使用推送的方式,而不是像 puppet 等 那样使用拉取安装agent的方式。你可以将代码部署到任意数量的服务器上!
特性
(1)No agents: 不需要在被管理主机上安装任何客户端软件。
(2)No server: 无服务器端的概念,使用时直接运行命令即可。
(3)Modules in any languages: 基于模块工作,可使用任意语言开发模块。
(4)Yaml, not code: 使用yaml语言定制剧本playbook。
(5)Ssh by default: 基于SSH工作。
优点
(1)轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可。
(2)批量任务执可以写成脚本,而且不用分发到远程就可以执行。
(3)使用python编写,维护更简单
(4)支持sudo

2、Ansible工作原理
架构图:

原理图:

注:
1、管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接-这部分对应基本架构图中的连接模块;
2、可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作-而单个模块、单条命令的批量执行,我们可以称之为ad-hoc;
3、管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件
3、Ansible基本组成
上图为ansible的基本架构,从上图可以了解到其由以下部分组成:
核心:(ansible),组合INVENTORY、 API、 MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具

  • 核心模块(Core Modules):这些都是ansible自带的模块,使用ansible-doc –l 可查看模块
  • 扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块
  • 插件(Plugins):完成模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  • 剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行,通常是YAML文件
  • 连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
  • 主机清单(Host Inventory):定义ansible管理的主机

二、Ansible常用操作
1、Ansible安装配置
两种安装方式
1、yum方式安装
[root@node01 ~]# yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
[root@node01 ~]# yum install ansible -y
[root@node01 ~]# ansible --version
2、pip方式安装
[root@node01 ~]# yum install python-pip
[root@node01 ~]# pip install ansible
[root@node01 ~]# ansible --version
注:不同操作系统下载命令不一样,具体参考官网:https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
配置文件或指令

配置文件或指令

描述

/etc/ansible/ansible.cfg

主配置文件,配置ansible工作特性

/etc/ansible/hosts

默认主机清单

/etc/ansible/roles/

存放角色的目录

/usr/bin/ansible

主程序,临时命令执行工具

/usr/bin/ansible-doc

查看配置文档,模块功能查看工具

/usr/bin/ansible-galaxy

下载/上传优秀代码或Roles模块的官网平台

/usr/bin/ansible-playbook

定制自动化任务,编排剧本工具

/usr/bin/ansible-pull

远程执行命令的工具

/usr/bin/ansible-vault

文件加密工具

/usr/bin/ansible-console

基于Console界面与用户交互的执行工具

配置文件

默认配置文件/etc/ansible/ansible.cfg

一般不需要修改,常用的参数为

[defaults]

#inventory = /etc/ansible/hosts # 主机列表配置文件

#library = /usr/share/my_modules/ # 库文件存放目录

#remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录

#local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录

#forks = 5 # 默认并发数

#sudo_user = root # 默认sudo 用户

#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码

#ask_pass = True      #连接时提示输入ssh密码

#remote_port = 22     #远程主机的默认端口,生产中这个端口应该会不同

#log_path = /var/log/ansible.log #日志

#host_key_checking = False # 检查对应服务器的host_key,建议取消注释。也就是不会弹出

配置文件

路径

作用域说明

优先度

系统级配置文件

/etc/ansible/ansible.cfg

为系统级别的设定文件,对所有用户起效

最低

用户级配置文件

~/ansible.cfg

为用户级设定文件,对当前用户起效

高于系统级配置文件

当前运行应用级配置文件

./ansible.cfg

当前运行的playbook等所指定的配置文件,对当前执行操作起效

高于用户级配置文件

ANSIBLE_CONFIG环境变量指定配置文件

export ANSIBLE_CONFIG=配置文件路径

当前运行的playbook等所指定的配置文件,对当前执行操作起效

高于当前路径下的ansible.cfg配置文件

主机清单-Inventory

默认清单文件/etc/ansible/hosts;Ansible必须通过Inventory 来管理主机。Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置

[web]                                           # web主机组

192.168.100.111                                 # 主机组包含的主机IP或者主机名

node02

[mysql]                                         # mysql主机组

192.168.100.113

[yonyou:children]                               # 组的继承(嵌套),代表yonyou组包含web和mysql组中的所有主机

web

mysql

#[yonyou]

#192.168.100.11[1:3]                            # 另一种写法,正则通配

[web:vars]                                      # 设置组变量

ansible_ssh_user=root

ansible_ssh_port=22

ansible_ssh_pass=e

[mysql:vars]

ansible_ssh_user=root

ansible_ssh_port=22

ansible_ssh_pass=ee

注:常用主机参数变量

ansible_connection              主机连接类型,这可以是任何 ansible 连接插件的名称,如 smart、ssh、paramiko、local

ansible_ssh_host                将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.

ansible_ssh_port                ssh端口号.如果不是默认的端口号,通过此变量设置.

ansible_ssh_user                默认的 ssh 用户名

ansible_ssh_pass                ssh 密码(这种方式并不安全,我们强烈建议使用 SSH 密钥)     

ansible_ssh_private_key_file    ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况

ansible_python_interpreter      目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python"

ansible_interpreter             这里的""可以是 ruby、perl或其他语言的解释器,作用和ansible_python_interpreter类似

例:

node1.python.com      ansible_python_interpreter=/usr/local/bin/python

node2.ruby.com        ansible_ruby_interpreter=/usr/bin/ruby.1.9.3

ansible变量

定义变量的方式

1.通过命令行进行变量定义

2.在playbook文件中进行变量定义

3.通过Inventory主机信息文件中进行变量定义

4.通过vars_files的方式定义变量

5.通过host_vars和group_vars定义变量

1.在playbook文件中进行变量定义

1)方式一:在模块下面定义变量

- hosts: web_group

  tasks:

    - name: ensure a list of packages installed

      yum:

        name: "{{ packages }}"

      vars:

        packages:

        - httpd

        - httpd-tools

    - name: remove server

      yum:

        name: "{{ packages }}"

        state: absent

      vars:

        packages:

        - httpd

        - httpd-tools

#问题:模块下定义变量,变量只在当前动作生效,到其他动作后变量需要重新定义

2)方式二:在hosts下面定义变量

- hosts: web_group

  vars:

    packages:

    - httpd

    - httpd-tools

  tasks:

    - name: ensure a list of packages installed

      yum:

        name: "{{ packages }}"

    - name:

      yum:

        name: "{{ packages }}"

        state: absent

3)方式三:在hosts下面定义多个变量

- hosts: web_group

  vars:

    packages:

      - httpd

      - httpd-tools

    db:

      - mariadb-server

      - MySQL-python

  tasks:

    - name: install web server

      yum:

        name: "{{ packages }}"

    - name: install mariadb-server

      yum:

        name: "{{ db }}"

#问题:变量卸载hosts下面,可以解决多个动作分别设置变量的问题,但是设置的变量只能在当前的playbook中使用,其他的playbook无法使用

2.使用vars_file定义变量

1)定义变量文件

[root@node01 ~]# vim vars.yml

web:

  - httpd

  - httpd-tools

db: mariadb-server

2) palybook调用变量文件

[root@node01 ~]# vim moudle_vars.yml

- hosts: web_group

  vars_files: /root/vars.yml

  tasks:

    - name: install web server

      yum:

        name: "{{ web }}"

        state: absent

    - name: install mariadb-server

      yum:

        name: "{{ db }}"

        state: absent

3)添加变量文件

[root@node01 ~]# vim vars1.yml

nfs:

  - nfs-utils

  - rpcbind

4)调用多个变量文件

[root@node01 ~]# vim moudle_vars.yml

- hosts: web_group

  vars_files:

    - /root/vars.yml

    - /root/vars1.yml

  tasks:

    - name: install web server

      yum:

        name: "{{ web }}"

    - name: install mariadb-server

      yum:

        name: "{{ db }}"

    - name: install nfs server

      yum:

        name: "{{ nfs }}"

3.在inventory清单中定义变量

1)主机清单中定义变量

[root@node01 ~]# vim /etc/ansible/hosts

[web_group]

web01 ansible_ssh_pass='1'

web02 ansible_ssh_pass='1'

web03 ansible_ssh_pass='1'

......

[web_group:vars]

web=httpd

db=mariadb-server

2)调用变量

- hosts: web_group

  tasks:

    - name: install web server

      yum:

        name: "{{ web }}"

        state: absent

    - name: install db server

      yum:

        name: "{{ db }}"

注:

    1.主机清单定义变量,只能给某个组使用,如果所有主机都使用需要定义很多变量

    2.主机清单内容很多的时候,配置变量会使文件变得太大

4.使用内置变量

1)直接使用内置变量

[root@node01 ~]# vim mkdir.yml

- hosts: nginx_group

  tasks:

    - name: Mkdir dir

      file:

        path: /backup/{{ansible_fqdn}}_{{ansible_all.ipv4.addresses}}_{{ansible_date_time.date}}

        state: directory

2)内置变量设置变量

[root@node01 ~]# vim mkdir.yml

- hosts: nginx_group

  vars:

    - remote_ip: "{{ansible_eth1.ipv4.address}}"

    - host: "{{ansible_fqdn}}"

    - date: "{{ansible_date_time.date}}"

  tasks:

    - name: Mkdir dir

      file:

        path: /backup/{{remote_ip}}_{{host}}_{{date}}

        state: directory

3)内置变量常用方式

#编写配置文件

[root@node01 ~]# vim /root/conf/redis.conf

bind {{ansible_all.ipv4.addresses}}

#编写playbook

[root@node01 ~]# vim redis.yml

- hosts: web_group

  tasks:

    - name: Install Redis Server

      yum:

        name: redis

    - name: Config Redis Server

      template:

        src: /root/conf/redis.conf

        dest: /etc/

5.通过host_vars和group_vars定义变量

以上几种变量定义都不常用,比较推荐的是在Ansible项目目录下创建两个变量目录:

host_vars

group_vars

注:目录名字一定要一致,不能做任何修改

1)主机组定义变量

1.创建主机组变量目录(名字一定是group_vars)

[root@node01 ~]# mkdir group_vars

2.主机组目录下创建变量文件(文件名字一定是主机清单中主机组的名字)

[root@node01 ~]# vim group_vars/web_group

web: httpd

3.调用变量

[root@node01 ~]# vim mkdir.yml

- hosts: web_group

  tasks:

    - name: Mkdir dir

      file:

        path: /tmp/{{web}}

        state: directory

2)主机定义变量

1.创建主机变量目录(名字一定是host_vars)

[root@m01 ~]# mkdir host_vars

2.主机目录下创建变量文件(文件名字一定是主机清单中主机的名字)

[root@m01 ~]# vim host_vars/web01

web: web01_host_vars

3.调用变量

[root@m01 ~]# vim mkdir.yml

- hosts: web_group

  tasks:

    - name: Mkdir dir

      file:

        path: /tmp/{{web}}

        state: directory

 

6.通过命令直接进行变量定义

通过命令行覆盖变量,Inventory的变量会被playbook文件中覆盖, 这两种方式的变量都会被命令行直接指定变量所覆盖,使用--extra-vars或者-e设置变量

1)使用命令行定义单个变量

[root@m01 ~]# ansible-playbook mkdir.yml -e "web=commend"

2)使用命令行定义多个变量

[root@m01 ~]# ansible-playbook mkdir.yml -e "web=commend" -e "db=mysql"

#注意:指定的变量会根据命令行执行,没有指定的变量继续按照变量的设置执行

变量调用优先级排序:从上到下依次降低 

1.命令行

2.vars_files

3.playbook中配置变量

4.主机定义变量

5.主机组定义变量

6.主机清单定义变量

2、Ansible常用模块

1)命令模块

command 默认命令模块 适合使用简单的系统命令,无法支持"<",">","|",";","&"等符号

[root@node01 ~]# ansible 192.168.100.111 -m command -a 'hostname'

192.168.100.111 | CHANGED | rc=0 >>

node01

[root@node01 ~]# ansible 192.168.100.111 -m command -a 'ps -ef | grep /[s]sh'

192.168.100.111 | FAILED | rc=1 >>

error: garbage option

Usage:

 ps [options]

 Try 'ps --help <simple|list|output|threads|misc|all>'

  or 'ps --help <s|l|o|t|m|a>'

 for additional help text.

For more details see ps(1).non-zero return code

shell 类似command模块升级版,支持"<",">","|",";","&"等符号

[root@node01 ~]# ansible 192.168.100.111 -m shell -a 'ps -ef | grep /[s]sh'

192.168.100.111 | CHANGED | rc=0 >>

root       1181      1  0 00:31 ?        00:00:00 /usr/sbin/sshd -D

2)文件模块

copy 用来复制文件至目标主机

参数

选项/默认值

释义

src

指定将本地管理主机的什么数据信息进行远程复制

backup

no* yes

默认数据复制到远程主机,会覆盖原有文件(yes 将源文件进行备份)

content

在文件中添加信息

dest(required)

将数据复制到远程节点的路径信息

group

文件数据复制到远程主机,设置文件属组用户信息

mode

文件数据复制到远程主机,设置数据的权限 eg 0644 0755

owner

文件数据复制到远程主机,设置文件属主用户信息

remote_src

no* yes

如果设置为yes,表示将远程主机上的数据进行移动操作如果设置为no, 表示将管理主机上的数据进行分发操作

[root@node01 ~]# ansible 192.168.100.112 -m copy -a 'src=/root/anaconda-ks.cfg dest=/data'

192.168.100.112 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "checksum": "4ef73c5bfc4ed75d4730d2b0b0ef89ddb7276399",

    "dest": "/data/anaconda-ks.cfg",

    "gid": 0,

    "group": "root",

    "md5sum": "a3fc01960d47b5b1593d21e2c5498339",

    "mode": "0644",

    "owner": "root",

    "secontext": "system_u:object_r:default_t:s0",

    "size": 1822,

    "src": "/root/.ansible/tmp/ansible-tmp-1620178565.68-8213-154834474981466/source",

    "state": "file",

    "uid": 0

}

注:如果目标主机文件与源文件完全一样,则不会被覆盖也不会备份;如果文件名一样,内容不一样才会触发覆盖和备份参数

fetch fetch模块它用于从远程机器获取文件,并将其本地存储在由主机名组织的文件树中

参数

选项/默认值

释义

src(required)

要获取的远程系统上的文件,必须是文件,而不是目录

dest

用于保存文件的目录

[root@node01 ~]# ansible 192.168.100.112 -m fetch -a "src=/data/aaa.txt dest=/root"

192.168.100.112 | CHANGED => {

    "changed": true,

    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",

    "dest": "/root/192.168.100.112/data/aaa.txt",

    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",

    "remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",

    "remote_md5sum": null

}

file file模块用来创建文件、目录、链接文件

参数

选项/默认值

释义

dest/path/name(required)

将数据复制到远程节点的路径信息

group

定义文件/目录的属组

mode

定义文件/目录的权限

owner

定义文件/目录的属主

src

指定将本地管理主机的什么数据信息进行远程复制

state

absent

删除目录、文件或者取消链接文件

=

directory

如果目录不存在,创建目录

=

file

即使文件不存在,也不会被创建

=

touch

如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

=

hard/link

创建链接文件

[root@node01 ~]# ansible 192.168.100.112 -m file -a "path=/data/aaa.txt state=touch"

192.168.100.112 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "dest": "/data/aaa.txt",

    "gid": 0,

    "group": "root",

    "mode": "0644",

    "owner": "root",

    "secontext": "unconfined_u:object_r:default_t:s0",

    "size": 0,

    "state": "file",

    "uid": 0

}

3)安装模块

yum yum模块用来在Centos系统上使用yum命令安装软件包

参数

选项/默认值

释义

name(required)

指定软件名称信息

state

=

present/installed

将软件进行安装

latest

安装最新的软件

absent/removed

将软件进行卸载

4)服务模块

service service模块用来管理centos上的服务的启动、关闭、重启和重载

参数

选项/默认值

释义

enabled

no yes

设置服务是否开机自启动 如果参数不指定,原有服务开机自启动状态进行保留

name (required)

设置要启动/停止服务名称

state=

reloaded

平滑重启

=

restarted

重启

=

started

启动

=

stopped

停止

[root@node01 ~]# ansible 192.168.100.112 -m service -a "name=crond state=started enabled=yes"

5)挂载模块

mount 用于批量管理主机进行挂载卸载操作

参数

选项/默认值

释义

fstype

指定挂载的文件系统类型

opts

指定挂载的参数信息

path

定义一个挂载点信息

src

定义设备文件信息

state

absent

会进行卸载,也会修改fstab文件信息

=

unmounted

会进行卸载,不会修改fstab文件

=

present

不会挂载,只会修改fstab文件

=

mounted

会进行挂载,会修改fstab文件

 

[root@node01 ~]# ansible web01 -m mount -a "src=172.16.10.3:/data/  path=/mnt fstype=nfs state=present"

以上信息只是在/etc/fstab文件中添加了配置信息,不会真正进行挂载(mount -a)

[root@node01 ~]# ansible web01 -m mount -a "src=172.16.10.3:/data/  path=/mnt fstype=nfs state=mounted"

以上信息是在/etc/fstab文件中添加了配置信息,并且也会真正进行挂载

6)定时任务

cron 定时任务模块

参数

选项/默认值

释义

minute/hour/day/month/weekday

和设置时间信息相关参数

job

和设置定时任务相关参数

name(required)

设置定时任务注释信息

state

absent

删除指定定时任务

disabled

yes

将指定定时任务进行注释

=

no

取消注释

[root@node01 ~]# ansible 192.168.100.112 -m cron -a "name='ntpdate time' minute=*/5 job='/usr/sbin/ntpdate ntp1.aliyun.com &> /dev/null'"

192.168.100.112 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "envs": [],

    "jobs": [

        "ntpdate time"

    ]

}

7)用户模块

user user模块用来创建用户

参数

选项/默认值

释义

password

请输入密码信息(必须是密文)

name

指定用户名信息

uid

指定用户uid信息

group

指定用户主要属于哪个组

groups

指定用户属于哪个附加组信息

shell

/bin/bash或/sbin/nologin

指定是否能够登录

create_home

yes/no

是否创建家目录信息

home

指定家目录创建在什么路径 默认/home

[root@node01 ~]# ansible node02 -m user -a "name=snow password={{ '1234' | password_hash('md5') }}"

192.168.100.112 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "append": false,

    "changed": true,

    "comment": "",

    "group": 1001,

    "home": "/home/snow",

    "move_home": false,

    "name": "snow",

    "password": "NOT_LOGGING_PASSWORD",

    "shell": "/bin/bash",

    "state": "present",

    "uid": 1001

}

group group用来创建用户组

参数

选项/默认值

释义

gid

指创建的组ID信息

name

指创建组名称信息

state

absent

删除指定的用户组

=

present

创建指定的用户组

[root@node01 ~]# ansible 192.168.100.112 -m group -a "name=yonyou gid=1055"

192.168.100.112 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "gid": 1055,

    "name": "yonyou",

    "state": "present",

    "system": false

}

8)解压文件

unarchive unarchive模块用来解压文件

参数

选项/默认值

释义

copy

在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在

creates

指定一个文件名,当该文件存在时,则解压指令不执行

dest

远程主机上的一个路径,即文件解压的绝对路径

group

解压后的目录或文件的属组

mode

解压后文件的权限

src

如果copy为yes,则需要指定压缩文件的源路径

owner

解压后文件或目录的属主

[root@node01 ~]# ansible 192.168.100.112 -m unarchive -a "src=/root/test.tar.gz dest=/opt owner=shown group=shown mode=777"
三、Ansible-Playbooks入门
1、Playbooks简介
playbook是一系列ansible命令的集合,由一个或者多个task组成,使用yaml编写,由上而下依次执行
2、批量创建用户
以下是一个创建用户的yaml文件示例:
###### create user ######
- name: create system user you
  hosts: you
  gather_facts: no

  tasks:
   - name: create group you
     group: 
       name: you
       gid: 2045
     ignore_errors: true 

   - name: create user you
     user: 
       name: you
       uid: 2045
       group: you
       password: "{{ '1234' | password_hash('md5') }}"
       createhome: yes
     ignore_errors: true 

   - name: add you sudoers
     lineinfile: dest=/etc/sudoers state=present line='{{item}}' validate='visudo -cf %s'
     with_items:
       - "bonree  ALL=(ALL) NOPASSWD: ALL"

###### create dir ######
- name: create dirs
  hosts: you
  gather_facts: no

  tasks:
   - name: create dir /data/you
     file: >
       path=/data
       state=directory
       owner=you
       group=you

   - name: create dir /data/br/{bin,logs,scripts}
     file: >
       path=/data/you/{{ item }}
       state=directory
       owner=you
       group=you
     with_items:
       - bin
       - logs
       - scripts
[root@node01 yaml]# ansible-playbook -i /home/shown/inventory.cfg init.yml 

PLAY [create system user you] ******************************************************************************************************************************************

TASK [create group you] ************************************************************************************************************************************************
changed: [192.168.100.111]
changed: [192.168.100.112]
changed: [192.168.100.113]

TASK [create user you] *************************************************************************************************************************************************
changed: [192.168.100.112]
changed: [192.168.100.113]
changed: [192.168.100.111]

TASK [add you sudoers] *************************************************************************************************************************************************
changed: [192.168.100.112] => (item=bonree  ALL=(ALL) NOPASSWD: ALL)
changed: [192.168.100.113] => (item=bonree  ALL=(ALL) NOPASSWD: ALL)
changed: [192.168.100.111] => (item=bonree  ALL=(ALL) NOPASSWD: ALL)

PLAY [create dirs] ********************************************************************************************************************************************************

TASK [create dir /data/you] ********************************************************************************************************************************************
changed: [192.168.100.111]
changed: [192.168.100.112]
changed: [192.168.100.113]

TASK [create dir /data/br/{bin,jar,logs,base,data,shell}] *****************************************************************************************************************
changed: [192.168.100.112] => (item=bin)
changed: [192.168.100.113] => (item=bin)
changed: [192.168.100.111] => (item=bin)
changed: [192.168.100.112] => (item=logs)
changed: [192.168.100.113] => (item=logs)
changed: [192.168.100.111] => (item=logs)
changed: [192.168.100.113] => (item=scripts)
changed: [192.168.100.112] => (item=scripts)
changed: [192.168.100.111] => (item=scripts)

PLAY RECAP ****************************************************************************************************************************************************************
192.168.100.111    : ok=5    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.100.112    : ok=5    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.100.113    : ok=5    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

3、playbook进阶
多个角色拆分,分为执行文件、角色文件、清单文件
执行文件
[root@node01 shown]# cat deploy.yml 
- name: system init
  hosts: you
  gather_facts: no
  roles:
    - { role: init, do: ['user', 'dir', 'hostname', 'hosts', 'ssh', 'el7'] }
  tags:
    - init
角色文件
[root@node01 shown]# tree roles/
roles/
└── init
    ├── tasks
    │   ├── dir.yml
    │   ├── el7.yml
    │   ├── hostname.yml
    │   ├── hosts.yml
    │   ├── main.yml
    │   ├── ssh.yml
    │   └── user.yml
    └── templates
        ├── config.j2
        ├── hosts.j2
        ├── network.j2
        ├── you.j2
        └── you.pub.j2

3 directories, 12 files
清单文件
[root@node01 shown]# cat inventory.cfg 
# hostname and ip, add all needed machines
node01 ansible_ssh_host=192.168.100.111
node02 ansible_ssh_host=192.168.100.112
node03 ansible_ssh_host=192.168.100.113

[web]
node01
node02

[mysql]
node03

#[you:children]
#web
#mysql

[you]
node0[1:3]

[web:vars]
ansible_ssh_user=root
ansible_ssh_port=22
ansible_ssh_pass=e

[mysql:vars]
ansible_ssh_user=root
ansible_ssh_port=22
ansible_ssh_pass=ee
执行代码
[root@node01 shown]# ansible-playbook -i inventory.cfg deploy.yml
PLAY [system init] ********************************************************************************************************************************************************

TASK [init : include] *****************************************************************************************************************************************************
included: /home/shown/roles/init/tasks/user.yml for node01, node02, node03
included: /home/shown/roles/init/tasks/dir.yml for node01, node02, node03
included: /home/shown/roles/init/tasks/hostname.yml for node01, node02, node03
included: /home/shown/roles/init/tasks/hosts.yml for node01, node02, node03
included: /home/shown/roles/init/tasks/ssh.yml for node01, node02, node03
included: /home/shown/roles/init/tasks/el7.yml for node01, node02, node03

TASK [init : create group you] *****************************************************************************************************************************************
ok: [node01]
ok: [node03]
ok: [node02]
...
...
...
PLAY RECAP ****************************************************************************************************************************************************************
node01             : ok=34   changed=15   unreachable=0    failed=0    skipped=0    rescued=0    ignored=1   
node02             : ok=33   changed=15   unreachable=0    failed=0    skipped=0    rescued=0    ignored=1   
node03             : ok=33   changed=15   unreachable=0    failed=0    skipped=0    rescued=0    ignored=1
 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/798149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++11】右值引用 + 移动语义 + 完美转发(重点)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

C++学习笔记(七)

一、string字符串容器 #include <iostream>using namespace std;int main() {string name;name "hello";string str(10,w);cout << str << endl;name "hello world";string sub1(name,0,5);cout << sub1 << endl;4string…

第四百四十六回

文章目录 1. 概念介绍2. 使用方法3. 示例代码4. 经验与总结4.1 经验分享4.2 内容总结 我们在上一章回中介绍了"overlay_tooltip简介"相关的内容&#xff0c;本章回中将再谈flutter_launcher_icons包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…

python练习三

模式A num int(input("请输入模式A的层数&#xff1a;")) for i in range(1, num 1):# 画数字for j in range(1, i 1):print(str(j) "\t", end"")print() 模式B num int(input("请输入模式B的层数&#xff1a;")) for i in ran…

Pandas中的 .map 方法

1. Pandas中的 .map 方法 在Pandas中&#xff0c;.map 方法通常用于Series对象&#xff0c;它允许你根据一个字典或者函数对Series中的每个元素进行转换。 import pandas as pd # 创建一个简单的DataFrame df pd.DataFrame({ Name: [Alice, Bob, Charlie, Alice, Bob, C…

redis-Hash

一&#xff0c;应用场景 Redis hash 是一个string类型的field和value的映射表&#xff0c;hash特别适合用于存储对象。Set就是一种简化的Hash,只变动key,而value使用默认值填充。 可以将一个Hash表作为一个对象进行存储&#xff0c;表中存放对象的信息。 二&#xff0c;命令 H…

Ubuntu18.04安装Node.js教程

在Ubuntu 18.04上安装Node并部署环境变量的过程可以分为以下几个步骤&#xff1a; 安装Node.js 您可以选择从Ubuntu的软件源直接安装Node.js&#xff0c;或者使用NodeSource提供的仓库安装特定版本的Node.js。 从Ubuntu软件源安装 运行以下命令来更新软件包列表并安装Node.js&…

【stm32】SPI通信简介

SPI通信 SPI简介部分 所有SPI设备的SCK、MOSI、MISO分别连在一起 从主机引出多根SS选择线&#xff0c;分别接到每个从机的SS输入端&#xff0c;主机的SS线都是输出&#xff0c;从机的SS线都是输入&#xff0c;SS线 是低电平有效&#xff0c;同一时间主机只能选择一个从机 只能…

LeetCode 1780. 判断一个数字是否可以表示成三的幂的和

解题思路 该题目可以等价于求三进制的数&#xff0c;把>1的数 return false,剩下的 return true. 相关代码 class Solution {public boolean checkPowersOfThree(int n) {//该题目可以等价成不断地除以3&#xff0c;当余数>1时&#xff0c;则为falsewhile(n>3){ …

cmake学习笔记1

基础概念 CMake是什么&#xff1f; CMake是一个元构建系统(meta build-system),用于生产其他构建系统文件&#xff08;如Makefile或Ninja&#xff09;。 基础操作方式 CMake使用一个CMakeLists.txt文件描述配置&#xff0c;然后使用cmake驱动这个文件生成对应构建系统文件。…

websokcet服务端实现

一/websokcet服务端实现 步骤一&#xff1a; springboot底层帮我们自动配置了websokcet&#xff0c;引入maven依赖 1 2 3 4 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</arti…

AI图片智能选区抠像解决方案

高质量的图片处理往往依赖于繁琐的手动操作&#xff0c;耗费大量时间与精力。美摄科技推出了一款革命性的AI图片智能选区抠像解决方案&#xff0c;旨在帮助企业轻松实现图片的高效处理&#xff0c;提升内容创作效率与质量。 美摄科技的AI图片智能选区抠像解决方案&#xff0c;…

AFCI 应用笔记二之数据采集

1. 简介 基于监督学习的神经网络算法需要大量数据作为输入&#xff0c;模型完全由数据驱动&#xff0c;其数据质量是算法有效的必要条件&#xff0c;所以如何高效的采集到数据&#xff0c;以及正确的标注或分析是极其重要的&#xff0c;如果第一步有问题&#xff0c;后续的所有…

C++搭建深度学习的推理框架

我们的目的是:借助C++搭建一个类似于pytorch,tensorflow的深度学习框架,对标pytorch,tensorflow实现对应的功能。由于本人能力有限,下面本人将借助C++搭建一个简单的全连接神经网络,并且尝试解释里面的算子定义和计算图构建。 算子定义 回顾pytorch里面搭建的全连接神经网…

ESP32S3网络编程学习笔记(1)—— Wi-Fi扫描实验

前言 &#xff08;1&#xff09;如果有嵌入式企业需要招聘湖南区域日常实习生&#xff0c;任何区域的暑假Linux驱动/单片机/RTOS的实习岗位&#xff0c;可C站直接私聊&#xff0c;或者邮件&#xff1a;zhangyixu02gmail.com&#xff0c;此消息至2025年1月1日前均有效 &#xff…

基于DPDK的VPP 插件demo代码

VPP的插件编写&#xff0c; 首先要把VPP 工程下载下来&#xff0c; 编译通过。 然后按照example程序的套中来编写插件。 还有一个前提&#xff0c; 就是测试机上已经具备了DPDK 已经可用版本。 1. 下载VPP。 可以从github上下载VPP的指定版本的zip包&#xff0c; 也可以用…

2024年租用阿里云服务器多少钱一年?连夜整理分享

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…

__ne__()函数详解

在Python中&#xff0c;ne 是一个特殊方法&#xff0c;用于定义不等于&#xff08;!&#xff09;操作符的行为。当你使用 ! 操作符来比较两个类的实例时&#xff0c;Python会自动调用这个方法。如果这个方法没有在你的类中定义&#xff0c;那么 ! 操作符会使用 eq 方法的结果来…

【C++】C++ primer plus 第十二章--类和动态内存分配

动态内存和类 关于静态数据成员 类之作声明&#xff0c;不分配内存&#xff0c;因此静态成员变量在类中不能进行初始化&#xff0c;需要在类外进行。特殊情况&#xff1a; 存在可以在类中声明静态成员并初始化的情况&#xff0c;成员类型为const整型或者const枚举类型。 特殊…

软考高级架构师:嵌入式系统的内核架构

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…