1.常用模块

1.1 group模块

添加或删除组
            name=

            state=:present(添加),absent(删除)
            system=:1或true为添加系统组
            gid=
ansible all -m group -a "name=test state=present system=1 gid=600"
ansible all -m group -a "name=test2 state=present gid=1010"

1.2 script模块:

运行本地的脚本在远程主机上。依赖于某个文件才能运行,需要指定某个脚本文件的路径(本地的脚本文件),它会自动复制到远程主机上运行
            -a "/PATH/TO/SCRIPT_FILE"
类似于command或shell。这个路径是本机文件路径。

1.3 template模块:

基于模板方式生成一个文件复制到远程主机
            src=:源地址
            dest=:目标地址
            owner=:属主
            group=:属组
            mode=:权限0644

2. playbook的其它组件

2.1 变量:

变量的定义:
ansible facts:系统变量可以直接调用
ansible-playbook  -e "var=value":自己定义变量,传递变量
host variable: host iventory:定义主机变量,在hosts文件中添加
group variable:组变量定义方式。定义的变量对于组内所有主机生效
[groupname:vars]
var=value
roles

变量调用:{{ variable }}
 
在playbook中定义变量的方法:
            vars:
            - var1: value1
            - var2: value2

2.2 模板:templates

模板文件是一种文本文件,嵌套有脚本(使用模板编程语言编写)
python中的嵌入式编程语言是Jinja2

jinjia2的语法:
字面量:
字符串:使用单引号或双引号;
数字:整数,浮点数;
列表:[item1, item2, ...],值可变数据类型
元组:(item1, item2, ...),值不可变
字典:{key1:value1, key2:value2, ...}
布尔型:true/false

算术运算:
+, -, *(乘), /(除), //(整除), %(取余), **(次方)

比较操作:
==(等值比较), !=(不等值比较), >, >=, <, <=

逻辑运算:
and, or, not
示例:   
在nginx配置文件中修改配置文件nginx.conf.j2:
worker_processes {{ ansible_processor_vcpus }};
#或者worker_processes {{ ansible_processor_vcpus-1 }}; #使用减法运算
listen {{ http_port }}; #设置监听端口,也可以使用我们自定义的变量(在hosts文件中对每一个分别设置)
在/etc/ansible下添加playbook文件如下:
- hosts: websrvs
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=present
- name: install conf file
template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
tags: instconf
- name: start nginx service
service: name=nginx state=started
handlers:
- name: restart nginx
service: name=nginx state=restarted
ansible-playbook nginx.conf.yaml
 
模板配置文件 :nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }};
listen {{ http_port }};

2.3 条件判断

判断系统版本,系统类型,根据这些不同做出不同的应对
ansible all -m setup | grep ansible_os_family #查看系统家族,CentOS显示RedHat
条件测试:
when语句,在task列表中使用,jinja2的语法格式
tasks:
- name: install conf file to centos7
template: src=files/nginx.conf.c7.j2
when: ansible_distribution_major_version == "7" #如果是CentOS7的时候
- name: install conf file to centos6
template: src=files/nginx.conf.c6.j2
when: ansible_distribution_major_version == "6" #如果是CentOS6时
scp root@172.18.100.69:/etc/nginx/nginx.conf files/nginx.conf.c6.j2
#把远程主机(CentOS6)上的文件拉取到本地

2.4 循环

循环:迭代,需要重复执行的任务;
对迭代项的引用,固定变量名为”item“
而后,要在task中使用with_items定义给定要迭代的元素列表;

列表方法:
1.字符串
2.字典:每一个元素是一个字典

列表方法1:字符串方式
            - name: install some packages
              yum: name={{ item }} state=present
              with_items:
              - nginx
              - memcached
              - php-fpm
- hosts: all
remote_user: root
tasks:
- name: install some packages
yum: name={{ item }} state=present
with_items:
- nginx
- memcached
- php-fpm
ansible-playbook item.yaml  #如果没有定义好yum源,出现问题就会终止

列表方法2:字典方式
- hosts: all
remote_user: root
tasks:
- name: add some groups
group: name={{ item }} state=present
with_items:
- group11
- group12
- group13
- name: add some users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
- { name: 'user11', group: 'group11' } #键值与键值之间用“:”隔开
- { name: 'user12', group: 'group12' }
- { name: 'user13', group: 'group13' }
ansible-playbook useradd.yaml

2.5 角色(roles):

如何实现yaml定义的模块重用?
服务器角色并不单一
如果能够把配置的每个配置段独立化,模块化
角色调用,直接调用服务器主机的公共模块,谁用谁调,直接方便
好处:跟远程主机分离,调用方便

角色集合:其实就是一个目录,角色名就是目录名
roles/
    mysql/
    httpd/
    nginx/
    memcached/

