目录
一、Ansible介绍
1.1 功能
-
批量执行远程命令,可以对远程的多台主机同时进行命令的执行
-
批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务
-
编排高级的企业级复杂的IT架构任务, Ansible的Playbook和role可以轻松实现大型的IT复杂架构
-
提供自动化运维工具的开发API, 有很多运维工具,如jumpserver(堡垒机)就是基于 ansible 实现自动化管理功能
1.2 特性
-
模块化:调用特定的模块完成特定任务,支持自定义模块,可使用任何编程语言写模块(账号,软件等)
-
Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块
-
基于Python语言实现
-
部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖PKI(无需ssl)
-
安全,基于OpenSSH
-
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对
-
支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构 剧本演员要按照 系统按照你规定的方式去执行命令
-
较强大的多层解决方案 role(用于解决大型项目,分层处理)
二、Ansible安装
2.1 yum安装
yum install epel-release.noarch -y
yum install ansible -y
2.2 编译安装
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
wget https://releases.ansible.com/ansible/ansible-1.5.4.tar.gz
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
2.3 相关文件
-
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文件 不用修改
-
/etc/ansible/hosts 主机清单, 放 了被管理主机列表
-
/etc/ansible/roles/ 存放角色的目录
三、 Ansible配置和工具
3.1 主配置文件
Ansible 的配置文件可以放在多个不同地方,优先级从高到低顺序如下
./ansible.cfg #当前目录下的ansible.cfg
~/.ansible.cfg #当前用户家目录下的.ansible.cfg
/etc/ansible/ansible.cfg #系统默认配置文件
3.2 inventory主机清单文件
ansible主要用于批量操作主机
默认的inventory file位置在:/etc/ansible/hosts
参数详细说明
ansible_ssh_host
#将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port
#ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用 ip:端口
192.168.1.100:2222
ansible_ssh_user
#默认的 ssh 用户名
ansible_ssh_pass
#ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass
#sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8)
#sudo 命令路径(适用于1.8及以上版本)
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 的路径....
[web]
192.168.91.101:666
#可以指定ssh端口非默认的端口
192.168.91.102
[server]
192.168.91.[100:105]
#指定连续的主机
[ky15]
node[1:5]
#指定连续的主机
[server:ky15]
server
ky15
#可以嵌套组
[local]
192.168.91.100 ansible_connection=local
#指定本地连接,无需ssh配置
#ansible_connection=ssh 需要StrictHostKeyChecking no
192.168.91.103 ansible_connection=ssh ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_password=123123
10.0.0.6 ansible_connection=ssh ansible_ssh_user=root ansible_ssh_password=123123
还可以指定用户身份 端口号 和密码
#执行ansible命令时显示别名,如web01
[websrvs]
node2
node3
[websrvs]
ansible_ssh_password=123123
3.3 ansible工具
-
/usr/bin/ansible 主程序,临时命令执行工具
-
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man ansible-doc -l |grep 关键字 具体模块名字
-
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
-
/usr/bin/ansible-pull 远程执行命令的工具
-
/usr/bin/ansible-vault 文件加密工具
-
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具
-
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
3.4 ansible命令
ansible <host> [-m module_name] [-a args]
命令 主机组 指定模块,默认cmd 执行的任务
选项
--version #显示版本
-m module #指定模块,默认为command
-v #详细过程 -vv -vvv更详细
--list-hosts #显示主机列表,可简写 --list
-C, --check #检查,并不执行
-T, --timeout=TIMEOUT #执行命令的超时时间,默认10s
-k, --ask-pass #提示输入ssh连接密码,默认Key验证
-u, --user=REMOTE_USER #执行远程执行的用户,默认root
-b, --become #代替旧版的sudo 切换
--become-user=USERNAME #指定sudo的runas用户,默认为root vim /etc/sudoers 用户权限
-K, --ask-become-pass #提示输入sudo时的口令
-f FORKS, --forks FORKS #指定并发同时执行ansible任务的主机数
##支持通配符
ansible all -m ping
ansible "*" -m ping
ansible 192.168.91.* -m ping
ansible "srvs" -m ping
ansible "192.168.91.101 192.168.91.102" -m ping
#或关系
[root@node1 ~]#ansible 'web:accp' --list-hosts
hosts (4):
192.168.91.101
192.168.91.102
192.168.91.103
192.168.91.105
#并且关系
[root@node1 ~]#ansible "web:&accp" --list-hosts
[WARNING]: No hosts matched, nothing to do
hosts (0):
#逻辑非
[root@node1 ~]#ansible 'web:!accp' --list-hosts
hosts (2):
192.168.91.101
192.168.91.102
#正则表达式
ansible "websrvs:dbsrvs" -m ping
ansible "~(k|a).*" -m ping
[root@node1 ~]#ansible "~(k|a).*" -m ping
################例子###
ansible 'kube*:etcd:!10.0.0.101' -a reboot && reboot
##并行执行
-f
[root@node1 ~]#ansible all -a "sleep 3" -f1
[root@node1 ~]#ansible all -a "sleep 3" -f4
3.5 ansible执行过程
1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
2. 加载自己对应的模块文件,如:command
3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4. 给文件+x执行
5. 执行并返回结果
6. 删除临时py文件,退出
四、Ansible模块
4.1 command模块
功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项
注意:此命令不支持 $VARNAME < > | ; & 等,可以用shell模块实现 shell 模块是加强版的 命令模块
注意:此模块不具有幂等性
例子
ansible web -a "ls /opt/ky15.txt"
192.168.91.102 | CHANGED | rc=0 >>
/opt/ky15.txt
192.168.91.101 | CHANGED | rc=0 >>
/opt/ky15.txt
4.2 shell模块
功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, >
注意:此模块不具有幂等性
shell模块更适合做默认模块
修改方式如下:
vim /etc/ansible/ansible.cfg 113 # default module name for /usr/bin/ansible 114 module_name = shell (原为command)
ansible web -a "echo $PATH"
192.168.91.102 | CHANGED | rc=0 >>
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
192.168.91.101 | CHANGED | rc=0 >>
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#若不指定文件位置,默认会在家目录下生成
4.3 script模块
功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)
注意:此模块不具有幂等性
范例:
vim test.sh
#!/bin/bash
hostname
ansible web -m script -a '/root/test.sh'
4.4 copy模块
功能:从ansible服务器主控端复制文件到远程主机
注意: src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件
关键字:
src 代表源文件路径
dest 代表文件落地路径
owner 属主
group 属组
mode 代表权限
backup 如果复制时有同名文件会先备份再复制(源文件要有变动才会有备份)
content 自定义的内容,在客机上创建该内容的文件
ansible web -m copy -a "src=/etc/passwd dest=/opt/1.txt mode=644 owner=zhangsan group=zhangsan"
ansible web -m copy -a "content='this is centos7' dest=/opt/test.txt"
注意!
加/ 复制加改名
不加/ 连etc一起复制etc 不加 / 连etc 一起复制, etc会变成子目录
etc 加 / 只复制etc下的文件 把etc文件夹改名成 backup
4.5 get_url模块
功能: 用于将文件从http、https或ftp下载到被管理机节点上
常用参数如下:
-
dest:指明下载文件的存放目录
-
url :指明下载路径
ansible web -m get_url -a "url=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/opt/"
4.6 fetch模块
功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
范例:
ansible web -m fetch -a 'src=/etc/passwd dest=/mnt'
4.7 file模块
功能:设置文件属性,创建软链接等
path 指定文件路径
state 文件状态 有:新建(touch) 删除(absent) 文件夹(directory) 连接文件(link)等
src 源文件 建立连接文件时 使用
mode 权限
owner 属主
group 属组
recurse 递归 修改属性时有效
ansible web -m file -a 'path=/mnt/web.txt state=touch owner=zhangsan group=zhangsan mode=755'
#创建空文件
ansible web -m file -a 'path=/mnt/web state=directory'
#新建目录
ansible web -m file -a 'src=/mnt/web path=/opt/web-link state=link'
#新建软连接 path|dest|name 这三个选项都可以使用
ansible web -m file -a 'path=/opt/web-link state=absent'
#删除文件
ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql"
ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql recurse=yes"
#递归修改目录及子目录的属性
4.8 stat模块
功能:检查文件或文件系统的状态
注意:对于Windows目标,请改用win_stat模块
选项:path:文件/对象的完整路径(必须)
常用的返回值判断:
exists: 判断是否存在
isuid: 调用用户的ID与所有者ID是否匹配
ansible web -m stat -a 'path=/mnt/test.txt'
#查看是否存在
192.168.91.102 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/opt/mysql",
"secontext": "unconfined_u:object_r:usr_t:s0",
"size": 18,
"state": "directory",
"uid": 0
}
4.9 unarchive模块
功能:解包解压缩
实现有两种用法:
1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes,此为默认值
2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
常见参数:
copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件
remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上
src:源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压缩后的文件权限
ansible web -m get_url -a 'url=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/data copy=yes'
ansible web -m unarchive -a 'src=/data/nginx-1.18.0.tar.gz dest=/mnt'
web
192.168.91.101
192.168.91.102
ansible web -m unarchive -a 'src=/data/ky.tar.bz2 dest=/mnt copy=yes'
#把本机的 压缩 加压到远程主机
ansible websrvs -m unarchive -a 'src=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/usr/local/src/ copy=no'
# copy=no 代表压缩文件不是去本机上查找 去远端服务器查找
4.10 archive模块
功能:打包压缩保存在被管理节点
对远端机器 进行 压缩
ansible web -m archive -a "path=/var/log/ dest=/data/log.tar.bz2 format=bz2"
4.11 cron模块
功能:计划任务
支持时间:minute , hour , day , month , weekday
关键字:name(生成一行注释)、job(执行的命令)
ansible web -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup mysql" job=/root/mysql_backup.sh'
crontab -l 查看
删除任务
ansible websrvs -m cron -a "name='backup mysql' state=absent"
4.12 yum和apt模块
功能:yum 管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本apt 模块管理 Debian 相关版本的软件包
name 所安装的包的名称
state present--->安装, latest--->安装最新的, absent---> 卸载软件。
update_cache 强制更新yum的缓存
conf_file 指定远程yum安装时所依赖的配置文件(安装本地已有的包)。
disable_pgp_check 是否禁止GPG checking,只用于presentor latest。
disablerepo 临时禁止使用yum库。 只用于安装或更新时。
enablerepo 临时使用的yum库。只用于安装或更新时
ansible web -m yum -a "name=httpd state=present"
ansible web -m yum -a 'name=nginx state=present enablerepo=epel'
ansible web -m yum -a "name=httpd state=absent"
4.13 yum_repository模块
功能:建立yum仓库模块
name参数: 必须参数,用于指定要操作的唯一的仓库ID,也就是”.repo”配置文件中每个仓库对应的”中括号”内的仓库ID。
baseurl参数: 此参数用于设置 yum 仓库的 baseurl。
description参数: 此参数用于设置仓库的注释信息,也就是”.repo”配置文件中每个仓库对应的”name字段”对应的内容。
file参数: 此参数用于设置仓库的配置文件名称,即设置”.repo”配置文件的文件名前缀,在不使用此参数的情况下,默认以 name 参数的仓库ID作 为”.repo”配置文件的文件名前缀,同一个”.repo” 配置文件中 可以存在多个 yum 源。
enabled参数: 此参数用于设置是否激活对应的 yum 源,此参数默认值为 yes,表示启用对应的 yum 源,设置为 no 表示不启用对应的 yum 源。
gpgcheck参数: 此参数用于设置是否开启 rpm 包验证功能,默认值为 no,表示不启用包验证,设置为 yes 表示开启包验证功能。
gpgcakey参数: 当 gpgcheck 参数设置为 yes 时,需要使用此参数指定验证包所需的公钥。
state参数: 默认值为 present,当值设置为 absent 时,表示删除对应的 yum 源。
新建
ansible web -m yum_repository -a 'name=epel description=epel baseurl=https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ gpgcheck=no file=epel'
删除
ansible web -m yum_repository -a 'name=epel description=epel baseurl=https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ gpgcheck=no file=epel state=absent'
4.14 service模块
功能:管理服务
name参数: 此参数用于指定需要操作的服务名称,比如 nginx。
state参数: 此参数用于指定服务的状态,比如,我们想要启动远程主机中的 nginx,则可以将 state 的值设置为 started;如果想要停止远程主机中的服 务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted、reloaded。
enabled参数: 此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。
ansible web -m yum -a 'name=httpd state=present'
ansible web -m service -a 'name=httpd state=started enabled=yes'
ansible all -m service -a 'name=httpd state=started enabled=yes'
ansible all -m service -a 'name=httpd state=stopped'
ansible all -m service -a 'name=httpd state=reloaded'
ansible all -m shell -a "sed -i 's/^Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf"
ansible all -m service -a 'name=httpd state=restarted'
ansible 192.168.91.101 -m service -a 'name=httpd state=started enabled=yes'
4.15 user模块
功能:管理用户
comment 用户的描述信息
createhome 是否创建家目录
force 在使用state=absent时, 行为与userdel –force一致.
group 指定基本组
groups 指定附加组,如果指定为(groups=)表示删除所有组
home 指定用户家目录
move_home 如果设置为home=时, 试图将用户主目录移动到指定的目录
name 指定用户名
non_unique 该选项允许改变非唯一的用户ID值
password 指定用户密码,使用 SHA512 hash
remove 在使用state=absent时, 行为是与userdel –remove一致
shell 指定默认shell
state 设置帐号状态,不指定为创建,指定值为absent表示删除
system 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid 指定用户的uid
update_ password
always 如果password参数设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码,默认值即为always
on_create 如果password参数设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码字符串,保持之前的密码设定
#创建用户
ansible all -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
ansible web -m user -a 'name=user3 createhome=no group=root system=yes shell=/bin/nologin'
#删除用户
ansible all -m user -a 'name=user1 state=absent‘
五、Playbook
由于playbook用到yaml文件,该文件对格式要求非常严格,所以建议为文本编辑器添加:
vim ~/.vimrc
set aiset ts=2
5.1 playbook介绍
-
playbook 剧本是由一个或多个"play"组成的列表
-
play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的任务角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
-
Playbook 文件是采用YAML语言编写的
5.2 playbook核心组件
一个playbook 中由多个组件组成,其中所用到的常见组件类型如下:
-
Hosts 执行的远程主机列表
-
Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括 name 和 task,一个name只能包括一个task
-
Variables 内置变量或自定义变量在playbook中调用
-
Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
-
Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
-
tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
playbook书写格式:
vim test.yaml
--- - host: web tasks: - name: 这里是注释,可以随便写 service: name=httpd state=started - name: shell shell: make install args: chdir: /opt/httpd-1.18.0 - name: yum_install yum: name=nginx state=present - name: useradd user: name=test uid=2000 shell=/sbin/nologin system=yes create_home=no tags: useradd - name: copysth copy: src=/etc/passwd dest=/opt/1.txt notify: - restart nginx handlers: - name: restart nginx service: name=nginx state=restarted
ansible-playbook test.yaml
ansible-playbook -t useradd test.yaml 只执行test.yaml中标签名为useradd的任务
Handlers notify介绍
Handlers本质是task list ,类似于MySQL中的触发器触发的行为,其中的task与前述的task并没有本质上的不同,主要用于当关注的资源发生变化时,才会采取一定的操作。而Notify对应的action可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作
注意:
如果多个task通知了相同的handlers, 此handlers仅会在所有tasks结束后运行一 次。
只有notify对应的task发生改变了才会通知handlers, 没有改变则不会触发handlers
handlers 是在所有前面的tasks都成功执行才会执行,如果前面任何一个task失败,会导致handler跳过执行,可以使用force_handlers: yes 强制执行handler
5.3 playbook中使用变量
变量名:仅能由字母、数字和下划线组成,且只能以字母开头
变量定义:
variable=value
例子
http_port=80
变量调用方式:
通过{{ variable_name }} 调用变量,且变量名前后建议加空格,有时用"{{ variable_name }}"才生效
变量来源:
-
ansible 的 setup facts 远程主机的所有变量都可直接调用
-
通过命令行指定变量,优先级最高
ansible-playbook -e varname=value test.yml
5.3.1 使用setup模块中变量
本模块自动在playbook调用,不要用ansible命令调用,生成的系统状态信息, 并存放在facts变量中
facts 包括的信息很多,如: 主机名,IP,CPU,内存,网卡等
facts 变量的实际使用场景案例
-
通过facts变量获取被控端CPU的个数信息,从而生成不同的Nginx配置文件
-
通过facts变量获取被控端内存大小信息,从而生成不同的memcached的配置文件
-
通过facts变量获取被控端主机名称信息,从而生成不同的Zabbix配置文件
案例:使用setup变量
-
查看所有变量
ansible localhost -m setup
localhost | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.122.1",
"192.168.91.100"
],
"ansible_all_ipv6_addresses": [
"fe80::fe7:ca03:81f:2887"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "07/29/2019"
5.3.2 自定义变量
"{{ 变量名 }}"
使用 ansible-playbook -e 选项
例子: 在使用命令时定义变量
vim test2.yml
---
- hosts: websrvs
remote_user: root
tasks:
- name: install package
yum: name={{ pkname }} state=present
ansible-playbook -e pkname=httpd var2.yml
5.3.3 在playbook文件中建立变量
使用vars组件
---
- hosts: web
vars:
username: test1
groupname: group1
tasks:
- name: create group
group: name={{ groupname }} state=present
- name: create user
user: name={{ username }} state=present
---
- hosts: webs
vars:
suffix: "txt"
file: "{{ ansible_nodename }}.{{suffix}}"
tasks:
- name: test var
file: path="/data/{{file}}" state=touch
5.4 template模板
template功能:可以根据和参考模块文件,动态生成相类似的配置文件
template文件必须存放于templates目录下,且命名为 .j2 结尾
yaml/yml 文件需和templates目录平级,目录结构如下示例:
范例:利用template 同步nginx配置文件
#准备templates/nginx.conf.j2文件
mkdir templates
vim nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }};
worker_processes {{ ansible_processor_vcpus+1s }};
vim temnginx.yml
---
- hosts: web
gather_facts: yes
tasks:
- name: config file
tags: page
#copy: src=/data/index.html dest=/apps/nginx/html
template: src=nginx.conf.j2 dest=/apps/nginx/conf/nginx.conf
notify:
- restart nginx
handlers:
- name: restart nginx
service: name=nginx state=restarted
ansible-playbook temnginx.yml
5.4.1 循环迭代
---
- hosts: web
gather_facts: no
tasks:
- name: create user
user: name={{ item }} state=present groups=wheel
with_items:
- testuser1
- testuser2
- testuser3
#注意= 号后不要空格
5.4.2 迭代嵌套子变量
---
- hosts: web
gather_facts: no
tasks:
- name: create group
group: name={{ item }} state=present
with_items:
- nginx
- mysql
- tomcat
- name: create user
user: name={{ item.user }} group={{ item.group }} uid={{ item.uid }} state=present
with_items:
- { user: 'nginx', group: 'nginx' , uid: '80' }
- { user: 'mysql', group: 'mysql' , uid: '3306' }
- { user: 'tomcat', group: 'tomcat' , uid: '8080' }
六、role角色
角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
运维复杂的场景:建议使用 roles,代码复用度高
roles:多个角色的集合目录, 可以将多个的role,分别放至roles目录下的独立子目录中,如下示例
Role各目录作用
-
roles/project/ :项目名称,有以下子目录
-
files/ :存放由copy或script模块等调用的文件
-
templates/:template模块查找所需要模板文件的目录
-
tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
-
handlers/:至少应该包含一个名为main.yml的文件;此目录下的其它的文件需要在此文件中通过include进行包含
-
vars/:定义变量,至少应该包含一个名为main.yml的文件;此目录下的其它的变量文件需要在此文件中通过include进行包含
-
meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含
-
default/:设定默认变量时使用此目录中的main.yml文件,比vars的优先级低
6.1 建立role
创建role的步骤
1 创建role的目录结构.在以roles命名的目录下分别创建以各角色名称命名的目录,如mysql等,在每个角色命名的目录中分别创建相关的目录和文件,比如tasks、files、handlers、templates和vars等目录;用不到的目录可以创建为空目录,也可以不创建
2 编写和准备role的功能文件
3 编写playbook文件调用需要的角色应用于指定的主机
针对大型项目使用Roles进行编排
范例: 利用 ansible-galaxy 创建角色目录的结构
[root@localhost roles]#mkdir -pv /etc/ansible/roles/nginx/{tasks,templates,handlers,files}
mkdir: 已创建目录 "/etc/ansible/roles/nginx/tasks"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/templates"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/handlers"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/files"
[root@localhost roles]#tree
.
└── nginx
├── files
├── handlers
├── tasks
└── templates
5 directories, 0 files
[root@localhost nginx]#vim tasks/main.yml
[root@localhost nginx]#cat tasks/main.yml
- include: group.yml
- include: user.yml
- include: install.yml
- include: config.yml
- include: webpage.yml
- include: service.yml
[root@localhost nginx]#vim tasks/group.yml
- name: groups
group: name=nginx state=present
[root@localhost nginx]#vim tasks/user.yml
- name: user
user: name=nginx state=present
[root@localhost nginx]#vim tasks/install.yml
- name: install epel
yum: name=epel-release.noarch state=present
- name: install nginx
yum: name=nginx state=present
[root@localhost nginx]#vim tasks/config.yml
- name: web file
copy: src=/data/index.html dest=/usr/share/nginx/html/
[root@localhost nginx]#vim tasks/service.yml
- name: start nginx
service: name=nginx state=started
[root@localhost nginx]#tree
.
├── files
├── handlers
├── tasks
│ ├── config.yml
│ ├── group.yml
│ ├── install.yml
│ ├── main.yml
│ ├── service.yml
│ └── user.yml
└── templates
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 自动化运维Ansible
发表评论 取消回复