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. day09:Servlet详解

        day09 Servlet概述 生命周期方法: void init(ServletConfig):出生之后(1次): void service(ServletRequest request, ...

  2. java模拟网页http-url访问

    package com.iflytek; import java.io.InputStream; import java.net.HttpURLConnection; import java.net. ...

  3. sublime text2和3怎么设置修改字体

    首先,请打开你的sublime text2或3,点击工具栏中的Preferences 然后打开Settings-User 打开Settings-User之后 如下图 请复制以下代码然后粘贴至花括号内 ...

  4. RDD的源码

    RDD是一个抽象类定义了所有RDD共有的一些属性和方法,下面介绍了主要的属性和方法. abstract class RDD[T: ClassTag]( @transient private var _ ...

  5. A题:Common Substrings(KMP应用)

    原题链接 注意:2号和3号get_next()函数中next[i]赋值时的区别,一个是0,一个是1,且不能互换 #include<cstdio> #include<cstring&g ...

  6. 26QTimer定时器的使用

    前面介绍过定时器事件(QTimerEvent),有个弊端,就是每启动一个定时器都要对应的ID.本次介绍在设计器中使用Qtimer. 首先在设计器中添加一个LCD Number,和两个按钮. 头文件 # ...

  7. “4K云字库”基本框架图

    "4K云字库"基本框架图   谷歌的web-font,令"云字库"成为IT热点.   云字库,只是云计算的一个细小分支 ,而云计算的基础,是"大数据& ...

  8. 20145211MSF基础应用实验

    20145211MSF基础应用实验 一.实验博客 ms08_067攻击实验 http://www.cnblogs.com/entropy/p/6690301.html ms12_004漏洞攻击 htt ...

  9. 前端工程化 - gulp

    gulp是什么 gulp就是一个前端的自动化构建工具,在开发过程中很多重复的任务可以使用gulp和gulp插件自动完成.相比于grunt,gulp非常好上手,核心API只有4个,而且还有丰富的插件库. ...

  10. css 基础 - 2

    css 基础 - 2 一.文本样式: 文字竖着书写: 语法:writing-mode : lr-tb.tb-rl 参数:lr-tb:从左向右,从上往下 tb-rl:从上往下,从右向左 1.text-a ...