playbook的模块与在ansible命令行下使用的模块有一些不同。这主要是因为在playbook中会使用到一些facts变量和一些通过setup模块从远程主机上获取到的变量。有些模块没法在命令行下运行,就是因为它们需要这些变量。而且即使那些可以在命令行下工作的模块也可以通过playbook的模块获取一些更高级的功能。

1、template

在实际应用中,我们的配置文件有些地方可能会根据远程主机的配置的不同而有稍许的不同,template可以使用变量来接收远程主机上setup收集到的facts信息,针对不同配置的主机,定制配置文件。用法大致与copy模块相同。

常用参数:

backup:如果原目标文件存在,则先备份目标文件

dest:目标文件路径

force:是否强制覆盖,默认为yes

group:目标文件属组

mode:目标文件的权限

owner:目标文件属主

src:源模板文件路径

validate:在复制之前通过命令验证目标文件,如果验证通过则复制

官方简单示例:

- template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode=0644
- template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode="u=rw,g=r,o=r"
- template: src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s'

named.conf配置文件的jinja2模板示例:

options {

listen-on port 53 {

127.0.0.1;

{% for ip in ansible_all_ipv4_addresses %}

{{ ip }};

{% endfor %}

};

listen-on-v6 port 53 { ::1; };

directory "/var/named";

dump-file "/var/named/data/cache_dump.db";

statistics-file "/var/named/data/named_stats.txt";

memstatistics-file "/var/named/data/named_mem_stats.txt";

};

zone "." IN {

type hint;

file "named.ca";

};

include "/etc/named.rfc1912.zones";

include "/etc/named.root.key";

