setup:获取指定主机的facts。

===================================
facts就是变量,内建变量 。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。

例:获取某台主机的变量

ansible 10.1.6.68 -m setup

=====================================
script:发送脚本到各被管理节点,并执行。不需要参数

=====================================

ansible all -m script -a 'test.sh'

直接在-a 后面指定脚本即可。

===============================
selinux: 管理selinux。

===============================

conf     #指定应用selinux的配置文件。
state=enforcing|permissive|disabled      #对应于selinux配置文件的SELINUX。
policy=targeted|minimum|mls     #对应于selinux配置文件的SELINUXTYPE

关闭selinux:

ansible all -m selinux -a 'state=disabled'

===============================
template:使用了Jinjia2格式作为文件模版,进行文档内变量的替换的模块。

===============================

五、playbook:“跑剧本”

playbook就是一个用yaml语法把多个模块堆起来的一个文件而已。

1.简介

YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。

2、特点

  • YAML的可读性好

  • YAML和脚本语言的交互性好

  • YAML使用实现语言的数据类型

  • YAML有一个一致的信息模型

  • YAML易于实现

  • YAML可以基于流来处理

  • YAML表达能力强,扩展性好

YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用"-"来代表,Map里的键值对用":"分隔。下面是一个示例。

    - hosts: 10.1.0.1        #定义主机
      vars:                      #定义变量
           var1: value
           var2: value
      tasks:                    #定义任务
           - name:           #任务名称。
       #这里就可以开始用模块来执行具体的任务了。       handlers:     #定义触发通知所作的操作。里面也是跟tasks一样,用模块定义任务。
           - name:       remote_user:             #远程主机执行任务时的用户。一般都是root,一般也不用指定。     - hosts: web
      vars:
      tasks:
      handlers:
      remote_user:

YAML文件扩展名通常为.yaml,如example.yaml

Playbooks

1.核心元素:

  • Tasks:任务,由模块定义的操作的列表;

  • Variables:变量

  • Templates:模板,即使用了模板语法的文本文件;

  • Handlers:由特定条件触发的Tasks;

  • Roles:角色;

2.playbook的基础组件:

Hosts:运行指定任务的目标主机;
remote_user:在远程主机以哪个用户身份执行;
    sudo_user:非管理员需要拥有sudo权限;
tasks:任务列表
    模块,模块参数:
        格式:
            (1) action: module arguments
            (2) module: arguments

示例1:

vim test.yaml 也可以是 .yml

- hosts: all
  remote_user: root
  tasks:
  - name: install a group
    group: name=mygrp system=true 
  - name: install a user
    user: name=user1 group=mygrp system=true  - hosts: websrvs      
   remote_user: root
   tasks:
    - name: install httpd package
      yum: name=httpd
    - name: start httpd service 
      service: name=httpd state=started

3.运行playbook,使用ansible-playbook命令

(1) 检测语法

ansible-playbook –syntax-check /path/to/playbook.yaml

(2) 测试运行

ansible-playbook -C /path/to/playbook.yaml

    --list-hosts
    --list-tasks
    --list-tags

ansible-playbook –check /path/to/playbook.yaml

(3) 运行

ansible-playbook /path/to/playbook.yaml

    -t TAGS, --tags=TAGS
    --skip-tags=SKIP_TAGS  跳过指定的标签
    --start-at-task=START_AT 从哪个任务后执行

tags:给指定的任务定义一个调用标识;

    - name: NAME
      module: arguments
      tags: TAG_ID

可以一次调用多个名称相同的标签。也可以调用不同的标签用 “,” 分割。

改变监听端口

写剧本把此文件传过去

指明标签的检查

查看标签

playbook执行过程

跳过标签的事件

handlers:由特定条件触发的Tasks;

- name: TASK_NAME
  module: arguments
  notify: HANDLER_NAME
handlers:
- name: HANDLER_NAME
  module: arguments


第一次的话都会运行,后边如果文件内容发生改变就会触发notify,然后会直接执行handlers的内容(这里notify后边的事件就都不会执行了)。估计是md5那种的校验。删了个#号竟然也会通知。

六、 Variables:变量

内建:

(1) facts

自定义:

(1) 命令行传递;这个优先级最高

    -e VAR=VALUE

(2) 在hosts Inventory(/etc/ansible/hosts)中为每个主机定义专用变量值;

    (a) 向不同的主机传递不同的变量;

        IP/HOSTNAME variable_name=value
            [web]
            10.1.6.72 qzx=httpd
            10.1.6.73 qzx=nginx     (b) 向组内的所有主机传递相同的变量 ;         [groupname:vars]
        variable_name=value         [web:qzx]
        qzx=httpd         [web]
        10.1.6.72
        10.1.6.73

(3) 在playbook中定义,建议使用这个!

    vars:
    - var_name: value
    - var_name: value

(4) Inventory还可以使用参数:

    用于定义ansible远程连接目标主机时使用的属性,而非传递给playbook的变量;
        ansible_ssh_host
        ansible_ssh_port
        ansible_ssh_user
        ansible_ssh_pass
        ansible_sudo_pass
        ...

