设为首页 收藏本站
查看: 1051|回复: 0

[经验分享] Ansible 详细用法说明(二)

[复制链接]

尚未签到

发表于 2018-7-30 07:04:02 | 显示全部楼层 |阅读模式
  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 dt 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是写playbook,jinja2是写配置文件模板的
功用
  将模板的文件的变量值转换成对应的本地主机的确定值。例如: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、该端口测试、传递参数方式


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-543234-1-1.html 上篇帖子: Ansible 详细用法说明(一) 下篇帖子: ansible-7326056
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表