角色的格式:
        每个角色,以特定的层级目录结构进行组织:
            mysql/
                files/ :存放由copy(复制的文件)或script(脚本文件)模块等调用的文件;
                templates/:template模块查找所需要模板文件的目录;
                tasks/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;(基本组件,必须有)
                handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
                vars/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
                meta/:至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要在此文件中通过include进行包含;
                default/:设定默认变量时使用此目录中的main.yml文件;
mkdir -pv roles/{httpd,nginx,mysql}/{files,templates,tasks,handlers,vars,meta,default}
在playbook调用角色方法1:
一个主机上可以调用多个角色
- hosts: websrvs
remote_user: root
roles:
- mysql
- memcached
- nginx
在playbook调用角色方法2:传递变量给角色
- hosts:
remote_user:
roles:
- { role: nginx, username: nginx }
 键role用于指定角色名称;后续的k/v用于传递变量给角色;

 例:
mkdir /etc/ansible/roles/nginx
cp /root/working/files/nginx.conf.j2 templates/ #复制准备好的配置文件/templates文件夹中
#在roles/nginx/tasks/main.yaml中配置
- name: install nginx packages
yum: name=nginx state=present
- name: install conf file
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
- name: start nginx
service: name=nginx state=started enabled=true
#创建执行文件nginx.yaml
- hosts: all
remote_user: root
roles:
- nginx
ansible-playbook --check nginx.yaml
ansible-playbook nginx.yaml


定义一个触发器:
#创建roles/nginx/handlers/main.yaml
- name: restart nginx
service: name=nginx state=restarted
#在tasks/main.yaml中重新定义
- name: install nginx packages
yum: name=nginx state=present
tags:install
- name: install conf file
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx #定义通知机制,当模版发生改变时就通知handlers模块,重启服务
tags:conf
- name: start nginx
service: name=nginx state=started enabled=true
tags:nginxst
ansible-playbook -t install,conf nginx.yaml

使用变量:
1.直接定义
#编辑user.yaml
- hosts: all
romote_user: root
vars:
- username: testuser1
- groupname: testgroup1
tasks:
- name: creat group
group: name={{ groupname }} state=present
- name: creat user
user: name={{ username }} state=present
从命令行传递参数,直接把下面定义的变量覆盖掉,例:
ansible-playbook -e "groupname=mygrp1" -e "username=myuser1" myuser.yaml
2.在角色中定义变量
#在要传给远程主机的nginx配置文件中修改
user {{ username }};
#在roles/nginx/vars/main.yaml
ansible-playbook --check nginx.yaml
ansible-playbook nginx.yaml ansibel-playbook -e "username=adm" --check nginx.yaml
ansibel-playbook -t conf -e "username=adm" nginx.yaml #直接修改
3.在playbook调用角色方法:传递变量给角色
- hosts: all
remote_user: root
roles:
- { role: nginx, username: nginx }
ansible-playbook运行过后可以看到,运行nginx的用户为nginx

注意:1.键role用于指定角色名称;后续的k/v用于传递变量给角色;
           2.还可以基于条件测试实现角色调用;
            roles:
            - { role: nginx, when: "ansible_distribution_major_version == '7' " }
               只有当系统主版本号为“7”的时候,才会运行nginx角色
            这里可以定义n个角色
- hosts: all
remote_user: root
roles:
- { role: nginx, username: nginx, when: "ansible_distribution_major_version == '7' " }
例:
mkdir -pv /etc/ansible/roles/memcached/tasks
vim tasks/main.yaml
#下面是main.yaml的内容
- name: install package
yum: name=memcached state=present
- name: start memcached
service: name=memcached state=started enabled=true
vim mem.yaml
#下面是mem.yaml的内容
- hosts: all
remote_user: root
roles:
- { role: nginx, when: ansible_distribution_major_version == '7' }
- { role: memcached, when: ansible_hostname == 'memcached' }

例:如何设置memcached所使用的空间是系统闲置空间的1/4?
把/etc/sysconfig/memcached中的“CACHESIZE="64" ”改为1/4
mkdir roles/memcached/templates
scp root@172.18.100.69:/etcsysconfig/memcached ./roles/memcached/templates #从远程主机上下载配置文件
ansible all -m setup vim ./roles/memcached/templates/memcached
#将CACHESIZE="64"改为
CACHESIZE="{{ ansible_memtotal_mb //4 }}"
mv ./roles/memcached/templates/memcached{,.j2} #改后缀名j2
vim ./roles/memcached/tasks/main.yaml #以下是main.yaml中的内容
- name: install package
yum: name=memcached state=present
- name: install conf file
templates: src=/etc/ansible/roles/templates/memcached.j2 dest=/etc/sysconfig/memcached
notify: restart memcached
tags: memconf
- name: start memcached
service: name=memcached state=started enabled=true mkdir memcached/handlers
vim ./handlers/main.yaml #main.yaml
- name: restart memcached
service: name=memcached state=restarted ansible-playbook /etc/ansible/roles/mem.yaml
测试使用
使用ansible一键搞定:
1.3台主机配置主/备模式高可用keepalived+nginx(proxy)
   两台主机:httpd+php
   一台主机:mysql-server或mariadb-server;