(5) 在角色调用时传递

    roles:
    - { role: ROLE_NAME, var: value, ...}

变量调用:有空格
{{ var_name }}

七、Templates:模板

文本文件,内部嵌套有模板语言脚本(使用模板语言编写)

Jinja2 是由python编写的。 在我们打算使用基于文本的模板语言时,jinja2是很好的解决方案。yeml是写playbookjinja2是写配置文件模板

功用

将模板的文件的变量值转换成对应的本地主机的确定值。例如:ansible端写一个内建变量{{ ansible_processor_vcpus }},当这个文件被复制到对应主机时会自动生成对应主机 cpu的颗数的结果替换之。

Jinja2语法:

字面量:
    字符串:使用单引号或双引号; 
    数字:整数、浮点数;
    列表:[item1, item2, ...]
    元组:(item1, item2, ...)
    字典:{key1:value1, key2:value2, ...}
    布尔型:true/false 算术运算:
    +, -, *, /, //, %, ** 比较操作:
    ==, !=, >, <, >=, <= 逻辑运算:and, or, not

执行模板文件中的脚本,并生成结果数据流,需要使用template模块

===============================
template:使用了Jinjia2格式作为文件模版,进行文档内变量的替换的模块。相当于copy

===============================
将jinja2的文件模板理解并执行,转化为各个主机间的对应值

backup       建立个包括timestamp在内的文件备份,以备不时之需.
dest       远程节点上的绝对路径,用于放置template文件。
group      设置远程节点上的的template文件的所属用户组
mode       设置远程节点上的template文件权限。类似Linux中chmod的用法
owner      设置远程节点上的template文件所属用户
src        本地Jinjia2模版的template文件位置。

注意:此模板不能在命令行使用,而只能用于playbook;用法同copy

1、普通示例:

这里/root/nginx.conf内容发生了改变。

  - hosts: ngxsrvs
    remote_user: root
    tasks:
    - name: install nginx package
      yum: name=nginx state=latest
    - name: install conf file
      template: src=/root/nginx.conf.j2 dest=/etc/nginx/nginx.conf
      tags: ngxconf
      notify: reload nginx service
    - name: start nginx service
      service: name=nginx state=started enabled=true
    handlers:
    - name: reload nginx service
      shell: /usr/sbin/nginx -s reload

2、条件测试:

when语句:在tasks中使用,Jinja2的语法格式;

-     hosts: all
    remote_user: root
    tasks:
    - name: install nginx package
      yum: name=nginx state=latest
    - name: start nginx service on CentOS6
      shell: service nginx start
      when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
    - name: start nginx service
      shell: systemctl start nginx.service
      when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"

3、循环:迭代,需要重复执行的任务;

对迭代项的引用,固定变量名为"item”,使用with_item属性给定要迭代的元素; 这个是以任务为中心,围绕每个任务来跑主机,如果中间某个任务中断,那么所有主机以后的任务就无法安装。

元素:

  • 列表

  • 字符串

  • 字典

基于字符串列表给出元素示例:

 -    hosts: websrvs
    remote_user: root
    tasks:
    - name: install packages
      yum: name={{ item }} state=latest
      with_items:
      - httpd
      - php
      - php-mysql
      - php-mbstring
      - php-gd

基于字典列表给元素示例:item.name .后边的表示键

- hosts: all
  remote_user: root
  tasks:
  - name: create groups
    group: name={{ item }} state=present
    with_items:
    - groupx1
    - groupx2
    - groupx3
  - name: create users
    user: name={{ item.name }} group={{ item.group }} state=present
    with_items:
    - {name: 'userx1', group: 'groupx1'}
    - {name: 'userx2', group: 'groupx2'}
    - {name: 'userx3', group: 'groupx3'}

八、 角色:roles

以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;相当于函数的调用把各个事件切割成片段来执行。

mkdir ./{nginx,memcached,httpd,mysql}/{file,templates,vars,handlers,meta,default,tasks} -pv

role_name/

    files/:存储由copy或script等模块调用的文件; 

    tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;

    handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;

    vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;

    templates/:存储由template模块调用的模板文本;

    meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;

    default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

在playbook中调用角色的方法:

- hosts: HOSTS
  remote_user: USERNAME
  roles:
  - ROLE1
  - ROLE2
  - { role: ROLE3, VARIABLE: VALUE, ...}
  - { role: ROLE4, when: CONDITION }

事例: 基于角色的方式安装 nginx

1、创建需要的文件

mkdir ./{nginx,memcached,httpd,mysql}/{files,templates,vars,handlers,meta,default,tasks} -pv

3、写tasks/下的主main.yml

- name: copy nginx package
  copy: src=nginx-1.10.0-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.0-1.el7.ngx.x86_64.rpm - name: install nginx package
  yum: name=/tmp/nginx-1.10.0-1.el7.ngx.x86_64.rpm  state=present - name: install nginx.conf file
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  tags: ngxconf
  notify: reload nginx service - name: install default.conf file
  template: src=default.conf.j2 dest=/etc/nginx/conf.d/default.conf
  tags: ngxconf
  notify: reload nginx service - name: start nginx service
  service: name=nginx enabled=true state=started

