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