目录
一、Ansible介绍
1.1 功能
1.2 特性
二、Ansible安装
2.1 yum安装
2.2 编译安装
2.3 相关文件
三、 Ansible配置和工具
3.1 主配置文件
3.2 inventory主机清单文件
3.3 ansible工具
3.4 ansible命令
3.5 ansible执行过程
四、Ansible模块
4.1 command模块
4.2 shell模块
4.3 script模块
4.4 copy模块
4.5 get_url模块
4.6 fetch模块
4.7 file模块
4.8 stat模块
4.9 unarchive模块
4.10 archive模块
4.11 cron模块
4.12 yum和apt模块
4.13 yum_repository模块
4.14 service模块
4.15 user模块
五、Playbook
5.1 playbook介绍
5.2 playbook核心组件
5.3 playbook中使用变量
5.3.1 使用setup模块中变量
5.3.2 自定义变量
"{{ 变量名 }}"
5.3.3 在playbook文件中建立变量
5.4 template模板
5.4.1 循环迭代
5.4.2 迭代嵌套子变量
六、role角色
6.1 建立role
一、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