• Ansible中的剧本 ansible--playbook


    playbook更加强大, 等于说写了一个脚本来对多个被控机执行命令.playbook用的是yaml格式

    执行示例:

    #1. 编辑yml文件
    vi p1.yml
    
    - hosts: web  			# 主机组
      remote_user: root  	# 将以root用户在被控机上执行命令,默认就是root,这行可以不写
      tasks:
      - name: xxx  		 	# 执行的任务名字,自定义
      user: name=tom  		# 运用模块执行的命令
      
    # 运行yml文件之前可以检查语法  
    ansible-playbook p1
    
    #2. 运行yml文件
    ansible-playbook p1.yml
    
    # 运行过程中如果报错会产生.retry文件,这个文件没有作用,可以删除
    

    一.playbook格式

    基本格式与重要参数

    Usage: ansible-playbook [options] playbook.yml [playbook2 ...]
    
    -C, --check 			#检查执行,执行但是不会有结果
    --list-hosts 			#列出符合的主机
    -f FORKS, --forks=FORKS #做并发
    --syntax-check 			#检查语法
    -k, --ask-pass 			#输入密码
    -t TAGS, --tags=TAGS  	# 执行指定标签
    

    1.单个playbook

    示例: 使用user模块添加用户

    - hosts: web
      remote_user: root
      tasks:
      - name: createuser
        user: name=tom20 home=/opt/tom20 uid=4000
    

    2.多个playbook

    - hosts: web
      remote_user: root
      tasks:
      - name: createuser
        user: name=tom20 home=/opt/tom20 uid=4000 
      - name: copyfile
        copy: src=/etc/fstab dest=/tmp/fs
    
    

    play-book具有幂等性 不论执行多少次,得到的结果都是一样的

    幂等性

    • 在某二元运算下,幂等元素是指被自己重复运算(或对于函数是为复合)的结果等于它自己的元素。例如,乘法下唯一两个幂等实数为0和1。
    • 某一元运算为幂等的时,其作用在任一元素两次后会和其作用一次的结果相同。例如,高斯符号便是幂等的。
    - hosts: web
      remote_user: root
      tasks:
      - name: createuser
        user: name=tom20 home=/opt/tom20 uid=4000
      - name: copyfile
        copy: src=/etc/fstab dest=/tmp/fs
    - hosts: db
      tasks:
      - name: copyfile
        copy: src=/etc/fstab dest=/tmp/fs                         
    

    二.传参

    第一种方式

    执行命令时,加-e来指定参数

    - hosts: web
      tasks:
      - name: create{{user}}
        user: name={{user}}
    ansible-playbook -e user=BOB20 p3.yml
    

    第二种方式

    在/etc/ansible/hosts文件中的主机名后加参数

    [web]
    192.168.226.[101:102] user=tom30
    192.168.226.104  user=tom100
    

    第三种方式

    在/etc/ansible/hosts文件中专门加上一个组

    [web:vars]  # web是自定义的组, :vars 必须这么写
    user=tom31
    

    第四种方式

    在要执行的yml文件中添加vars

    - hosts: web
      vars:  # 这一行
      - user: tom32
      tasks:
      - name: create{{user}}
        user: name={{user}}
    

    第五种传参方式

    使用register

    - hosts: web
      tasks:
      - name: yum
        yum: name=bc
      - name: sum
        shell: echo 11+22|bc  # bc用于加法 安装方式为 yum install bc
        register: user  #  注册,将上面的返回值注册到下面,所有有返回值的都可以,不一定是shell
      - name: echo
        shell: echo {{user.stdout}} > /tmp/echo.txt 
      - name: create{{user.stdout}}
        user: name=tom{{user.stdout}}
    

    参数执行优先级

    命令行 -e 参数 > playbook的yuml文件 > hosts文件
    

    三.模块

    1.setup模块

    ansible命令执行自定义命令的默认第一个走的就是setup, 就是说要想ansible连接被控机,首先必须要实现setup模块,下面是执行之后返回的一些重要参数

    ansible_all_ipv4_addresses #所有的ipv4地址
    ansible_all_ipv6_addresses #所有的ipv6地址
    ansible_architecture #系统的架构
    ansible_date_time #系统时间
    ansible_default_ipv4 #默认的ipv4地址
    	address ip地址
    	alias 网卡名称
    	broadcast 广播地址
    	gateway 网关
    	netmask 子网掩码
    	network 网段
    ansible_default_ipv6 #默认的ipv6地址
    ansible_device_links #系统的磁盘信息
    ansible_distribution #系统名称
    ansible_distribution_file_variety #系统的基于公司
    ansible_distribution_major_version #系统的主版本
    ansible_distribution_version #系统的全部版本
    ansible_dns #系统的dns 默认udp 端口53
    ansible_domain #系统的域 ldap
    ipv4 #ipv4地址
    ansible_env #系统的环境
    ansible_fqdn #系统的完整主机名
    ansible_hostname #系统的简写主机名
    ansible_kernel #系统的内核版本
    ansible_machine #系统的架构
    ansible_memtotal_mb #系统的内存
    ansible_memory_mb #系统的内存使用情况
    ansible_mounts #系统的挂载信息
    ansible_os_family #系统家族
    ansible_pkg_mgr #系统的包管理工具
    ansible_processor #系统的cpu
    ansible_processor_cores #每颗cpu的核数
    ansible_processor_count #cpu的颗数
    ansible_processor_vcpus #cpu的个数=cpu的颗数*每颗cpu的核数
    ansible_python #系统python信息
    ansible_python_version #系统python的版本
    ansible_system #系统名字
    

    2.tags

    在yuml文件中加入tags:属性,ansible-playbook -t tagname yuml.yml 可以仅直接执行tags所在的这个模块命令

    - hosts: web
      tasks:
      - name: install
        yum: name=redis
      - name: copyfile
        copy: dest=/etc/redis.conf src=/etc/redis.conf
        tags: copy
      - name: start
        service: name=redis state=started
    ansible-playbook -t copy p7.yml
    

    3.handlers

    添加notify参数指定handler的名称可以在ansible-playbook -t tagname yuml.yml之后自动执行handler中的内容, 直接执行这个yml文件,则handlers不执行

    - hosts: web
      tasks:
      - name: install
        yum: name=redis
      - name: copyfile
        copy: dest=/etc/redis.conf src=/etc/redis.conf
        tags: copy
        notify: restart
      - name: start
        service: name=redis state=started
      handlers:
      - name: restart
        service: name=redis state=restarted
    

    四.template

    使用模版语言渲染变量,可以非常方便的执行渲染变量

    下面实现的是配置redis.conf文件实现监听被控机的ip地址,在redis.conf中配置如下

    bind {{ansible_default_ipv4.address}}
    # setup中的参数,直接拿过来渲染,因为ansible连接必先执行setup
    

    绝对路径

    - hosts: web
      tasks:
      - name: install
        yum: name=redis
      - name: copyfile
        template: dest=/etc/redis.conf src=/etc/redis.conf  # 这里的src是绝对路径
        tags: copy
        notify: restart
      - name: start
        service: name=redis state=started
      handlers:
      - name: restart
        service: name=redis state=restarted
    

    相对路径

    给conf文件加后缀 : mv redis.conf{,.j2} = mv redis.conf redis.conf.j2

    - hosts: web
      tasks:
      - name: install
        yum: name=redis
      - name: copyfile
        template: dest=/etc/redis.conf src=redis.conf.j2  # 这里的src是相对路径
        tags: copy
        notify: restart
      - name: start
        service: name=redis state=started
      handlers:
      - name: restart
        service: name=redis state=restarted
    在当前目录下创建一个templates的目录,就可以使用相对路径
    

    vi编辑器使用小技巧 : d$ 从当前位置删除到结尾

    五.嵌套循环

    1.when

    判断centos系统版本为7或者6时执行的动作

    - hosts: web
      tasks:
      - name: copyfile
        copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt
        when: ansible_distribution_major_version=="7"
      - name: copyfile
        copy: content="小弦切切如私语" dest=/tmp/a.txt
        when: ansible_distribution_major_version=="6"
    
    - hosts: web
      tasks:
      - name: copyfile
        copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt
        when: user=="4"
      - name: copyfile
        copy: content="小弦切切如私语" dest=/tmp/a.txt
        when: user=="3"
    

    2.with_items

    遍历选项

    示例1

    - hosts: web
      tasks:
      - name: createuser
        user: name={{item}}
        with_items:
        - tom50
        - Robert50
        - mike50
    

    示例2, 当两组循环时

    - hosts: web
      tasks:
      - name: createuser
        user: name={{item}}
        with_items:
        - tom51
        - BOB51
        - mike51
      - name: creategroup
        group: name={{item}}
        with_items:
        - tom60
        - BOB60
        - mike60
    
    

    嵌套循环

    - hosts: web
      tasks:
      - name: crateuser
        user: name={{item.name}}  group={{item.group}}
        with_items:
        - {"name":tom52,"group":tom60}
        - {"name":BOB52,"group":BOB60}
        - {"name":mike52,"group":mike60}
    
  • 相关阅读:
    QThread的用法:开启与退出
    QThread必须要了解的几个函数
    Ubuntu16.04LTS +Qt+boost1.66编译错误:consuming_buffers.hpp: parse error in template argument list
    安装gcc-6系列与安装boost (Ubuntu16.04LTS)
    Qt 的线程与事件循环
    Linux 平台和 Windows平台下 Unicode与UTF-8互转
    [spark] spark 特性、简介、下载
    [hadoop读书笔记] 第十五章 sqoop1.4.6小实验
    [hadoop读书笔记] 第十五章 sqoop1.4.6小实验
    [hadoop读书笔记] 第十五章 sqoop1.4.6小实验
  • 原文地址:https://www.cnblogs.com/robertx/p/10827768.html
Copyright © 2020-2023  润新知