zoukankan      html  css  js  c++  java
  • Ansible playbook

    简单的playbook

    编写playbook

    #hello.yml
    #---可写可不写,习惯表示yml的开始
    ---
    #对websrvs里的主机操作
    - hosts: websrvs
    #用root身份登录
      remote_user: root
    #指定命令
      tasks:
      #name是说明性的,说明等下我要做的是什么操作
        - name: hello
        #模块名,后面跟参数,相当于 -a里的值
          commmand: hostname

    运行playbook

    ansible-playbook hello.yml

    执行上述playbook,是看不到结果的。查看playbook帮助:ansible-playbook --help

    playbook具体使用

    工具

    ansible-vault

    管理加密解密yml文件

    ansible-vault encrypt hello.yml对hello.yml进行加密,并且输入口令。加密后无法看到原文件内容,且无法运行。
    ansible-vault decrypt hello.yml对hello.yml进行解密。
    ansible-vault view hello.yml看hello.yml内容,需要口令。
    ansible-vault edit hello.yml对hello.yml进行编辑。
    ansible-vault rekey hello.yml修改口令。
    ansible-vault create hello2.yml创建新的yml。

    ansible-console

    可执行交互式命令,支持tab。

    ansible-console进入控制台。

    root@all (3)[f:5]$提示符:用户:root,默认对主机清单的哪些主机操作:all,包括主机数:(3),并发执行个数:f:5。
    切换操作的主机:cd websrvs即可对websrvs主机操作。
    修改并发:forks 10修改为10个并发。
    了解用法:? 返回的即各个模块。
    执行一个命令:command hostname;hostname name=boxker.node1

    playbook使用

    YAML介绍

    yaml是一个可读性高的用来表达资料序列的格式。

    YAML官网

    语法简介

    • 在单一档案中,可用三个连字符区分多个档案,另外可选择性的连续三个点号来表示档案结尾
    • 次行开始写playbook内容,一般建议写明该playbook功能
    • 使用#注释
    • 缩进必须统一,不能混用空格和tab
    • 缩进级别也必须统一,同样的缩进表示同样的级别,程序判别配置的级别是通过缩进结合换行实现的
    • YAML打下些判断和Linux一致,区分大小写
    • k/v值可以换行饿也可以同行写,用:分隔
    • v可以是字符串,也可以是另一个列表
    • 一个完整的功能块最少元素包括:name:task
    • 一个name只能包括一个task
    • YAML文件扩展名通常为yml或yaml

    列表

    所有元素用-开头,表示同一类型的元素

    字典

    有多个键值对组成,:分隔

    name:hi
    job:dev
    skill:elite

    也可以将key:value放在{}中,用逗号分隔多个kv

    {name:hi,job:dev,skill:elite}

    playbook 核心元素

    • Hosts 远程主机列表
    • Tasks 任务集
    • Varniables 内部变量或自定义变量在playbook中调用
    • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
    • Handlers 和 Notity综合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
    • tags 标签指定莫条任务执行,用于选择运行playbook中的部分代码。

    创建文件、用户、安装httpd、复制网页、运行服务

    ---
    - hosts: websrvs
      remote_name: root
    
      tasks:
        - name: create new file
          file: name=/data/newfile state=touch
        - name: create new user
          user: name=test1 system=yes shell=/sbin/nologin
        - name: install package
          yum: name=httpd
        - name: copy html
          copy: src=/var/www/html/index.html dest=/var/www/html/
        - name: start service
          service: name=httpd state=started enabled=yes

    检查:ansible-playbook -C file.yml

    运行:ansible-playbook file.yml

    -C 即担心有错,用来检查,不会有改变。

    ss是Socket Statistics的缩写。查看80端口情况: ss -tln | grep :80ss命令详解

    #ss 参数:
    Usage: ss [ OPTIONS ]
           ss [ OPTIONS ] [ FILTER ]
       -h, --help          this message
       -V, --version       output version information
       -n, --numeric       don't resolve service names
       -r, --resolve       resolve host names
       -a, --all           display all sockets
       -l, --listening     display listening sockets
       -o, --options       show timer information
       -e, --extended      show detailed socket information
       -m, --memory        show socket memory usage
       -p, --processes     show process using socket
       -i, --info          show internal TCP information
           --tipcinfo      show internal tipc socket information
       -s, --summary       show socket usage summary
       -b, --bpf           show bpf filter socket information
       -E, --events        continually display sockets as they are destroyed
       -Z, --context       display process SELinux security contexts
       -z, --contexts      display process and socket SELinux security contexts
       -N, --net           switch to the specified network namespace name
       -4, --ipv4          display only IP version 4 sockets
       -6, --ipv6          display only IP version 6 sockets
       -0, --packet        display PACKET sockets
       -t, --tcp           display only TCP sockets
       -S, --sctp          display only SCTP sockets
       -u, --udp           display only UDP sockets
       -d, --dccp          display only DCCP sockets
       -w, --raw           display only RAW sockets
       -x, --unix          display only Unix domain sockets
           --tipc          display only TIPC sockets
           --vsock         display only vsock sockets
       -f, --family=FAMILY display sockets of type FAMILY
           FAMILY := {inet|inet6|link|unix|netlink|vsock|tipc|help}
       -K, --kill          forcibly close sockets, display what was closed
       -H, --no-header     Suppress header line
       -A, --query=QUERY, --socket=QUERY
           QUERY := {all|inet|tcp|udp|raw|unix|unix_dgram|unix_stream|unix_seqpacket|packet|netlink|vsock_stream|vsock_dgram|tipc}[,QUERY]
       -D, --diag=FILE     Dump raw information about TCP sockets to FILE
       -F, --filter=FILE   read filter information from FILE

    Tasks 格式

    1. action:module arguments
    2. module: arguments (建议)

    大部分都是 key: value,除了shell 和 command后面跟命令。

    意外退出默认中断执行

    如果命令或脚本退出码不为零:

    #方法1
    #错误返回真,便可以继续执行
    tasks:
      - name: run this command and ignore the restul
        shell: /usr/bin/somecommand || /bin/true
    
    #方法2
    #使用ignore_errors,无论成功错误都忽略
    tasks:
      - name: run this command and ignore the restul
        shell: /usr/bin/somecommand
        ignore_errors: True

    常见选项

    --check 只检测可能发生的改变,但不真正的操作
    --list-hosts 列出运行任务的主机
    --list-tasks 列出任务列表
    --list-tags 列出tags
    --limit 主机列表,只针对主机列表中的主机执行
    -v 显示过程,vv,vvv

    一个模块对应一个name,不能混在一起写,只会保留最后一个,会有警告。执行中没有写绝对路径则以当前目录为环境。

    Handlers、Notify

    task列表,这些task和前面的task没有本质的不同,用于当关注的资源发生变化时,才会采取一定的操作。相当于一个触发器。和Tasks时并列的关系,可以监控其中一个task的action动作,其中发现一个action动作执行成功了,将会触发handlers定义的一些命令。(例如修改了配置文件,重新执行yml文件,像serice便不会restarted)。

    Notify此action可用于每个play的最后触发,这样可以避免多次改变发生时每次都执行指定的操作,竟在所有变化发生完成后一次性的执行指定操作。在Notify中列出的操作称为handler,也即Notify中调用Handler中定义的操作。

    ---
    - hosts: websrvs
      remote_name: root
    
      tasks:
        - name: install httpd package
          yum: name=httpd
        - name: copy conf file
          copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
          notify: restart service
        - name: start service
          service: name=httpd state=started enabled=yes
    
      handlers:
        - name: restart service
          service: name=httpd state=restarted

    notify 触发多个动作,用列表

    notify:
      - restart service
      - Check

    当文件和远程文件一模一样,copy的backup不会生效。

    Tags

    起标签,将来可以调用标签的内容

    ---
    - hosts: websrvs
      remote_name: root
    
      tasks:
        - name: install httpd package
          yum: name=httpd
          tags: inshttpd
        - name: copy conf file
          copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
          notify: restart service
        - name: start service
          service: name=httpd state=started enabled=yes
          tags: rshttpd
    
      handlers:
        - name: restart service
          service: name=httpd state=restarted

    执行 ansible-playbook -t rshttpd httpd.yml,只执行rshttpd部分。
    执行安装开启服务 ansible-playbook -t inshttpd,rshttpd httpd.yml

    若有多个task的tags都相同,则在-t执行时均会操作。多个动作可公用一个标签。ansible-playbook httpd.yml --list-tags只看标签信息。

    playbook中变量的使用

    变量名:只能由字母、数字、下划线组成,且只能以字母开头

    变量来源:

    1.ansible setup facts 远程主机的所有变量都可以直接调用

    setup模块,系统信息。ansible all -m setup -a 'filter=ansible_hostname'查看hostname信息。filter还支持通配符。ansible_hostname即为一个变量。

    2.在/etc/ansible/hosts中定义

    普通变量:主机组中单独定义,优先级高于公共变量
    公共(组)变量:针对主机组中所有主机定义统一变量

    #/etc/ansible/hosts
    [websrvs]
    192.168.1.111 http_port=81
    192.168.1.112 http_port=82
    #hostname.yml
    ---
    - hosts: websrvs
      remote_name: root
    
      tasks:
        - name: set hostname
          hostname: name=www{{ http_port }}.boxker.com

    #/etc/ansible/hosts
    [websrvs]
    192.168.1.111 http_port=81
    192.168.1.112 http_port=82
    
    [websrvs:vars]
    nodename=www
    domainname=boxker.com
    #hostname.yml
    ---
    - hosts: websrvs
      remote_name: root
    
      tasks:
        - name: set hostname
          hostname: name={{ nodename }}{{ http_port }}.{{ domainname }}

    设置hostname: hostnamectl set-hostname node1

    3.通过命令行指定变量,优先级最高

    ansible-playbook -e varname=value

    4.在playbook中定义

    var:
      - var1: value1
      - var2: value2

    5.在role中定义


    安装自定义包并开启服务

    ---
    - hosts: websrvs
      remote_name: root
    
      tasks:
        - name: install package
          yum: name={{ pkname }}
        - name: start service
          service: name={{ pkname }} state=started enabled=yes

    执行:ansible-playbook -e 'pkname=vsftpd' app.yml


    安装两个包

    ---
    - hosts: websrvs
      remote_name: root
    
      tasks:
        - name: install 1 package
          yum: name={{ pkname1 }}
        - name: install 2 package
          yum: name={{ pkname2 }}

    执行:ansible-playbook -e 'pkname1=httpd pkname2=memcached' app.yml

    playbook中定义

    ---
    - hosts: websrvs
      remote_name: root
      vars:
        - pkname1: httpd
        - pkname2: memcached
    
      tasks:
        - name: install 1 package
          yum: name={{ pkname1 }}
        - name: install 2 package
          yum: name={{ pkname2 }}

    执行:ansible-playbook app.yml

  • 相关阅读:
    SQL语句的执行顺序
    凭兴趣求职80%会失败,为什么
    Google Analytics:为链接点击设定事件追踪的方法
    org/hamcrest/SelfDescribing
    Idea使用记录--添加Problems&&解决Autowired报错could not autowire
    RBAC(Role-Based Access Control)基于角色的访问控制
    如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)?
    记录使用Hibernate查询bean中字段和数据库列类型不匹配问题
    Java添加自定义注解
    JS获取select的值
  • 原文地址:https://www.cnblogs.com/boxker/p/10848074.html
Copyright © 2011-2022 走看看