{# Variables for zone config #}

{% if 'authorativenames' in group_names %}

{% set zone_type = 'master' %}

{% set zone_dir = 'data' %}

{% else %}

{% set zone_type = 'slave' %}

{% set zone_dir = 'slaves' %}

{% endif %}

zone "internal.example.com" IN {

type {{ zone_type }};

file "{{ zone_dir }}/internal.example.com";

{% if 'authorativenames' not in group_names %}

masters { 192.168.2.2; };

{% endif %}

};

playbook的引用该模板配置文件的方法示例:

- name: Setup BIND

host: allnames

tasks:

- name: configure BIND

template: src=templates/named.conf.j2 dest=/etc/named.conf owner=root group=named mode=0640

2、set_fact

set_fact模块可以自定义facts,这些自定义的facts可以通过template或者变量的方式在playbook中使用。如果你想要获取一个进程使用的内存的百分比,则必须通过set_fact来进行计算之后得出其值,并将其值在playbook中引用。

下面是一个配置mysql innodb buffer size的示例:

- name: Configure MySQL

hosts: mysqlservers

tasks:

- name: install MySql

yum: name=mysql-server state=installed

- name: Calculate InnoDB buffer pool size

set_fact: innodb_buffer_pool_size_mb="{{ ansible_memtotal_mb / 2 }}"

- name: Configure MySQL

template: src=templates/my.cnf dest=/etc/my.cnf owner=root group=root mode=0644

notify: restart mysql

- name: Start MySQL

service: name=mysqld state=started enabled=yes

handlers:

- name: restart mysql

service: name=mysqld state=restarted

my.cnf的配置示例:

# {{ ansible_managed }}

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted

security risks

symbolic-links=0

# Configure the buffer pool

innodb_buffer_pool_size = {{ innodb_buffer_pool_size_mb|int }}M

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

3、pause

在playbook执行的过程中暂停一定时间或者提示用户进行某些操作

常用参数:

minutes:暂停多少分钟

seconds:暂停多少秒

prompt:打印一串信息提示用户操作

示例:

- name: wait on user input

pause: prompt="Warning! Detected slight issue. ENTER to continue CTRL-C a to quit"

- name: timed wait

pause: seconds=30

4、wait_for

在playbook的执行过程中,等待某些操作完成以后再进行后续操作

常用参数:

connect_timeout:在下一个任务执行之前等待连接的超时时间

delay:等待一个端口或者文件或者连接到指定的状态时,默认超时时间为300秒,在这等待的300s的时间里,wait_for模块会一直轮询指定的对象是否到达指定的状态,delay即为多长时间轮询一次状态。

host:wait_for模块等待的主机的地址,默认为127.0.0.1

port:wait_for模块待待的主机的端口

path:文件路径,只有当这个文件存在时,下一任务才开始执行,即等待该文件创建完成

state:等待的状态,即等待的文件或端口或者连接状态达到指定的状态时,下一个任务开始执行。当等的对象为端口时,状态有started,stoped,即端口已经监听或者端口已经关闭;当等待的对象为文件时,状态有present或者started,absent,即文件已创建或者删除;当等待的对象为一个连接时,状态有drained,即连接已建立。默认为started

timeout:wait_for的等待的超时时间,默认为300秒

示例:

- wait_for: port=8080 state=started     #等待8080端口已正常监听,才开始下一个任务,直到超时

- wait_for: port=8000 delay=10    #等待8000端口正常监听,每隔10s检查一次,直至等待超时

- wait_for: host=0.0.0.0 port=8000 delay=10 state=drained    #等待8000端口直至有连接建立

- wait_for: host=0.0.0.0 port=8000 state=drained exclude_hosts=10.2.1.2,10.2.1.3    #等待8000端口有连接建立,如果连接来自10.2.1.2或者10.2.1.3,则忽略。

- wait_for: path=/tmp/foo    #等待/tmp/foo文件已创建

- wait_for: path=/tmp/foo search_regex=completed    #等待/tmp/foo文件已创建,而且该文件中需要包含completed字符串

- wait_for: path=/var/lock/file.lock state=absent    #等待/var/lock/file.lock被删除

- wait_for: path=/proc/3466/status state=absent        #等待指定的进程被销毁

- local_action: wait_for port=22 host="{{ ansible_ssh_host | default(inventory_hostname) }}" search_regex=OpenSSH delay=10    #等待openssh启动,10s检查一次

5、assemble

用于组装文件,即将多个零散的文件,合并一个大文件

常用参数:

src:原文件(即零散文件)的路径

dest:合并后的大文件路径

group:合并后的大文件的属组

owner:合并后的大文件的属主

mode:合并后的大文件的权限

validate:与template的validate相同,指定命令验证文件

ignore_hidden:组装时,是否忽略隐藏文件,默认为no,该参数在2.0版本中新增

示例:

- hosts: all

tasks:

- name: Make a Directory in /opt

file: path=/opt/sshkeys state=directory owner=root group=root mode=0700

- name: Copy SSH keys over

copy: src=keys/{{ item }}.pub dest=/opt/sshkeys/{{ item }}.pub owner=root group=root mode=0600

with_items:

- dan

- kate

- mal

- name: Make the root users SSH config directory

file: path=/root/.ssh state=directory owner=root group=root mode=0700

- name: Build the authorized_keys file

assemble: src=/opt/sshkeys/ dest=/root/.ssh/authorized_keys owner=root group=root mode=0700   #将/opt/sshkeys目录里所有的文件合并到/root/.ssh/authorized_keys一个文件中

6、add_host

在playbook执行的过程中,动态的添加主机到指定的主机组中

常用参数:

groups:添加主机至指定的组

name:要添加的主机名或IP地址

示例:

- name: add a host to group webservers

hosts: webservers

tasks:

- add_host name={{ ip_from_ec2 }} group=webservers foo=42    #添加主机到webservers组中,主机的变量foo的值为42

7、group_by

在playbook执行的过程中,动态的创建主机组

示例:

- name: Create operating system group

hosts: all

tasks:

- group_by: key=os_{{ ansible_distribution }}           #在playbook中设置一个新的主机组

- name: Run on CentOS hosts only

hosts: os_CentOS

tasks:

- name: Install Apache

yum: name=httpd state=latest

- name: Run on Ubuntu hosts only

hosts: os_Ubuntu

tasks:

- name: Install Apache

apt: pkg=apache2 state=latest

8、debug

调试模块,用于在调试中输出信息

常用参数:

msg:调试输出的消息

var:将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出

verbosity:debug的级别

示例:

# Example that prints the loopback address and gateway for each host- debug: msg="System {{ inventory_hostname }} has uuid {{ ansible_product_uuid }}"

- debug: msg="System {{ inventory_hostname }} has gateway {{ ansible_default_ipv4.gateway }}"
  when: ansible_default_ipv4.gateway is defined - shell: /usr/bin/uptime
  register: result - debug: var=result verbosity=2    #直接将上一条指令的结果作为变量传递给var,由debug打印出result的值 - name: Display all variables/facts known for a host
  debug: var=hostvars[inventory_hostname] verbosity=4

9、fail

用于终止当前playbook的执行,通常与条件语句组合使用,当满足条件时,终止当前play的运行。可以直接由failed_when取代。

选项只有一个:

msg:终止前打印出信息

示例:

- fail: msg="The system may not be provisioned according to the CMDB status."
  when: cmdb_status != "to-be-staged"

本文出自 “无名小卒” 博客,请务必保留此出处http://breezey.blog.51cto.com/2400275/1757589

Ansible7:Playbook常用模块【转】的更多相关文章

  1. Ansible7:Playbook常用模块

    目录 template set_fact pause wait_for assemble add_host group_by debug fail playbook的模块与在ansible命令行下使用 ...

  2. Ansible简介及常用模块

    一.基础介绍 1.简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置. ...

  3. Ansible系列(二):选项和常用模块

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  4. Ansible安装部署以及常用模块详解

    一.  Ansible 介绍Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于py ...

  5. ansible环境部署及常用模块总结 - 运维笔记

    一.  Ansible 介绍Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于py ...

  6. 2、ansilbe常用模块详解及inventory介绍

    Ansible ansible格式: ansible <host-pattern> [-f forks] [-m module_name] [-a args] args: 用法 key=v ...

  7. Ansible 入门指南 - 常用模块

    介绍 module 文档: 官宣-模块分类的索引 官宣-全部模块的索引 在playbook脚本中,tasks 中的每一个 action都是对 module的一次调用.在每个 action中: 冒号前面 ...

  8. Ansible常用模块命令

    Ansible常用模块命令 一.安装ansible yum install epel-release yum install ansible 二.配置文件配置 vi /etc/ansible/ansi ...

  9. ansible api常用模块与参数

    ###ansibleAPI 常用模块 用于读取yaml,json格式的文件 from ansible.parsing.dataloader import DataLoader #用于管理变量的类,包括 ...

随机推荐

  1. Snacks

    Snacks 题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5692 dfs序+线段树 这道题涉及到对整棵树的值修改,考虑将树状结构用dfs ...

  2. scala 数组 基本类型

    变量尽量用valvar 是不可变 final 常用的 Int̵ Double̵ Long̵ String没有基本类型.scala 任何对象都继承Any Int Double 继承AnyVal Stri ...

  3. js--学习方法之2-转

    再说几点忠告 1,不要着急看一些复杂网页效果的代码,这样除了打击你自信心,什么也学不到.没达到一定的武功水平,割了小JJ也学不会葵花宝典的. 2,别急着加技术交流QQ群,加牛人QQ.如果你找张三丰交流 ...

  4. 《JS权威指南学习总结--8.7 函数属性、方法和构造函数》

    内容要点:   在JS程序中,函数是值.对函数执行typeof运算会返回字符串 "function",但是函数是JS中特殊的对象.因为函数也是对象,它们也可以拥有属性和方法,就像普 ...

  5. dubbo 的monitor监视器安装问题——————monitor一直处于正在启动状态

    一台服务器安装完zookeeper并启动后,然后在另一服务器安装monitor     dubbo-monitor-simple-2.8.3  解压安装 修改配置文件 dubbo.container= ...

  6. Cmake常用指令

    1. cmake_minimum_required(VERSION 2.8)           检查cmake的版本,至少为2.8 2. project(helloworld)           ...

  7. 禁止使用test类的就是禁止使用本来的$this对象.可以调用父类的对象

    public function __construct() { parent::__construct( ); parent::__construct( ); if(!APP_DEBUG ) die( ...

  8. Java8 (1)

    参考资料: <Java8 in Action> Raoul-Gabriel Urma 一.jdk8 客观的说,Java8是一次有重大演进的版本,甚至很多人认为java8所做的改变,在许多方 ...

  9. 配置nginx为HTTPS服务器

    默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译时指定–with-http_ssl_module参数,安装模块依赖于OpenSSL库和一些引用文件,通常这些文件并不在同一个软件包中.通常这 ...

  10. java中的字符编码方式

    1. 问题由来 面试的时候被问到了各种编码方式的区别,结果一脸懵逼,这个地方集中学习一下. 2. 几种字符编码的方式 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符 ...