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 例子: ]
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=
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 # 压缩后删除源⽂件 例子:
- archive:
path: /path/to/foo
dest: /path/to/foo.tgz
- archive:
path: /path/to/foo
remove: True
- archive:
path: /path/to/foo
format: zip
- 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中下载⽂件并解包 例子:
- unarchive:
src: foo.tgz
dest: /var/lib/foo
- unarchive:
src: /tmp/foo.zip
dest: /usr/local/bin
remote_src: True
- 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是⼀个⽂件时,在⽂件已存在时才不会下载⽂件。
get_url:
url: http://example.com/path/file.conf
dest: /etc/foo.conf
mode: 0440
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) 例子:
- wait_for:
port: 8000
delay: 10
- wait_for:
path: /tmp/foo
- wait_for:
path: /tmp/foo
search_regex: completed
- wait_for:
path: /var/lock/file.lock
state: absent
- 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