2.复制相应的安装包和模板到对应目录下

3、根据需要修改nginx的配置文件模板。(这里改的是work进程生成数和监听的端口)

4、写handlers目录和vars/下的main.yml 文件

5、写需要运行的主yml文件

7、测试

8、运行

成功
9、该端口测试、传递参数方式


阅读

投诉

精选留言

该文章作者已设置需关注才可以留言

写留言

该文章作者已设置需关注才可以留言

写留言

加载中
以上留言由公众号筛选后显示

了解留言功能详情

微信扫一扫
关注该公众号

Ansible 详细用法说明(二)的更多相关文章

  1. Ansible 详细用法说明(一)

    一.概述 运维工具按需不需要有代理程序来划分的话分两类: agent(需要有代理工具):基于专用的agent程序完成管理功能,puppet, func, zabbix agentless(无须代理工具 ...

  2. AI (Adobe Illustrator)详细用法(二)

    本文主要是介绍形状的创建与编辑. 一.系列形状工具 1.矩形工具 矩形的作用很大,比如输入框,按钮,图片的大小,比如相片应用中每一个照片占的比例是多大. 初步的UI图的话,会画矩形和圆角矩形就够了. ...

  3. Tomcat详细用法学习(二)

    本篇接上一篇<Tomcat详细用法学习(一)>,主要讲解服务器的虚拟目录映射的几种方式. 先来看几个概念: web应用的概念:一个web应用包含了许多我们做好的web资源,里面或许包括了多 ...

  4. 自动化运维工具Ansible详细部署 (转载)

    自动化运维工具Ansible详细部署 标签:ansible 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog. ...

  5. CString.Format的详细用法(转)

    CString.Format的详细用法(转) 在MFC程序中,使用CString来处理字符串是一个很不错的选择.CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串.CS ...

  6. IFRAM的详细用法

    IFRAM的详细用法:   IFRAM的详细用法:  <IFRAME>用于设置文本或图形的浮动图文框或容器. BORDER <IFRAME BORDER="3"& ...

  7. css基础之 font的简写规则 以及 自定义 CSS3 @font-face详细用法

    Part 1 font简写 CSS的命名规则是用英文字母 数字 和下划线(一般用小写)来命名.简写css font的好处有三:一是写起来方便(就像键盘快捷键):二是简化代码:三是帮助你熟悉和深刻理解c ...

  8. Tomcat详细用法学习(三)

    本篇接上一篇<Tomcat详细用法学习(二)>,主要讲解服务器所要求的web应用的组织结构. 上一篇说到了如何使用服务器将自己的web应用映射成虚拟目录,以便于在浏览器中可以对自己开发的w ...

  9. Tomcat详细用法学习(四)

    本篇接上一篇<Tomcat详细用法学习(三)>,主要讲解配置虚拟主机.打包web应用成war包和Tomcat的体系结构 对于Tomcat服务器,可以放置多个网站(多个web应用),这就是讲 ...

随机推荐

  1. python基础一 day2 数据类型

    int:        bool: 类型转换: str到int有条件,str必须是数字, "123e"是错误的 bool转换为int类型,需要int(x)  结果:  结果: 空字 ...

  2. PYTHON_DAY_02

    今日内容: 01 列表内置方法 '''''' ''' 列表: 定义: 在[]内,可以存放多个任意类型的值, 并以逗号隔开. 一般用于存放学生的爱好,课堂的周期等等... ''' # 定义一个学生列表, ...

  3. Linux-fuser

    Linux-fuser 1. 描述 2. 选项3. EXAMPLES4. RESTRICTIONS 限制5. SIGNAL 可用信号 fuser - 使用文件或套接字识别进程 1. 描述 fuser使 ...

  4. tmp note

    cat file.txt > /dev/null 2>&1 丢弃错误和标准输出 systemctl isolate multi-user.target 切换回多用户命令行模式 sy ...

  5. saltstack install on centos7

    saltstack offical website reference blog summary install virtualbox yum install VirtualBox-5.2 insta ...

  6. 如何给run()方法传参数

    实现的方式主要有三种 1.构造函数传参 2.成员变量传参 3.回调函数传参 问题:如何实现处理线程的返回值? 1.主线程等待法(优点:实现起来简单,缺点:需要等待的变量一多的话,代码就变的非常臃肿.而 ...

  7. spoj-TSUM Triple Sums

    题目描述 题解: 很吊的容斥+$FFT$,但是并不难. 首先,由于有重复,我们要容斥. 怎么办? 记录三个多项式, 只取一个:$w1$; 相同物体拿两个:$w2$; 相同物体拿三个:$w3$; 然后答 ...

  8. MySQL 优化 之 Copying to tmp table on disk

    项目中遇到了慢查询问题 Sql语句 SELECT sum(price) AS price, `member_id` FROM `crm_upload` GROUP BY member_id ORDER ...

  9. LeetCode(57) Insert Interval

    题目 Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if nece ...

  10. LeetCode(169)Majority Element

    题目 Given an array of size n, find the majority element. The majority element is the element that app ...