运维工具的分类:
agent(有客户端):puppet(重量级) func, ...
agentless(无客户端ssh):ansible(轻量级), fabric
1.Ansible简介
Ansible是一个简单的自动化运维工具,可用于自动化部署。可以自动化部署应用,配置等。
2.为什么选择Ansible?
· Ansible完全基于Python开发,方便Ansible二次开发
· 丰富的内置模块
· Ansible去中心化,一次简单的复制即可完成配置中心的迁移
· Ansible无客户端只有主机端
· 底层基于OpenSSH
· 没有额外的软件包消耗系统性能
3.Ansible核心主要组件
Ansible:Ansible的核心程序
Host Lnventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载
Playbooks:YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.
Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。
Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。
Connection Plugins:连接插件,Ansible和Host通信使用
4.Ansible执行过程
5.Ansible目录结构介绍
♥ 配置文件目录: /etc/ansible/
· ansible.cfg:自身配置文件
· hosts:资产清单
♥ 执行文件目录:/usr/bin/
♥ Lib库依赖目录: /usr/lib/pythonX.X/site-packages/ansible/
♥ Help文档目录:/usr/share/doc/ansible-X.X.X/
♥ Man文档目录:/usr/share/man/man1
♥ 插件目录:/usr/share/ansible_plugins
6.工具集
Ansible命令执行的方式有Ad-HOC、Ansible-playbook两种方式
(1)ansible命令
主要运用场景:
- 非固化需求
比如工作共临时查看某个服务器是否存活
ansible一般用三种颜色来表示返回结果:
绿色:所有任务均正常执行
红色:执行过程中有异常,一般会不执行剩下所有的任务
橘黄色:执行过程中没有异常,但是结束后目标有状态的变化
临时一次性操作
二次开发调用接口
(2)ansible-galaxy
GitHub或PIP功能,通过ansible-galaxy命令,我们可以根据下载量和关注量等信息,查找和安装优秀的Role。下载地址为https://galaxy.ansible.com
ansible-galaxy命令分为三大部分:
1)[init|info|install|list|remove|login|import|delete|setup]等
♥ init:初始化本地的Roles配置,以备上传Roles至galaxy
♥ info:列表指定Role详细信息
♥ install:下载并安装galaxy指定的Roles到本地
♥ list:列出本地已下载Roles
♥ remove:删除本地已下载的Roles
2)help用法显示[--help]
eg:
ansible-galaxy init --help
3)参数项[options]
eg:
ansible-galaxy init [options] role_name
(4)ansible-pull
该指令涉及Ansible另外一种工作模式:pull模式 (ansible默认使用push模式)
ansible-pull [options] [playbook.yml]
ansible-pull一般在配置大批量机器的场景下会使用,灵活性稍有欠缺,但是效率性会有所提升
此模式适合以下场景:
①有数据巨大的机器需要配置,即使使用高并发线程依旧要花费很多时间;
②要在刚启动的,没有网络联机的主机上运行ansible;
(5)ansible-doc
ansible-doc是模块文档说明,相当于Linux系统man命令类似
ansible-doc [option] [module...]
eg:
ansible-doc -l #列出支持的模块
ansible-doc ping #ping 模块功能说明
(6)ansible-playbook
工作中使用频率最高的命令,工作机制是:通过读取预先编写好的playbook文件实现批量管理。
要实现的功能和ansible一样。
ansible-playbook命令后面跟yaml格式的playbook文件,执行实现编排好的任务集 eg:
ansible-playbook playbook.yaml
(7) ansible-vault
ansible-vault主要用于配置文件加密,如编写的playbo配置文件中包含敏感信息,不希望其他人
随意查看,ansible-vault可加密/解密这个配置文件
ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help] [options] file-name
eg:
1)设定如下密码,加密a.yml文件
ansible-vault encrypt a.yml
2)解密后正常查看
ansible-vault decrypt a.yaml
(8)ansible-console
ansible-console是Ansible为用户提供的一款交互式工具
一般主要用到的三个是:ansible,ansible-playbook,ansible-doc
7.Ansible Iventory(资产清单)配置及详解
Inventory是Ansible管理主机信息的配置文件,相当于系统的Hosts功能,默认放
在/etc/ansible/hosts里。如果有多个可以用-i指定。
eg:
ansible -i /etc/ansible/inven webs -m ping
如果只有一个Inventory时可不用指定路径,默认读取/etc/ansible/hosts
1) 定义主机和组
· Inventory配置文件遵循INI风格,中括号中的字符为组名
· 支持将一个主机同时归并到多个不同的组中
· 若目标主机使用了非默认的SSH端口,还可以使用冒号加端口来标明,默认端口是22
· 可以直接使用IP地址
· 支持hostname
eg:
[webserver]
10.10.10.1
10.10.10.1:2222
ymd
ymd:2222
连续主机也可以用数字或字母表示:
web[1:10] 相当于web1,web2...web10
db-[a-c] 相当于db-a,db-b.db-c
2) Iventory参数列表
- ansible_ssh_host:
将要连接的远程主机名.与你想要设定的主机的
别名不同的话,可通过此变量设置.
- ansible_ssh_port:
ssh端口号如果不是默认的端口号,通过此变量设置.
- ansible_ssh_user :
默认的 ssh 用户名 root
- ansible_ssh_pass:
ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
- ansible_sudo_pass:
sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
- ansible_connection:
与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用
paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方
式是否可行
- ansible_ssh_private_key_file ssh :
使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
- ansible_shell_type :
目标系统的shell类型.默认情况下,命令的执行使
用 'sh' 语法,可设置为 'csh' 或 'fish'.
- ansible_python_interpreter :
目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不
是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的 Python.我们
不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名
不可为 python以外的名字(实际有可能名为python26). 与 ansible_python_interpreter 的工
作方式相同,可设定如 ruby 或 perl 的路径...
3) Ansible与正则
(1)all(全量)匹配
匹配所有主机,all护着*(星号)功能相同,但星号需引起来
eg:
ansible all -m ping
ansible "*" -m ping
检查10.10.10.1/24网段所有主机存活状况
ansible 192.168.1.* -m ping
(2)逻辑或(or)匹配
如果我们希望对多个主机或者多个组同时执行,相互之间用“:”(冒号)
eg:
ansible "web1:web2" -m ping
(3)逻辑非(!)匹配
主要针对多重条件的匹配原则
eg:
webserver:!staging
//所有在webserver组里面而不再staging组里面
(4)逻辑与(&)匹配
eg:
webserver:&staging
//webserver和staging组里面共同的主机
(5)模糊匹配
*通配符表示0或者多个字符
eg:
*.com
(6)域切割
[webservers]
cobweb
webbing
weber
这相当于一个数组:
webservers=[cobweb,webbing,weber]
可以用数组下表获取对应的变量值:
webservers[0] //cobweb
webservers[0:1] //cobweb,webbing
(7)支持正则匹配
8.ansible命令介绍:
Ansible [option] Options:
-a MODULE_ARGS, --args=MODULE_ARGS 模块的参数,如果执行默认COMMAND模块,即是命令参数,如:“date”,"pwd"等等
-k, --ask-pass 登录密码,提示输入SSH密码而不是假设基于密钥的验证
--ask-su-pass su切换密码
-K, --ask-sudo-pass 提示密码使用sudo,sudo表示提权操作
--ask-vault-pass vault密码
-B SECONDS, --background=SECONDS 后台运行超时时间
-C, --check 只是测试一下会改变什么内容,不会真正去执行
-c CONNECTION, --connection=CONNECTION 连接类型使用。可能的选项是paramiko(SSH),SSH和地方。当地主要是用于crontab或启动。
-f FORKS, --forks=FORKS 并行任务数。NUM被指定为一个整数,默认是5
-h, --help 打开帮助文档API
-i INVENTORY, --inventory-file=INVENTORY 指定库存主机 文件的路径,默认为/etc/ansible/hosts
-l SUBSET, --limit=SUBSET 进一步限制所选主机/组模式 --limit=192.168.91.135 只对这个ip执行
--list-hosts 列出符合条件的主机列表
-m MODULE_NAME, --module-name=MODULE_NAME 执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
-M MODULE_PATH, --module-path=MODULE_PATH 要执行的模块的路径,默认为/usr/share/ansible/
-o, --one-line 标准输出至一行
-P POLL_INTERVAL, --poll=POLL_INTERVAL 定期返回后台进度
--private-key=PRIVATE_KEY_FILE 私钥路径,使用这个文件来验证连接
-S, --su run operations with su 用 su 命令
-R SU_USER, --su-user=SU_USER 指定SU的用户,默认是root用户
-s, --sudo 相当于Linux系统下的sudo命令
-U SUDO_USER sudo到哪个用户,默认为 root
-T TIMEOUT, --timeout=TIMEOUT 指定SSH默认超时时间, 默认是10S
-t TREE, --tree=TREE 将日志内容保存在该输出目录,结果保存在一个文件中在每台主机上。
-u REMOTE_USER, --user=REMOTE_USER 远程用户, 默认是root用户
--vault-password-file=VAULT_PASSWORD_FILE
-v, --verbose 详细信息
--version 输出ansible的版本
9.Ansible常用模块
(1)ping:探测目标主机是否存活;
eg:
# ansible hosts -m ping
(2)command:在远程主机执行命令;不支持|管道命令
相关选项:
creates:一个文件名,当该文件存在,则该命令不执行
free_form:要执行的linux指令
chdir:在执行指令之前,先切换到该目录
removes:一个文件名,当该文件不存在,则该选项不执行
executable:切换shell来执行指令,该执行路径必须是一个绝对路径
eg:
- name: test
command: /usr/bin/make_database.sh arg1 arg2
args:
chdir: somedir/
creates: /path/to/database
(3)shell:在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等 ;
注意:command和shell模块的核心参数直接为命令本身;而其它模块的参数通常为“key=value”格式;
eg:
---
- hosts: node1
gather_facts: flase #(gather_facts获取节点的信息)
tasks:
- name: "hello world"
shell: echo "hello world" `date` by `hostname` > /tmp/hello.log
(4)copy:复制本地文件到远程或者远程到远程主机,此时的远程主机为一个,可以改权限等
用法:
(1) 复制文件
-a "src= dest= "
(2) 给定内容生成文件
-a "content= dest= "
相关选项如下:
backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no content:用于替代“src”,可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode:递归设定目录的权限,默认为系统默认权限 force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为
yes others:所有的file模块里的选项都可以在这里使用
src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
(5)file :设置文件属性。
用法:
(1) 创建目录:
-a "path=。。。 state=directory"
(2) 创建链接文件:
-a "path=。。。 src=... state=link"
(3) 删除文件:
-a "path=。。。 state=absent"
相关选项如下:
force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效
src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
(6)fetch:从远程某一个主机获取文件到本地
Dest: 用来存放文件的目录
Fail_on_missing:当源文件不存在的时候,标识为失败
Flat:允许覆盖默认行为从hostname/path到/file,如果 dest以/结尾,它将使用源文件的基础名称
Src:在远程拉去的文件,并且必须是一个file,不能是目录
Validate_checksum:当文件fetch之后进行md5检查
注意:在拉取的时候,必须是文件,不能拉取文件夹
(7)raw:类似于shell,推荐优先使用raw
(8)cron: 管理cron计划任务
- a "": 设置管理节点生成定时任务
action:
cron backup= #如果设置,创建一个crontab备份
cron_file= #如果指定, 使用这个文件cron.d,而不是单个用户crontab day= #日应该运行的工作( 1-31, *, */2, etc ) hour= # 小时 ( 0-23, *, */2, etc )
job= #指明运行的命令是什么
minute= #分钟( 0-59, *, */2, etc )
month= #月( 1-12, *, */2, etc )
name= #定时任务描述
reboot #任务在重启时运行,不建议使用,建议使用special_time special_time # 特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
state #指定状态,prsent表示添加定时任务,也是默认设置,absent表示删除定时任务
user #以哪个用户的身份执行 weekday # 周 ( 0-6 for Sunday-Saturday, *, etc )
(9)yum:yum安装软件,也有apt,zypper
conf_file #设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。
disable_gpg_check#是否禁止GPG checking,只用于`present' or `latest'。
disablerepo #临时禁止使用yum库。只用于安装或更新时。
enablerepo #临时使用的yum库。只用于安装或更新时。
name= #所安装的包的名称
state #present安装, latest安装最新的, absent 卸载软件。
update_cache #强制更新yum的缓存。
(10)service: 服务程序管理
arguments #命令行提供额外的参数
enabled #设置开机启动。
name= #服务名称
runlevel #开机启动的级别,一般不用指定。
sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。
state #started启动服务, stopped停止服务, restarted重启服务, reloaded重载配置
(11)group: 组管理
[root@node1 ~]# ansible-doc -s group
- name: 添加或删除组
action: group
gid # 设置组的GID号
name= # 管理组的名称
state # 指定组状态,默认为创建,设置值为absent为删除
system # 设置值为yes,表示为创建系统组
(11)User:用户管理
-a ""
action: user
comment # 用户的描述信息
createhom # 是否创建家目录
force # 在使用`state=absent'是, 行为与`userdel --force'一致.
group # 指定基本组
groups # 指定附加组,如果指定为('groups=')表示删除所有组
home # 指定用户家目录
login_class #可以设置用户的登录类 FreeBSD, OpenBSD and NetBSD系统.
move_home # 如果设置为`home='时, 试图将用户主目录移动到指定的目录
name= # 指定用户名
non_unique # 该选项允许改变非唯一的用户ID值
password # 指定用户密码
remove # 在使用 `state=absent'时, 行为是与 `userdel --remove'一致.
shell # 指定默认shell
state #设置帐号状态,不指定为创建,指定值为absent表示删除
system # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户。
uid #指定用户的uid
update_password # 更新用户密码
expires #指明密码的过期时间
10、playbook
1.基本YAML语法
1)文件必须以yaml或者yml结尾
2) “- - -”(3个减号)是文件的开始行,表明一个文件的开始;“...”表示一个文件的结束
3)#号代表注释
4)缩进代表层级关系,缩进必须统一,不能空格和Tab混用
5)缩进级别一致必须左对齐
6)大小写敏感
7)元素用键值(k/v)方式写,使用“:”冒号分割,冒号后空一格,再写值
8)一个完整的代码块功能最少元素须包括name和task
9)每个“:”和“-”后边都需要跟一个空格
10)一个name只能包含一个task
2.playbook 组成结构
-
hosts:执行这个剧本的主机或者主机组
tasks:任务 即调用模块完成的某操作
- name:简述任务的功能 moudule:option Vars:变量 Templates:模板 根据客户端的情况来生成一些的数据 Handlers:处理器 由某条件满足能触发执行的操作
Roles:角色
(1)playbook中的每一个play的目的都是为了让某个或者某些主机以某个指定的用户身份来执行任务
如下面所示
- hosts: webnodes
remote_user: root
hosts: 是用于指定要执行的指定任务的主机,其可以是一个或者多个以冒号分割的主机组,
remote_users:则用于指定远程主机上的执行任务的用户
不过 remote_users 也可以用于每个task中,也可以通过指定其通过sudo的方式在远程的主机上执行任务,其可以于play全局或者某任务中,此外,甚至可以在sudo时使用sudo_user 指定sudo时切换的用户
- hosts: webnodes
remote_user: bds
tasks:
- name: test connection
ping:
remote_user: bds
sudo: yes
(2)任务列表和action
play的主体部分是task list
task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任
务后在开始第二个任务,在运行自上而下某个playbook时,如果中途发生错误,所有已经执行的任务都会讲回滚,因此,在更正playbook后重新执行一次即可
task目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行是具有幂等性的,这意味着多次执行是安全的,因为其结构均一致
每个task都应该有其name ,用于playbook执行结果输出,建议其内容尽可能清晰地描述任务执行步骤,如果未提供name,则action的结果将用于输出
定义task的可以使用“action: module option”或者module: options
推荐使用后者以实现向后兼容,如果action 一行的内容过多,也可以使用在行首使用几个空白字符进行换行。
tasks:
- name: make sure apache is running
service: name=httpd state=running
在众多模块中,只用command和shell模块仅需要给定一个列表而无需使用“key=value”格式例如
tasks:
- name: disable selinux
shell: /sbin/setenforce 0
(3)执行playbook
ansible-playbook命令来执行剧本
1)- -limit:我们可以通过"-hosts:"字段来指定哪些主机将会应用Playbook操作,也可以直接用ansible-playbook执行
eg:
ansible-playbook palybook.yaml --limit node1
2)--list-hosts:被执行的主机
eg:
ansible-playbook palybook.yaml --limit-hosts
3)用户权限设置
(1)--remote-user
如果在playbook中,hosts字段下面没有定义users关键字,那么Ansible将使用Inventory文件中定义的用户,如果Inventory也没有定义用户,Ansible将默认使用系统用户身份来通过SSH连接远程主机。我们也可以在playbook中使用--remote-user选项指定用户。
(2)--ask=sudo-pass
为了保证可以传递sudo密码到远程主机,可以用此选项来交互式的输入密码
(3)--sudo
使用--sudo选项,可以强制所有play都使用sudo用户,同时使用--sudo-user选项指定sudo可以执行哪个用户的权限,如果不指定,则默认以root身份运行
eg:
ansible-playbook playbook,yaml --sudo --sudo-user=ymd --ask-sudo-pass
执行过程中,会要求用户输入ymd密码
4)--syntax-check
检测playbook语法
5)--forks=NUM(-f NUM)
指定迸发时的任务数
6)-verbose(v)
显示详细输出,-vvv更详细输出
7)--connection=type (-c TYPE)
指定连接远程主机的连接方式,默认是SSH,设为local时,则在本地执行playbook,建议不做修改
8)inventory=PATH (-i PATH)
指定inventory文件,默认文件是/etc/ansible/hosts
9)--start-at-task="task_name"
运行某个特定的task
10)--check
检测执行,并不是真正执行
3.playbook条件和循环
条件判断使用when,循环使用with_items 1)条件判断 需要开启gather_facts功能,默认开启
eg:
---
- hosts: node1,node2
gather_facts: yes
tasks:
- name: "RedHat"
shell: echo "RedHat" `date` by `hostname` >> /tmp/hello.log
when: ansible_os_family == "RedHat"
- name: "other linux"
shell: echo "Not RedHat" `date` by `hostname` >> /tmp/hello.log
when: ansible_os_family == "RedHat"
2)标准循环
- hosts: node1,node2
tasks:
- name: "with_items"
shell: echo {{item}} `date` by `hostname` >> /tmp/hello.log
with_items:
- item1
- item2
- item3
4.playbook中使用变量
1)将变量定义在inventory文件(默认为/etc/ansible/hosts)
eg:定义一个linux_os变量
---
#针对单个主机定义变量
10.10.10.1 linux_os=RedHat
[test]
10.10.10.1
#组定义变量
[test:vars]
linux_os=centos
注意:
①组定义变量的作用范围是租下的所有主机
②当两种定义方式同时存在时,ansible会优先采用单个主机定义的变量值
# cat test.yaml
---
- hosts:
remote_user: root
tasks:
- name: debug
debug: msg="The {{ iventory_hostname }} Value is {{ keyvalue }}"
2)通过ansible-playbook命令行转入
ansible-playbook test.yaml -e "linux_os=RedHat"
3)直接在yaml文件中使用vars字段定义
eg:
# cat test.yaml
---
- hosts: test
vars:
linux_os: playbook
tasks:
- name: debug
debug: msg="The {{ iventory_hostname }} Value is {{ keyvalue }}"
4)通过host_var和group_vars目录来定义变量
在/etc/ansible目录文件下创建host_vars和group_vars两个目录用来存放定义变量的文件。
①针对单机定义的变量
cat host_vars/10.10.10.1
---
linux_os: 10.10.10.1@host_vars
②针对test组变量
cat group_vars/test
---
linux_os: test@group_vars
ansible变量使用的优先级:
ansible-playbook命令直接传入变量
yaml文件定义vars关键字
host_vars下定义变量
inventory中定义主机变量
group_vars下定义变量
inventory中组定义变量
5)在yaml文件中使用vars_files字段定义
eg:
# cat test.yaml
---
- hosts: test
vars_files:
- vars.yaml #定义变量的文件
tasks:
- name: debug
debug: msg="The {{ iventory_hostname }} Value is {{ keyvalue }}"
6)使用register传递变量 register用于在task之间传递变量
cat register.yaml
---
- hosts: test
tasks:
- name: register test
shell: hostname
register: info
- name: display info
debug: msg="Hostname is {{ info }}"
register定义的info变量在第二个task中用来查看第一个task中执行的hostname命令的结果
如果只想看到stdout部分信息,可以通过info['stdout']来引用
cat register.yaml
---
- hosts: test
tasks:
- name: register test
shell: hostname
register: info
- name: display info
debug: msg="Hostname is {{ info['stdout'] }}"
7)使用vars_prompt交互式传入变量 在playbook中定义vars_prompt变量名和交互式提示信息,就可以实现在运行playbook时,通过交互的传入变量值。
cat prompt.yaml
---
- hosts: test
vars_prompt:
- name: "var1"
prompt: "input value for var1"
private: no
- name: "var2"
prompt: "input value for var2"
private: yes
default: 'test vars'
tasks:
- name: display var1
debug: msg="The value of var1 is {{ var1 }}"
- name: display var2
debug: msg="The value of var1 is {{ var2 }}"
5.handle触发之后才可执行
# cat handler.yaml
- hosts: 10.10.10.1
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=present
- name: installl configure file
notify: restart httpd service
template: src=nginx.conf.j2 dest=/etc/nginx/conf/nginx.conf
- name:start nginx service
service: name=nginx state=started
handlers:
- name: restart nginx service
service: name=nginx state=restarted
某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;
6.运行playbook
1)从制定的任务开始执行playbook,使用“--start-at”选项:
ansible-playbook playbook.yaml --start-at="install packages"
上面的命令就会从名字为“install packages”的任务开始执行你的playbook
2)分步运行playbook --step选项来交互式的执行playbook:
ansible-playbook playbook.yaml --step
(y/n/c):
y:会执行该任务
n:回答会跳过该任务
c:回答会继续执行剩余的所有任务而不再询问你
拷贝远程主机文件到FTP主机
# cat lftp.yaml
- hosts: YMD_ZONE
tasks:
- name: Tansfer file to 10ftp
raw: lftp -c "open -u ftpuser,ftpuser ftp://10.10.10.1;mkdir {{ ansible_date_time.date }};cd {{ ansible_date_time.date }};mkdir {{ ansible_hostname }};cd {{ ansible_hostname }};put /root/app/testfile/test.dat"
角色(roles):
角色集合:
roles/
mysql/
httpd/
nginx/
memcached/
每个角色,以特定的层级目录结构进行组织:
mysql/
files/ :存放由copy或script模块等调用的文件;
templates/:template模块查找所需要模板文件的目录;
tasks/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
vars/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
meta/:至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要在此文件中通过include进行包含;
default/:设定默认变量时使用此目录中的main.yml文件;
在playbook调用角色方法1:
- hosts: websrvs
remote_user: root
roles:
- mysql
- memcached
- nginx
在playbook调用角色方法2:传递变量给角色
- hosts:
remote_user:
roles:
- { role: nginx, username: nginx }
键role用于指定角色名称;后续的k/v用于传递变量给角色;
还可以基于条件测试实现角色调用;
roles:
- { role: nginx, when: "ansible_distribution_major_version == '7' " }
ansible-vcs:
https://github.com/andrewrothstein/ansible-vcs \