Ansible小结(四)---playbook介绍及基本应用

时间:2022-10-10 14:37:40
playbook是由一个或者多个play组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中task定义好的角色。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制来完成某一任务。
示例:
- hosts: test
  user: root
  tasks:
   - name: ssh-copy
     authorized_key: user=root key="{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
     tags:
       - sshkey

一、playbook基本介绍

1. 每一个playbook分为4个部分:

target section
    定义将要执行playbook的远程主机组
variable section
    定义playbook运行时需要使用的变量
task section
    定义将要在远程主机上执行的任务列表
handler section
    定义task执行完成以后需要调用的任务

 

1.1 target section

hosts: 定义远程的主机组
user: 执行该任务组的用户
become:如果设置为yes。执行该任务组的用户在执行任务的时候,获取root权限
become_user: 指定sudo提权的用户,默认为root,如果需要sudo到其他用户,这里可以指定,如A用户sudo到B用户,这里设置为B即可
connection:指定通过什么方式连接到远程主机,默认ssh
gathe_facts:在执行playbook的时候默认会执行setup模块获取远程主机信息。一般情况下默认即可。如果远程主机过多,或者playbook执行慢,可以设置为no关闭此选项,提高运行效率。

备注:如果sudo用户没有设置为nopassword,需要在ansible的hosts文件中指定sudo_pass,如下所示

[root@Server playbooks]# grep -A 2 test /etc/ansible/hosts 
[test]
192.168.10.101 ansible_sudo_pass="123456"

示例:

向远程主机发送一个文件,通过sudo的方式

- hosts: test
  user: root
  become: yes
  become_user: root
  gather_facts: no 
  tasks:
    - name: touch a file
      template: src=named.conf.j2 dest=/etc/named.conf

执行结果:

开启gather_facts结果:

[root@Server playbooks]# time ansible-playbook ls.yaml 

PLAY [test] ******************************************************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************************************************************************************
ok: [192.168.10.101]

TASK [touch a file] **********************************************************************************************************************************************************************************************************************************************************
ok: [192.168.10.101]

PLAY RECAP *******************************************************************************************************************************************************************************************************************************************************************
192.168.10.101             : ok=2    changed=0    unreachable=0    failed=0   


real    0m4.829s
user    0m1.231s
sys    0m0.290s

关闭开启gather_facts结果:

[root@Server playbooks]# time ansible-playbook ls.yaml 

PLAY [test] ******************************************************************************************************************************************************************************************************************************************************************

TASK [touch a file] **********************************************************************************************************************************************************************************************************************************************************
ok: [192.168.10.101]

PLAY RECAP *******************************************************************************************************************************************************************************************************************************************************************
192.168.10.101             : ok=1    changed=0    unreachable=0    failed=0   


real    0m1.560s
user    0m0.886s
sys    0m0.228s

可以看出节省了3秒多,如果大批量执行的情况下,效率会提高不少。

 

1.2  variable section

变量部分主要有3中方法,

var:直接调用变量

vars_files:在files文件中通过字典的方式调用变量,变量值预先设定好了

vars_prompt:通过交互的方式为变量赋值,可设置为隐私模式,输入值的时候屏幕不显示

 

1.2.1 vars用法

pass

 

1.2.2 vars_files用法

[root@Server playbooks]# cat test.yaml
- hosts: test
  user: root
  vars_files:
    - variables

  tasks: 
    - name: copy a file
      template: src=files/test.txt dest=/data/test.txt

  [root@Server playbooks]# cat variables
  port: 8080
  http: nginx
  [root@Server playbooks]# cat files/test.txt
  {{port}}
  {{http}}

远程主机执行结果:

[root@Client data]# cat test.txt 
8080
nginx

 

 1.2.3 vars_prompts用法

[root@Server playbooks]# cat test1.yaml 
- hosts: test
  
  vars_prompt: 
    - name: http
      prompt: plz input something
      private: yes

  tasks: 
    - name: this is a test
      template: src=files/test.txt dest=/data/test.txt 
[root@Server playbooks]# cat files/test.txt 
{{ http }}
private: yes  表示屏幕不显示输入内容,设置为隐私

执行结果:
[root@Client data]# cat test.txt 
11111

备注:注意!!vars_prompt下面的name属性就是文件的中的大括号呢的属性

1.3 task section

定义一组组任务,以tasks开头

案列:

调用tasks任务的三种方法:
tasks: 
#第一种
  - name:install mysqld (定义任务名)
  action: yum name=mysqld state=install (定义任务动作)

#第二种
  -name: configure mysql
  copy: src=/etc/my.cnf dest=/etc/my.cnf 

#第三种
  - name: start mysql
  service: 
    name: mysqld
    state: start

 

1.4  handler section

handler只有在接到通知的时候才会执行,不管接到多少次通知,handler只执行一次。

 

完整案列:

在远程主机安装httpd并通过handler的方式启动httpd服务,关闭获取setup模块信息。

[root@Server playbooks]# cat install_httpd.yaml 
- hosts: test
  user: root
  gather_facts: no
  tasks:
    - name: install httpd
      yum: name=httpd state=installed
      notify: 
        - start httpd
  handlers: 
    - name: start httpd
      service: name=httpd state=started