ansible指令总结

1.ansible相关命令总结

1.1.Play


指令 说明
accelerate 开启加速模式
accelerate_ipv6 是否开启ipv6
accelerate_port 加速模式的端口
always_run
any_errors_fatal 有任务错误时,立即停止
become 是否提权
become_flags 提权命令的参数
become_method 提权得方式
become_user 提权的用户
check_mode 当为True时,只检查,不做修改
connection 连接方式
environment 定义远端系统的环境变量
force_handlers 任务失败后,是否依然执行handlers中的任务
gather_facts 是否获取远端系统得facts
gather_subset 获取facts得哪些键值
gather_timeout 获取facts的超时时间
handlers 定义task执行完成以后需要调用的任务
hosts 指定运行得主机
ignore_errors 是否忽略错误
max_fail_percentage 最大的错误主机数,超过则立即停止ansbile
name 定义任务得名称
no_log 不记录日志
port 定义ssh的连接端口
post_tasks 执行任务后要执行的任务
pre_tasks 执行任务前要执行的任务
remote_user 远程登陆的用户
roles 定义角色
run_once 任务只运行一次
serial 任务每次执行的主机数
strategy play运行的模式
tags 标记标签
tasks 定义任务
vars 定义变量
vars_files 包含变量文件
vars_prompt 要求用户输入内容
vault_password 加密密码

1.2.Role


指令 说明
always_run
become 是否提权
become_flags 提权命令的参数
become_method 提权的方式
become_user 提权的用户
check_mode 当为True时,只检查,不做修改
connection 连接方式
delegate_facts 委托facts
delegate_to 任务委派
environment 定义远端系统的环境变量
ignore_errors 是否忽略错误
no_log 不记录日志
port 定义ssh的连接端口
remote_user 远端系统的执行用户
run_once 只运行一次
tags 标记标签
vars 定义变量
when 条件表达式结果为True则执行block

1.3.Block


指令 说明
always always里的任务总是执行
always_run
any_errors_fatal 有错误时立即中断ansbile
become 是否提权
become_flags 提权命令的参数
become_method 提权的方式
become_user 提权的用户
block 分组执行
check_mode 当为True时,只检查,不做修改
connection 连接方式
delegate_facts 委托facts
delegate_to 任务委派
environment 定义远端系统的环境变量
ignore_errors 是否忽略错误
no_log 不记录日志
port 定义ssh的连接端口
remote_user 远端系统的执行用户
rescue block中的任务在执行中,如果有任何错误,将执行rescue中的任务。
run_once 只运行一次
tags 标记标签
vars 定义变量
when 条件表达式结果为True则执行block

1.4.Task


说明
action 执行动作
always_run
any_errors_fatal 为True时,只要任务有错误,就立即停止ansible
args 定义任务得参数
async 是否异步执行任务
become 是否提权
become_flags 提权命令的参数
become_method 提权的方式
become_user 提权的用户
changed_when 条件表达式为True时,使任务状态为changed
check_mode 为True时,只检查运行状态,在远端不做任何修改
connection 连接方式
delay 等待多少秒,才执行任务
delegate_facts 委托facts
delegate_to 任务委派
environment 定义远端的环境变量
failed_when 条件表达式为True时,使任务为失败状态
ignore_errors 是否忽略错误
local_action 本地执行
loop
loop_args
loop_control 改变循环的变量项
name 定义人物的名称
no_log 不记录日志
notify 用于任务执行完,执行handlers里的任务
poll 轮询时间
port 定义ssh的连接端口
register 注册变量
remote_user 远端系统的执行用户
retries 重试次数
run_once 只运行一次
tags 标记为标签
until 直到为真时,才继续执行任务
vars 定义变量
when 条件表达式,结果为True则执行task
with_ 循环


2 ansible常用技巧

2.1 ansible find判断字符是否在变量

- hosts: test71
  gather_facts: no
  vars:
    a: "vaA12345"
  tasks:
  - debug:
      msg: "not found"
    when: a.find('A2') == -1

当在字符串中没有找到对应的字符时,find函数的返回值为"-1"

2.2 任务委派delegate_to


- hosts: test70,test71 gather_facts: no tasks: - file: path: "/tmp/ttt" state: touch - file: path: "/tmp/delegate" state: touch delegate_to: test61 - file: path: "/tmp/ttt1" state: touch 第二个任务只会在test61上执行

