ansible常用模块介绍

1.playbook目录结构

1.1

  • /data/ansible
    • host文件:定义主机组,变量
    • deploy.yml
      • host: “主机组”
      • gather_facts: true #获取server基本信息
      • remote_user: root #目标服务器用户指定
      • roles:
        - testbox #进入roles/的目标任务
    • roles/ #任务目录
      • task
      • templetes
      • file
      • defaults
  • 例子:
  • ]# ansile-playbook -i host xxx.yml
    

1.2 主机组变量定义

  • ansible hostname.example.com -m setup #主机信息查看

1.2.1

例:
host_flink:
[flink]
10.10.108.214   ms="master"
使用:
when: ansible_hostname == "master"

1.2.2

例:
test.yml:
- host:  主机组1
 vars:
   ms: master
 roles:
   flink
- host:  主机组2
 vars:
   ms: master
 roles:
   flink  

2.模块介绍

2.1工作中总结

  • register:判断执行了某个操作或者某个命令后,如何做出相应的处理
    • notice:register命令不能用-,要用_;ignore_errors一定要配合设置成True,否则若当前语句执行不成功,则之后的语句不会执行,程序终止
  • 例子:
- name: create a register to represent the state of /dev/sda6 exist
  shell: df -h | grep sda6
  register: sda6_result
  ignore_errors: True
  tags: docker
- name: if /dev/sda6 exist do copy
  copy: src=/root/1.sh dest=/usr/bin/1.sh mode=0755
  when: sda6_result | successd
  tags: docker
  • connection: local # execute locally only
  • run_once: true #only execute once
  • until:
  • 例子:
- name: 轮询等待rapm-hostagent运行
  shell: kubectl get pod -o wide| grep 'rapm-hostagent' | grep '{{inventory_host}}' | awk '{print $3}'
  until: pod_status.stdout == "Running"
  retries: 15
  delay: 8
  ignore: True
  • ansible_palybook内置变量
    • groups: hsots文件里所有主机及主机组信息,返回的是一个json字符串
    • group_names: 引用当前主机所在group的名称
    • hostvars: 可以用来引用指定主机的信息
      • 例:debug: msg="{{hostvars[‘ansible1’][‘address’]}}"
    • inventory_hostname: 返回inventory文件里定义的主机名
    • inventory_hostname_short: 返回inventory文件中主机名第一部分
    • play_hosts: 返回当前playbook运行的主机信息,格式是host_list
    • inventory_dir: 返回当前playbook使用的inventory目录
  • block: 定义块
    • 块功能可以将任务进行分组,并且可以在块级别上应用任务变量,同时支持在块内进行异常处理
    • rescue: 当出现异常时执行的语句
    • always: 无论如何都要执行的语句
  • stdout: 获取返回值,输出格式为json形式
- name: create 1.sh
  shell: test ! -f 1.sh && touch 1.sh
  fiald_when: false

2.2文档总结

  • shell:(没有幂等性)
    • chdir # 在执⾏命令前,先cd到指定的⽬录下
    • creates # ⽤于判断命令是否要执⾏。如果指定的⽂件(可以使⽤通配符)存 在,则不执⾏。
    • removes # ⽤于判断命令是否要执⾏。如果指定的⽂件(可以使⽤通配符)不存在,则不执⾏。
    • executable # 不再使⽤默认的/bin/sh解析并执⾏命令,⽽是使⽤此处指定的命令解析。 例如使⽤expect解析expect脚本。必须为绝对
  • 例子:
- name: shell example
  shell: touch helloword.txt
  args:
    creates: /tmp/helloworld.txt
  • copy:
    • backup=[yes|no] # 拷贝的同时也创建⼀个包含时间戳信息的备份⽂件,默认为no
    • directory_mode # 当对⽬录做递归拷贝时,设置了directory_mode将会使得只拷贝新建⽂件,旧⽂件不会被拷贝。默认未设置
    • force=[yes|no] # 设置为yes(默认)时,将覆盖远程同名⽂件。设置为no时,忽略同名⽂件的拷贝
    • group # 设置远程⽂件的所属组
    • owner # 设置远程⽂件的所有者
    • mode= # 设置远程⽂件的权限。使⽤数值表⽰时不能省略第⼀位,如0644。
    • content # 直接以content给定的字符串或变量值作为⽂件内容保存到远程主机上,它会替代src选项
    • remote_src=no #从server复制到目标主机
    • force=yes #强制执行
  • 例子:
- name: copy example
  copy: src=/root/src= # ansible控制器上Jinja2格式的模板所在位置,可以是相对或绝对路径test dest=/root/test owner=formssi group=formssi mode=0644
  • template:
    • backup # 拷贝的同时也创建⼀个包含时间戳信息的备份⽂件,默认为no
    • dest= # ⽬标路径
    • src= # ansible控制器上Jinja2格式的模板所在位置,可以是相对或绝对路径
    • force # 设置为yes (默认)时,将覆盖远程同名⽂件。设置为no时,忽略同名⽂件的拷贝
    • group # 设置远程⽂件的所属组
    • owner # 设置远程⽂件的所有者
    • mode # 设置远程⽂件的权限。使⽤数值表⽰时不能省略第⼀位,如0644
    • validate # 在复制到⽬标主机后但放到⽬标位置之前,执⾏此选项指定的命令,⼀般⽤于检查配置⽂件语法,语法正确则保存到⽬标位置
  • 例子:
- name: template file based var
  template: src=/templates/nginx{{ ansible_distribution_major_version }}.conf.j2 dest=/etc/nginx/nginx.conf validate="/usr/sbin/nginx -t -c %s"
  • file:管理⽂件、⽬录的属性,也可以创建⽂件或⽬录
    • group # file/directory的所属组
    • owner # file/directory的所有者
    • mode # 修改权限,格式可以是0644、'u+rwx’或’u=rw,g=r,o=r’等
    • path= # 指定待操作的⽂件,可使⽤别名’dest’或’name’来替代path
    • recurse # (默认no)递归修改⽂件的属性信息,要求state=directory
    • src # 创建链接时使⽤,指定链接的源⽂件
    • state
      • directory:如果⽬录不存在则递归创建
      • file:⽂件不存在时,不会被创建(默认值)
      • touch:touch由path指定的⽂件,即创建⼀个新⽂件,或修改其mtime和atime
      • link:修改或创建软链接
      • hard:修改或创建硬链接
      • absent:⽬录和其中的⽂件会被递归删除,⽂件或链接将取消链接状态
  • 例子:
- name: file example
 file: path=/root/test.txt state=touch mode=755 owner=foo group=foo
  • fetch:拉取文件模块(和copy⼯作⽅式类似,只不过是从远程主机将⽂件拉取到本地端,存储时使⽤主机名作为⽬录树,且只能拉取⽂件不能拉取目录)
    • dest= # 本地存储拉取⽂件的⽬录。例如dest=/data,src=/etc/fstab,远程主机名host.exp.com,则保存的路径为/data/host.exp.com/etc/fstab
    • fail_on_missing # 当设置为yes时,如果拉取的源⽂件不存在,则此任务失败。默认为no
    • flat # 改变拉取后的路径存储⽅式。如果设置为yes,且当dest以"/"结尾时,将直接把源⽂件的basename存储在dest下。显然,应该考虑多个主机拉取时的⽂件覆盖情况
    • src= # 远程主机上的源⽂件。只能是⽂件,不⽀持⽬录。在未来的版本中可能会⽀持⽬录递归拉取。
    • validate_checksum # fetch到⽂件后,检查其md5和源⽂件是否相同。
  • 例子:
- name: fetch example
  fetch: src=/etc/fatab dest=/opt/ flat=yes
  • yum:包管理模块
    • disable_gpg_check # 安装包时禁⽌gpgcheck,仅在state=present或latest时⽣效
    • disablerepo # 禁⽤指定的repoid,多个repoid使⽤逗号分隔
    • enablerepo # 明确使⽤该repoid
    • exclude # 排除哪些包不安装,仅在state=present或latest时⽣效。
    • list # 类似于yum list
    • name= # 指定安装的包名,可带上版本号。多个包可使⽤逗号分隔。
    • state # 状态。(‘present’、‘installed’,‘latest’)⽤于安装包,(‘absent’、‘removed’)⽤于移除已安装包
    • update_cache # 强制更新yum的cache。
  • 例子:
- name: yum example
  yum: name=nginx state=intalled
  • yum-repository:配置yum源
    • baseurl # 地址
    • mirrorlist # 设置mirrorlist地址
    • description # 描述信息
    • enabled # 是否启⽤该仓库,默认为yes
    • file # 保存此仓库的⽂件,不设置该项的话则默认以name选项中的名称命名,将⾃动以".repo"后缀结尾。
    • gpgcheck # 是否要进⾏gpgcheck
    • name= # 仓库的名称,要保证名称的唯⼀性
    • reposdir # 保存.repo⽂件的⽬录,默认/etc/yum.repos.d/
    • state # repo⽂件的状态,present/absent,默认present
  • 例子:
- name: yum-repository example
  yum-repository: 
    name: epel
    description: EPEL YUM repo
    file: sohu_epel
    baseurl: http://mirrors.sohu.com/fedora-epel/7/$basearch/
    gpgcheck: no
  • service:服务管理模块
    • enabled # 设置服务为开机⾃启动,默认为no
    • name= # 服务名
    • state:
      • 'started’和’stoped’分别启动和停⽌服务,它们是幂等操作,多次启动或停⽌服务的结果是⼀样的,也就是说对于运⾏中的服务不会再执⾏启动操作,同理停⽌也是⼀样。'restarted’总是重启服务
      • reloaded’总是重读配置⽂件,如果服务是未运⾏状态,则’reloaded会启动服务
      • state和enabled两者⾄少要给⼀个
  • 例子:
- name: service example
  service: name=httpd state=started enabled=yes 
  • systemd:管理systemd风格的服务
    • daemon_reload # 在执⾏所有动作之前,先确定是否要reload⼀次。值为yes/no
    • enabled # 是否设置开机⾃启动
    • masked # 是否将此unit做mask(隐藏、掩盖)处理。mask后的unit将⽆法启动
    • name= # 待操作服务名。可以是name,也可以是name.service。
    • state # ‘started’/'stopped’具有幂等性。但restarted和reloaded总是会执⾏。
  • user:用户管理模块(同理group)
    • name= # 要创建、修改、移除的⽤户名
    • password # 设置⽤户密码。此处只能使⽤加密密码作为值
    • system # 设置为yes表⽰创建⼀个系统⽤户,只能⽤于创建,不能⽤于修改已有⽤户为系统⽤户
    • state # 创建⽤户(present)还是删除⽤户(absent)。默认为present
    • createhome # 创建家⽬录,或者已有的⽤户但家⽬录不存在也会创建。设置为no则不创建家⽬录
    • home # 指定要创建的家⽬录路径
    • move_home # 如果设置为yes,则"home="则表⽰将家⽬录移动到此选项指定的路径下
    • uid # 设置⽤户的uid
    • group # 设置⽤户的primary group
    • groups # 将⽤户加⼊到辅助组列表中。如果设置"groups=",则会将此⽤户从所有辅助组中移除
    • shell # 设置⽤户的shell
    • force # 配合’state=absent’时,等价于’userdel --force’,即强制删除⽤户、家⽬录和邮件列表
    • remove # 配合’state=absent’时,等价于’userdel --remove’,即删除家⽬录和邮件列表
    • update_password # user是幂等模块,"always"将总是修改密码。"on_create"将只在创建⽤户时设置密码
  • 例子:
- name: user example
  user: name=bob system=yes shell=/sbin/nologin
  • authorzied_key:添加公钥
    • key= # 公钥路径,可以是本地⽂件,可以是url地址,本地⽂件时使⽤{{ lookup(‘file’, ‘~/.ssh/id_rsa.pub’) }},url使⽤https://github.com/username.keys
    • manage_dir # 是否创建或修改⽬标authorized_keys所在⽬录的所有者和权限。默认为yes;使⽤⾃定义的⽬标路径时,必须设置为no或false
    • path # authorized_keys所在的⽬录,默认为家⽬录下的.ssh⽬录中
    • state # present/absent,是否将密钥添加到⽬标authorized_keys⽂件中
    • user= # 添加到远程哪个⽤户下的authorized_keys⽂件
  • 例子:要想使⽤该模块实现⾮交互,需要在inventory⽂件中指定主机或主机组中加上"ansible_ssh_pass=‘PASSWORD’"参数
[centos6:vars]
ansible_ssh_pass='123456'
但这样不会将主机密钥添加到主控制端的known_hosts⽂件中,因此下次执⾏ansible时会失败。可以在配置⽂件中做如下设置:
host_key_checking = False
或者⼲脆使⽤expect⾮交互更⽅便

- name: authorzied_key example
  authorzied: key=/root/.ssh/.rsa state=present user=root

  • debug:输出信息
  • ⽤于输出⾃定义的信息,类似于echo、print等输出命令。ansible中debug主要⽤于输出变量值、表达式值,以及⽤于when条件判断时。使⽤⽅式⾮常简单。
    • msg # 输出⾃定义信息。如果省略,则输出普通字符
    • var # 指定待调试的变量。只能指定变量,不能指定⾃定义信息,且变量不能加{{}}包围,⽽是直接的变量名
    • verbosity # 控制debug运⾏的调试级别,有效值为⼀个数值N
  • 例子:
- name: debug example
  debug: msg="it's a test" var=ansible_eth0.ipv4.address
可以输出变量值,不过⼀般使⽤到变量的时候都会在playbook中使⽤debug模块,以下是⼀个⽰例:
- name: print any messages
  debug: msg="you name is {{ name }}"
  • cron:模块⽤于设置定时任务,也⽤于管理定时任务中的环境变量
    • backup # (yes/no)如果设置了,则会在修改远程cron_file前备份这些⽂件
    • cron_file # ⾃定义cron_file的⽂件名,使⽤相对路径则表⽰在/etc/cron.d中。必须同时指定user选项
    • user # 指定哪个⽤户的crontab将要被修改,默认为root
    • disabled # 禁⽤crontab中的某个job,要求state=present
    • env # (yes/no)设置⼀个环境变量,将添加在crontab的顶端。使⽤name和value定义变量名和值
    • job # 需要执⾏的命令。如果设置了env,则表⽰环境变量的值,此时job="XXXX"等价于value=“XXXX”;要求state=present
    • minute # 分(0-59, *, /N),不写时,默认为
    • hour # 时(0-23, *, /N),不写时,默认为
    • day # ⽇(1-31, *, /N),不写时,默认为
    • month # ⽉(1-12, *, /N),不写时,默认为
    • weekday # 周(0-6 for Sunday-Saturday, ),不写时,默认为
    • name # 描述crontab任务的字符串。但如果设置的是env,则name为环境变量的名称。要求state=absent;注意,若未设置name,且 state=present,则总会创建⼀个新job条⽬,即使cron_file中已经存在同样的条⽬
    • special_time # 定时任务的别称,⽤于定义何时运⾏job条⽬,有效值有reboot/hourly/daily/weekly/monthly/yearly/annually
    • job或者env的状态是present(默认)还是absent。present⽤于创建,absent⽤于移除
  • 例子:
添加定时任务:
- name: cron example
  cron: 
    name="ntpdate"
    job="/usr/sbin/ntpdate ntp1.aliyun.com"
    cron_file=ntpdate_cron
    user=root
    minute=*/2
移除定时任务:移除⼀个job,要求name必须匹配。如有必要,需要同时指定cron_file和user
- name: delete cron example
  cron: name="ntpdate" state=absent cron_file=ntpdate_cron user=root
  • archive:归档模块(⽤于在远端压缩⽂件。当然,前提是在远端主机上要有对应的压缩⼯具。⽀持zip/gz/tar/bz2。)
    • dest # ⽬标归档⽂件名。除⾮path指定要压缩的是单⽂件,否则需要dest选项
    • format # 指定压缩格式,默认为gz格式
    • group # ⽂件/⽬录的所属组
    • owner # ⽂件/⽬录的所有者
    • mode # 设置⽂件/⽬录的的权限,⽀持’0644’或’u+rwx’或’u=rw,g=r,o=r’等格式
    • path= # 要压缩的⽂件,可以是绝对路径,也可以是glob统配的路径,还可以是⽂件列表
    • remove # 压缩后删除源⽂件
  • 例子:
# 将⽬录/path/to/foo/压缩为/path/to/foo.tgz
- archive:
  path: /path/to/foo
  dest: /path/to/foo.tgz
# 压缩普通⽂件/path/to/foo为/path/to/foo.gz并删除源⽂件,由于压缩的是单⽂件,所以可以省略dest选项
- archive:
  path: /path/to/foo
  remove: True
# 将单⽂件/path/to/foo压缩为zip格式
- archive:
  path: /path/to/foo
  format: zip
# 将给定的⽂件列表压缩为bz2格式,压缩包路径为/path/file.tar.bz2
- archive:
  path:
    - /path/to/foo
    - /path/wong/foo
  dest: /path/file.tar.bz2
  format: bz2
  • unarchive:解包模块
  • 默认复制ansible端的归档⽂件到被控主机,然后在被控主机上进⾏解包。如果设置选项remote_src=yes,则表⽰解包被控主机上的归档⽂件。要求在被控主机上有对应的解包命令。unzip命令⽤于解压".zip"⽂件,gtar(tar包提供)命令⽤于解压".tar"、".tar.gz"、".tar.bz2"和".tar.xz"。
    • creates # 如果指定的⽂件存在则不执⾏该任务。可⽤于实现幂等性
    • dest= # 远程机器上需要被解包的归档⽂件,要求是绝对路径
    • exclude # 列出解包过程中想要忽略的⽬录和⽂件
    • group # ⽂件/⽬录的所属组
    • owner # ⽂件/⽬录的所有者
    • mode # 设置⽂件/⽬录的的权限,⽀持’0644’或’u+rwx’或’u=rw,g=r,o=r’等格式
    • keep_newer # 在解包过程中,如果⽬标路径中和包中有同名⽂件,且⽐包中的⽂件更新,则保留新的⽂件
    • list_files # 设置为true时,将返回归档⽂件中的⽂件列表
    • remote_src # 设置为yes表⽰远程主机上已有⽬标归档⽂件,即不再从本地复制归档⽂件到远端,直接在远端解包。默认为no
    • src= # 如果remote_src=no,将复制本地归档⽂件到远端,可相对路径也可绝对路径.如果remote_src=yes, 将解包远程已存在的归档⽂件,如果remote_src=yes且src中包含了": //",将指挥远程主机从url中下载⽂件并解包
  • 例子:
# 复制ansible端的foo.tgz⽂件到远端并解包
- unarchive:
  src: foo.tgz
  dest: /var/lib/foo
# 直接解包远端已经存在的⽂件- unarchive:
- unarchive:
  src: /tmp/foo.zip
  dest: /usr/local/bin
  remote_src: True
# 从url上下载压缩包,然后进⾏解压
- unarchive:
  src: https://example.com/example.zip
  dest: /usr/local/bin
  remote_src: True
  • get_url:下载模块
    • backup # 下载⽂件时同时创建⼀个名称中包含时间戳的备份⽂件
    • dest=
      • ⽂件保存路径,必须为绝对路径。
      • 如果dest是⼀个⽬录,则使⽤url的base name作为⽂件名
      • 如果dest是⼀个⽬录,则’force’选项不⽣效
      • 如果dest是⼀个⽬录,则总是会下载⽬标⽂件,但只在已存在的⽂件变化了才会替换旧⽂件
    • force 如果设置为yes,且dest不是⼀个⽬录时,则总是会下载⽂件,但只在已存在的⽂件变化了才会替换旧⽂件如果设置为no(默认),则只会在⽬录路径下不存在该⽂件时才会进⾏下载。
    • tmp_dest # 下载时临时存放⽬录,在任务执⾏完成前会删除下载的临时⽂件
    • group # ⽂件/⽬录的所属组
    • owner # ⽂件/⽬录的所有者
    • mode # 设置⽂件/⽬录的的权限,⽀持’0644’或’u+rwx’或’u=rw,g=r,o=r’等格式
    • timeout # 请求url时的超时时间,默认10秒钟
    • url= # 要下载的url路径,(http|https|ftp): //[user[:pass]]@host.domain[:port]/path;还⽀持file格式的路径,实现复制功能。file:///path/to/file
  • 例子:
注意,dest为⽬录或者force=yes时,总是会下载⽂件到临时存放⽬录中,只不过不⼀定会替换旧⽂件。
只有force=no(默认)且dest是⼀个⽂件时,在⽂件已存在时才不会下载⽂件。
# 下载foo.conf,若/etc/foo.conf已存在,则不下载该⽂件
get_url:
  url: http://example.com/path/file.conf
  dest: /etc/foo.conf
  mode: 0440
# 下载foo.conf到/tmp⽬录下,若/tmp/foo.conf已存在则检查⽂件是否相同,不相同则进⾏替换
get_url:
  url: http://example.com/path/file.conf
  dest: /tmp/
# 复制⼀个本地⽂件
get_url:
  url: file:///tmp/afile.txt
  dest: /tmp/afilecopy.txt
  • wait_for :
  • 有些时候任务之间对状态、⽂件、端⼝等资源是有依赖关系的,只有满⾜了前提,任务才会继续。wait_for模块就是⽤于判断任务在满⾜什么条件的情况下会继续。主要⽤来判断端⼝是否开启、⽂件是否存在、⽂件中是否存在某些字符串
    • delay # 在检查操作进⾏之前等待的秒数
    • host # 等待这个主机处于启动状态,默认为127.0.0.1
    • port # 等待这个端⼝已经开放
    • path # 这个⽂件是否已经存在
    • search_regex # 在⽂件中进⾏正则匹配
    • state :
      • present/started/stopped/absent/drained.默认started
      • 当检查的是⼀个端⼝时:
        started:保证端⼝是开放的
        stopped:保证端⼝是关闭的
      • 当检查的是⼀个⽂件时:
        present/started:在检查到⽂件存在才会继续
        absent:检查到⽂件被移除后才会继续
    • sleep # 两次检查之间sleep的秒数,默认1秒
    • timeout # 检查的等待超时时间(秒数,默认300)
  • 例子:
# 连接上主机后10秒后才检查8000端⼝是否处于开放状态,300秒(默认值)内未开放则超时。
- wait_for:
  port: 8000
  delay: 10
# 直到/tmp/foo⽂件存在才会继续
- wait_for:
  path: /tmp/foo
# 直到/tmp/foo⽂件中能匹配"completed"字符串才继续
- wait_for:
  path: /tmp/foo
  search_regex: completed
# 直到/var/lock/file.lock这个锁⽂件被移除了才继续
- wait_for:
  path: /var/lock/file.lock
  state: absent
# 直到/proc/3466/status⽂件被移除才继续,可⽤来判断进程是启动还是停⽌,pid⽂件是存在还是被移除等
- wait_for:
  path: /proc/3466/status
  state: absent
  • script:
  • script模块⽤于控制远程主机执⾏脚本。在执⾏脚本前,ansible会将本地脚本传输到远程主机,然后再执⾏。在执⾏脚本的时候,其采⽤的是远程主机上的shell环境。
    • chdir # 在远程执⾏脚本前先切换到此⽬录下。
    • creates # 当此⽂件存在时,不执⾏脚本。可⽤于实现幂等性
    • removes # 当此⽂件不存在时,不执⾏脚本。可⽤于实现幂等性。
    • free_form= # 本地待执⾏的脚本路径、选项、参数。之所以称为free_form,是因为它是脚本名+选项+参数
  • 例子:
- name: script example
  script: /tmp/a.sh hello
  args:
    creates: /tmp/hello.txt

你可能感兴趣的:(ansible)