建议sudo的时候把sudo用户加到管理员组里面,给与与root用户相同的权限
http://www.ansible.com.cn













ansible入门02的更多相关文章

  1. 【网络爬虫入门02】HTTP客户端库Requests的基本原理与基础应用

    [网络爬虫入门02]HTTP客户端库Requests的基本原理与基础应用 广东职业技术学院  欧浩源 1.引言 实现网络爬虫的第一步就是要建立网络连接并向服务器或网页等网络资源发起请求.urllib是 ...

  2. CSS3基础入门02

    CSS3 基础入门02 边框相关属性 border-radius 通过这个属性我们可以设置边框圆角,即可以将四个角设置为统一的圆角,也可以单独的设置具体的某一个角的圆角. grammer: borde ...

  3. [转帖]Ansible 入门秘诀

    Ansible 入门秘诀 作者: Jose Delarosa 译者: LCTT jdh8383 | 2019-03-08 09:24   收藏: 2 用 Ansible 自动化你的数据中心的关键点. ...

  4. Ansible 入门指南 - 学习总结

    概述 这周在工作中需要去修改 nginx 的配置,发现了同事在使用 ansible 管理者系统几乎所有的配置,从数据库的安装.nginx 的安装及配置.于是这周研究起了 ansible 的基础用法.回 ...

  5. Ansible 入门指南 - ansible-playbook 命令

    上篇文章Ansible 入门指南 - 安装及 Ad-Hoc 命令使用介绍的额是 Ad-Hoc 命令方式,本文将介绍 Playbook 方式. Playbook 译为「剧本」,觉得还挺恰当的. play ...

  6. JavaScript基本入门02

    目录 JavaScript基础入门 02 条件语句 if 语句 if .. else 语句 switch 结构 循环语句 while 循环 continue 关键字 do...while语句 for ...

  7. Shell入门02

    Shell入门-02 1.重定向 标准输入(<) 标准输出 标准错误重回定向 程序 = 指令 + 数据 命令   变量 在程序中,数据如何输入?又如何输出? 数据输入:键盘 – 标准输入,但是并 ...

  8. # 095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 03 封装总结 01 封装知识点总结

    095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  9. 094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 04 static关键字(续)

    094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

随机推荐

  1. .NET、NET Framewor以及.NET Core的关系(二)

    什么是CLR,.NET虚拟机? 实际上,.NET不仅提供了自动内存管理的支持,他还提供了一些列的如类型安全.应用程序域.异常机制等支持,这些 都被统称为CLR公共语言运行库. CLR是.NET类型系统 ...

  2. Flask系列之蓝图中使用动态URL前缀

    让我们先来看一个简单的例子,假设有下面这样一个蓝图(是关于用户主页的): from flask import Blueprint, render_template profile = Blueprin ...

  3. 跟我学Makefile(五)

    文件名操作函数 每个函数的参数字符串都会被当做一个或是一系列的文件名来对待. $(dir <names...>) 名称:取目录函数——dir. 功能:从文件名序列<names> ...

  4. 2.4 The Object Model -- Computed Properties and Aggregate Data with @each(计算的属性和使用@each聚合数据)

    1. 通常,你可能有一个计算的属性依赖于数组中的所有元素来确定它的值.例如,你可能想要计算controller中所有todo items的数量,以此来确定完成了多少任务. export default ...

  5. cocos代码研究(8)持续动作子类学习笔记

    理论部分 时间间隔动作(ActionInterval)是一个在一段时间内执行的动作. 它有一个开始时间和完成时间.完成时间等于起始时间加上持续时间. ActionInterval的子类与位置有关的动作 ...

  6. wcf 远程服务器返回了意外响应: (413) Request Entity Too Large。

    我遇到这个问题的原因是:我使用asp.net 网站调用wcf服务后,通过方法提交数据产生的.我提交的数据是一个实体,包含很多字符串和图片格式的二进制数据超过4M 就报个错误. 后来同事帮忙解决了.他说 ...

  7. Ubuntu16.04安装wireshark

    Wireshark是一个非常强大的抓包工具,适用于各种场合,安装配置也简单.这里仅对在Ubuntu上的安装做介绍. 首先通过apt安装WireShark: $ sudo apt-add-reposit ...

  8. linux下如何kill tty终端

    答:一共有两个步骤,如下: 1.列出打开的终端 who 2.kill需要kill的tty终端 pkill -kill -t pts/2

  9. MVC中定时发布二维码邮件

    发布邮件 查看第一个方法就可以了,第二个跟这个无关 using System; using System.Collections.Generic; using System.Linq; using S ...

  10. POJ 2923 Relocation(状压DP+01背包)题解

    题意:给你汽车容积c1,c2,再给你n个包裹的体积,问你最少运几次能全运走 思路:用2进制表示每次运送时某物在不在此次运送之中,1在0不在.我们把运送次数抽象成物品价值,把状态抽象成体积,用一个dp[ ...