2.3 让任务在ansible主机上执行(connection: local)

- hosts: test70,test61
  gather_facts: no
  tasks:
  - file:
      path: "/tmp/inAnsible"
      state: touch
    connection: local
 
  - file:
      path: "/tmp/test"
      state: touch

2.4 任务只执行一次 (run_once: true)

比如下载一个文件,分发到各个目标主机,我们只需要下载一次。
- hosts: A,B,C,D,E
  gather_facts: no
  tasks:
  - get_url:
      url: "http://nexus.zsythink.net/repository/testraw/testfile/test.tar"
      dest: /tmp/
    connection: local
    run_once: true
 
  - copy:
      src: "/tmp/test.tar"
      dest: "/tmp"

2.5 向变量列表里更改内容

追加元素
- hosts: test71
  gather_facts: no
  vars:
   tlist:
     - 1
     - 2
  tasks:
  - set_fact:
      tlist: "{{ tlist + ['a'] }}"
  - debug:
      var: tlist
方法二
- hosts: test71
  gather_facts: no
  vars:
   tlist:
     - 1
     - 2
  tasks:
  - set_fact:
      tlist: "{% set tlist = tlist + ['a'] %}{{tlist}}"
  - debug:
      var: tlist

方法三:
- hosts: test71
  gather_facts: no
  vars:
   tlist:
     - 1
     - 2
  tasks:
  - set_fact:
      tlist: "{{ tlist.append('a') }}{{tlist}}"
  - debug:
      var: tlist

追加多个元素
- hosts: test71
  gather_facts: no
  vars:
   tlist:
     - 1
     - 2
  tasks:
  - set_fact:
      tlist: "{{ tlist.append(['a','b']) }}{{tlist}}"
  - debug:
      var: tlist

在列表中插入项
- hosts: test71
  gather_facts: no
  vars:
   tlist:
     - 11
     - 2
     - 11
  tasks:
  - set_fact:
      tlist: "{{ tlist.insert(1,'a') }}{{tlist}}"
  - debug:
      var: tlist

从列表中删除项

- hosts: test71
  gather_facts: no
  vars:
   tlist:
     - 11
     - 2
     - 'a'
     - 'b'
     - 3
  tasks:
  - debug:
      msg: "{{tlist.pop(2)}}"

可以通过jinja2语法删除匹配数字
- hosts: test71
  gather_facts: no
  vars:
    tlist:
    - 11
    - 'b'
    - 'a'
    - 'b'
    - 11
    - 'a11'
    - '1a'
    - '11'
  tasks:
  - set_fact:
      tlist: "{%for i in tlist%}{% if 11 in tlist%}{{tlist.remove(11)}}{%endif%}{%endfor%}{{tlist}}"
  - debug:
      var: tlist

2.6 Ansible的并发限制 (serial、max_fail_percentage )

serial 并发数
max_fail_percentage 最大失败百分比

默认情况下, 只要ansible的group中还有server没有失败, ansible就是继续执行tasks。实际上, 用户可以通过max_fail_percentage(最大失败百分比)来限制ansible的并发执行。
只要超过max_fail_percentage的server失败, ansible就可以中止tasks的执行。serial参数在ansible-1.8以后就开始支持百分比功能了!!

试想一下如果group组里有200台机器,那么如果使用serial来限制并发数量,比如设置serial=10,意思就是一次只执行10台,一直到200台完成。
只要组内还有server没有失败, ansible就是继续执行tasks。这样就显得效率很低了,很不方便!这时就可以使用类似控制流的max_fail_percentage功能了!!

- hosts : all
  max_fail_percentage: 30
  serial: 10

  tasks :
    - name: Install telnet
      yum: name=telnet state=installed

    - name : Run Serverstart.sh
      command : /bin/bash /opt/scripts/Serverstart.sh
      async : 300
      poll : 10
      register: sh_result

2.7 Ansible的任务暂停 (local_action、wait_for )

- hosts: test_server
  remote_user: root
  gather_facts: no

  tasks:
    - name: port_test
      local_action:
        module: wait_for           #模块名字
        port: 2379
        host: 172.16.60.241
        delay: 10
        timeout: 300
        state: started
使用local_action配合wait_for模块来完成任务的暂停操作。
上面配置说明port_test任务每隔10s检查指定主机上的2379端口是否开启,如果操作300s,2379端口任未开启,将返回失败信息。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: