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