ansible-playbook 的使用

前言

我在前一篇博客描述 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

ansible-playbook 的使用

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

ansible-playbook 的使用

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 的使用
发现通过文件方式和目录的方式,都能获取到定义到文件中的变量。

三、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 的使用

四、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 的使用
通过上面演示,可以看到我们这直接通过ansible-playbook 对所属的角色进行批量化操作了

上一篇:第十九章 Ansible-playbook-Role重构wordpress


下一篇:Mr. Kitayuta‘s Technology(dfs,连通块)