前言
我在前一篇博客描述 ansible的安装和使用,可以远程对我们主机进行很多操作。ansible-playbook 其实属于ansible 一部分。用ansible-playbook 命令与 用ansible命令有不同之处,且非常适合于复杂应用的部署。在 playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤.
如果需要参考部署ansible的安装和使用 安装好ansible ,playbooks 也可以使用了。
实践
一、ansible-playbook 参数介绍
ansible-playbook 参数 和 ansible 一致,
ansible可用的选项如下:
-v:输出详细的执行过程信息,可以得到执行过程所有的信息。
-i PATH:指定inventory信息,默认为/etc/ansible/hosts。
-f:并发线程数,默认为5个线程。
–private-key=PRIVATE_KEY_FILE:指定密钥文件。
-m:指定执行使用的模块。
-M:指定模块的存放路径,默认为/usr/share/ansible,也可以通过ANSIBLE_LIBRARY来设定默认路径。
-a:指定模块参数。
-u:指定远程主机以哪个用户运行命令。
-l:限制运行主机,等同于“–limit”。
–list-hosts:列出符合条件的主机列表,不执行任何命令。
二、ansible-playbook 变量
1.通过vars/set_fact定义变量
备注:
hosts:在ansible 章节介绍的 /etc/ansible/hosts 里面定义主机名
remote_user: 登陆的用户
vars: 配置变量
tasks: 需要执行命令
set_fact: 定义变量并赋值
debug: 打印需要内容
cat >test_set_fact.yml<<EOF
---
- hosts: tx_151
remote_user: root
vars:
testvar1: test1
tasks:
- set_fact:
testvar2: "test2"
- debug:
msg: "{{testvar1}} {{testvar2}} "
EOF
ansible-playbook test_set_fact.yml -v
2.ansible 内置系统变量
备注:
ansible_version: ansible的版本号
inventory_hostname : 获取到被操作的当前主机的主机名称
group_names : 内置变量groups
inventory_dir:nsible主机中清单文件的存放路径,我使用的是默认的清单文件/etc/ansible/hosts,所以,inventory_dir变量对应的值为/etc/ansible
cat >test_set_fact.yml <<EOF
---
- hosts: tx_151
remote_user: root
tasks:
- debug:
msg: "系统变量:{{ ansible_version }} {{ inventory_hostname }} {{ group_names }} {{inventory_dir}}"
ansible-playbook test_set_fact.yml -v
3.通过通过文件/目录定义变量
利用vars/set_fact 定义变量适合变量比较少的情况,但很多时候我们使用ansible-playbook 涉及到流程复杂,变量会变得很多。我们将使用定义文件目录和文件方式获取变量。
(3.1)先看整个测试目录
[root@VM-16-10-centos ansible]# tree
.
├── app
│ └── test_file.yml
├── apps
│ └── common
│ └── test_dir.yml
└── test_var.yml
(3.2)构建test_var.yml
cat >test_var.yml <<EOF
---
- hosts: tx_151
remote_user: root
tasks:
- name: "common vars"
include_vars:
dir: "./apps/common"
- name: "file var"
include_vars:
file: "./app/test_file.yml"
- debug:
msg: "{{file.test}} {{dir.test}}"
EOF
(3.3) 查看我们test_file.yml 和定义目录 test_dir.yml 两个文件
[root@VM-16-10-centos ansible]# cat app/test_file.yml
file:
test: /usr/test/file
[root@VM-16-10-centos ansible]# cat apps/common/test_dir.yml
dir:
test: /usr/src/test/dir
发现通过文件方式和目录的方式,都能获取到定义到文件中的变量。
三、ansible-playbook 最常用copy 和 shell 模块的命令
ansible-playbook 和 ansible命令一样存在copy 和 shell 命令,下面演示一下
1.创建执行需要执行的流程yml文件
cat >test_copy.yml <<EOF
---
- hosts: tx_151
remote_user: root
vars:
testvar1: test1
tasks:
- name: "copy shell file"
copy:
src: ./shell
dest: /usr/src
- name: "exec shell"
shell:
chdir: /usr/src/shell
cmd: >
sh test_shell.sh
EOF
2.创建具体执行test_shell 文件
mkdir -p shell
cd shell
cat >test_shell.sh<<EOF
#/bin/bash
set -x
time1=$(date "+%Y-%m-%d %H:%M:%S")
echo $time1 >shell1.log
EOF
3.执行yml
四、ansible-playbook 中的Roles
怎样组织 playbook 才是最好的方式呢?简单的回答就是:使用 roles ! Roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles 。
角色通俗来说:
我们在博客ansible定义组的概念,这里需要将组和这里角色进行绑定。
比如我们在 hosts 中定义下面两个不同的分组,需要对两组进行不同的操作。那这个时候就需要我们创建compile 和 compile2 两个角色
[compile]
name1 ansible_ssh_host=192.168.1.1 ansible_ssh_user=root ansible_ssh_pass=test1234
name2 ansible_ssh_host=192.168.1.2 ansible_ssh_user=root ansible_ssh_pass=test1234
[compile2]
name1 ansible_ssh_host=192.168.1.3 ansible_ssh_user=root ansible_ssh_pass=test1234
name2 ansible_ssh_host=192.168.1.4 ansible_ssh_user=root ansible_ssh_pass=test1234
下面就演示一下怎样利用角色,来进行远程控制不同的机器
这个是/etc/ansible/ 下面的目录结构
[root@VM-16-10-centos ansible]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg
├── hosts
├── hosts.rpmnew
└── roles
├── compile
│ ├── files
│ │ └── test_shell.sh
│ ├── handlers
│ ├── tasks
│ │ └── main.yml
│ └── templates
└── compile2
├── files
├── handlers
├── tasks
└── templates
11 directories, 5 files
这个 playbook 为一个角色 ‘x’ 指定了如下的行为:
如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 将被添加到 play 中
如果 roles/x/handlers/main.yml 存在, 其中列出的 handlers 将被添加到 play 中
如果 roles/x/vars/main.yml 存在, 其中列出的 variables 将被添加到 play 中
如果 roles/x/meta/main.yml 存在, 其中列出的 “角色依赖” 将被添加到 roles 列表中 (1.3 and later)
所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路径。
所有 script tasks 可以引用 roles/x/files/ 中的脚本,不需要指明文件的路径。
所有 template tasks 可以引用 roles/x/templates/ 中的文件,不需要指明文件的路径。
所有 include tasks 可以引用 roles/x/tasks/ 中的文件,不需要指明文件的路径。
这里面有很多比如 handlers ,templates 都可以尝试。但我这里主要表明roles 怎么使用,就不再演示了。
1、首先创建需要执行yml文件,这个文件
hosts: 指名需要执行的分组
gather_facts: 用于控制一个play是否收集目的主机的facts信息
roles: 就是指具体执行的角色了。对应执行/etc/ansible/roles 下面目录文件
[root@VM-16-10-centos ansible]# cat compile.yml
---
- hosts: compile
gather_subset: min
roles:
- compile
2、compile 角色下面需要执行main内容
[root@VM-16-10-centos ansible]# cat /etc/ansible/roles/compile/tasks/main.yml
---
- name: "copy shell file"
copy:
src: ./shell
dest: /usr/src
- name: "exec shell"
shell:
chdir: /usr/src/shell
cmd: >
sh test_shell.sh
3、compile 角色下面用到的文件
[root@VM-16-10-centos ansible]# cat /etc/ansible/roles/compile/files/test_shell.sh
#/bin/bash
set -x
time1=$(date "+%Y-%m-%d %H:%M:%S")
echo $time1 >shell1.log
4、直接执行对应yml
通过上面演示,可以看到我们这直接通过ansible-playbook 对所属的角色进行批量化操作了