Ansible是一款很火的开源运维自动化工具,能够帮运维人员提高工作效率,减少人为失误。Ansible有上千个功能丰富且实用的模块,有详细的帮助文档可以参考,因为即使是小白也可以快速上手。
本篇文章会介绍Ansible的产生背景,相关术语,也会介绍ping,yum,firewalld,service,template,setup,lvol,lvg,copy,file,debug等模块的使用。
参考:ansible学习
系统学习建议参考骏马金龙大佬的博客
一、ansible介绍
Ansible目前是运维自动化工具里面最简单,最容易上手的一款软件,能够用来管理各种资源。用户可以使用ansible自动部署应用程序,实现IT基础架构的全面部署。
Ansible基于SSH协议,不需要客户端安装代理工具,因此使用起来非常方便,只需要在控制节点部署ansible即可。
很多开源项目都是基于ansible来写的。比如部署k8s集群的工具:kubeasz等等。
目前Ansible被纳入RECE8考试里面,可见学好Ansible的重要性
Ansible相关术语
术语 | 中文叫法 | 含义 |
---|---|---|
Control node | 控制节点 | 指的是安装了Ansible服务的主机,也被称为Ansible控制端,主要是用来发布运行任务、调用功能模块,对其他主机进行批量控制。 |
Managed nodes | 受控节点 | 指的是被Ansible服务所管理的主机,也被称为受控主机或客户端,是模块命令的被执行对象。 |
Inventory | 主机清单 | 指的是受控节点的列表,可以是IP地址、主机名称或者域名。 |
Modules | 模块 | 指的是上文提到的特定功能代码,默认自带有上千款功能模块,在Ansible Galaxy有超多可供选择。 |
Task | 任务 | 指的是Ansible客户端上面要被执行的操作。 |
Playbook | 剧本 | 指的是通过YAML语言编写的可重复执行的任务列表,把常做的操作写入到剧本文件中,下次可以直接重复执行一遍。 |
Roles | 角色 | 从Ansible 1.2版本开始引入的新特性,用于结构化的组织Playbook,通过调用角色实现一连串的功能。 |
二、配置文件和主机清单
ansible的配置文件是ansible.cfg
,可以放在当前目录,家目录和etc目录。三个目录的优先级顺序如下。
优先级 | 文件位置 |
---|---|
高 | ./ansible.cfg |
中 | ~/.ansible.cfg |
低 | /etc/ansible/ansible.cfg |
主机清单,也就是inventory文件。文件里面是所要管理的所有主机的IP和分组信息。比如下面有一批机器:
操作系统 | IP | 用途 |
---|---|---|
RHEL8 | 172.25.250.10 | dev |
RHEL8 | 172.25.250.11 | test |
RHEL8 | 172.25.250.12 | prod |
RHEL8 | 172.25.250.13 | prod |
写成清单文件就是下面这个样子:
[root@foundation0 ansible]# cat inventory
[dev]
172.25.250.10
[test]
172.25.250.11
[prod]
172.25.250.12
172.25.250.13
使用ansible-inventory --graph
命令可以以树状图的形式打印主机信息。
[root@foundation0 ansible]# ansible-inventory --graph -i inventory
@all:
|--@dev:
| |--172.25.250.10
|--@prod:
| |--172.25.250.12
| |--172.25.250.13
|--@test:
| |--172.25.250.11
|--@ungrouped:
清单文件里面也可以配置主机的连接用户名和密码。以及其他可能用到的变量。all表示所有主机都可以使用这些变量。
[root@foundation0 ansible]# cat inventory
[all:vars]
ansible_user=root
ansible_password=redhat
[dev]
172.25.250.10
[test]
172.25.250.11
[prod]
172.25.250.12
172.25.250.13
ansible.cfg
里面可能需要用到的配置信息。
配置文件里面选项很多,每个选项都有介绍是做什么的,常用的选项有下面几个。
#关闭主机key校验,关闭后,第一次ssh不用输入yes确认
host_key_checking = False
#ansible执行用户,如果清单文件里面没有指定的话会使用下面默认值
remote_user = root
#ansible roles文件目录
roles_path = /etc/ansible/roles
#清单文件目录。执行ansible命令时候可以使用-i来指定清单文件,没指定的话就会使用下面这个
inventory = /etc/ansible/hosts
三、ansible模块与基本命令
Ansible实际上只是一个框架,全靠这些模块来完成对应的功能。常见的模块如下,可以使用ansible-doc -l
来列出所有模块信息。
模块名称 | 模块作用 |
---|---|
ping | 检查受管节点主机网络是否能够联通。 |
yum | 安装、更新及卸载软件包。 |
yum_repository | 管理主机的软件仓库配置文件。 |
template | 复制模板文件到受管节点主机。 |
copy | 新建、修改及复制文件。 |
user | 创建、修改及删除用户。 |
group | 创建、修改及删除用户组。 |
service | 启动、关闭及查看服务状态。 |
get_url | 从网络中下载文件。 |
file | 设置文件权限及创建快捷方式。 |
cron | 添加、修改及删除计划任务。 |
command | 直接执行用户指定的命令。 |
shell | 直接执行用户指定的命令(支持特殊字符)。 |
debug | 输出调试或报错信息。 |
mount | 挂载硬盘设备文件。 |
filesystem | 格式化硬盘设备文件。 |
lineinfile | 通过正则表达式修改文件内容。 |
setup | 收集受管节点主机上的系统及变量信息。 |
firewalld | 添加、修改及删除防火墙策略。 |
lvg | 管理主机的物理卷及卷组设备。 |
lvol | 管理主机的逻辑卷设备。 |
查看每个模块的用法可以使用ansible-doc
命令,比如查看copy模块如何使用。ansible-doc -s
可以查看简略一点的信息
[root@foundation0 ansible]# ansible-doc copy
...
- name: Copy file with owner and permissions
copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: foo
mode: '0644'
- name: Copy file with owner and permission, using symbolic representation
copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: foo
mode: u=rw,g=r,o=r
...
使用ping模块检查清单里面机器连通性
-i inventory
表示指定使用inventory文件作为清单文件,不写的话就会以ansible.cfg配置文件指定的清单文件为准- all表示对清单文件里面全部文件执行操作。如果只需要对prod组里的机器操作,将all替换成prod
-m ping
表示使用ping这个模块
如果执行成功了,会输出绿色的内容,失败了会输出红色的内容。黄色的表示没有任何变更
[root@foundation0 ansible]# ansible all -m ping -i inventory
172.25.250.13 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
......
使用yum_repository模块可以在远程机器上创建yum仓库文件。使用ansible-doc
查看模块怎么使用。
[root@foundation0 ansible]# ansible-doc yum_repository
EXAMPLES:
- name: Add repository
yum_repository:
name: epel
description: EPEL YUM repo
baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
- name: Add multiple repositories into the same file (1/2)
yum_repository:
name: epel
description: EPEL YUM repo
file: external_repos
baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
gpgcheck: no
- name: Add multiple repositories into the same file (2/2)
yum_repository:
name: rpmforge
description: RPMforge YUM repo
file: external_repos
baseurl: http://apt.sw.be/redhat/el7/en/$basearch/rpmforge
mirrorlist: http://mirrorlist.repoforge.org/el7/mirrors-rpmforge
enabled: no
......
比如给所有机器上新增下面这个yum仓库信息。
仓库名称 | EX294_BASE |
---|---|
仓库描述 | EX294 base software |
仓库地址 | file:///media/cdrom/BaseOS |
GPG签名 | 启用 |
GPG密钥文件 | file:///media/cdrom/RPM-GPG-KEY-redhat-release |
执行的命令可以这样写。
-m yum_repository
表示使用yum_repository这个模块-a 'name="EX294_BASE" ...'
表示需要执行的参数,参数名和内容参考ansible-doc yum_repository
[root@foundation0 ansible]# ansible all -m yum_repository -a 'name="EX294_BASE" description="EX294 base software" baseurl="file:///media/cdrom/BaseOS" gpgcheck=yes gpgkey="file:///media/cdrom/RPM-GPG-KEY-redhat-release"' -i inventory
setup模块可以查看到主机的详细信息,通过filter参数来过滤出自己想要的信息:
#获取主机名。dev表示对dev组的机器执行命令;-m setup表示使用setup模块;-a 'filter="*hostname*"'是setup模块的参数,过滤器;-i inventory执行清单文件
[root@foundation0 roles]# ansible dev -m setup -a 'filter="*hostname*"' -i /root/ansible/inventory
172.25.250.10 | SUCCESS => {
"ansible_facts": {
"ansible_hostname": "servera",
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
#获取主机IP
[root@foundation0 roles]# ansible dev -m setup -a 'filter="ansible_all_ipv4_addresses"' -i /root/ansible/inventory
172.25.250.10 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.25.250.10"
],
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
四、ansible playbook
playbook翻译过来又叫剧本。但是它并不是唱戏用的。而是很多情况下我们需要执行一组操作,而不是单个命令,就需要将这些一个个命令组织起来,就叫剧本。
Ansible的playbook文件格式是YAML格式,不懂的可以百度下,YAML文件的特点是用缩进来表示嵌套的数据结构,YAML格式可以和JSON格式进行互转。
playbook文件的结构由4部分组成。target,variable,task,handler。
- target:被执行的主机列表。
- variable:指定playbook时候用到的变量
- task:任务列表,也就是一组一组命令
- handler:用于定义执行完成后需要调用的后续任务。
案例一:安装数据库
编写packages.yaml文件,对test,dev,prod主机组里的机器安装mariadb
---
,这个是YAML文件格式,一般不写似乎也没事,- name是playbook的名字
- hosts是要执行的主机组。如果要对全部主机执行的话填写all
- tasks:下面就是一个个执行的模块命令
[root@foundation0 ansible]# cat packages.yml
---
- name: install software
hosts: test,dev,prod
tasks:
- name: install mariadb
yum:
name: mariadb
state: latest
写好的playbook文件可以使用ansible-playbook -C
来检查语法:
[root@foundation0 ansible]# ansible-playbook -C packages.yml
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
[WARNING]: Could not match supplied host pattern, ignoring: test
[WARNING]: Could not match supplied host pattern, ignoring: dev
[WARNING]: Could not match supplied host pattern, ignoring: prod
PLAY [install software] ************
skipping: no hosts matched
PLAY RECAP *******************
没有问题了就可以去执行playbook了,执行结果绿色的表示成功,黄色表示没有执行,红色表示执行失败
[root@foundation0 ansible]# ansible-playbook packages.yml -i inventory
PLAY [install software] ***********************
TASK [Gathering Facts] **********************
ok: [172.25.250.12]
ok: [172.25.250.10]
ok: [172.25.250.13]
ok: [172.25.250.11]
TASK [install mariadb] **********************
ok: [172.25.250.12]
ok: [172.25.250.10]
ok: [172.25.250.11]
changed: [172.25.250.13]
PLAY RECAP ***********************
172.25.250.10 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.25.250.11 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.25.250.12 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.25.250.13 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
五、创建和使用角色
编写剧本时候,单个剧本文件是不能满足要求的,单个剧本文件不仅不会越写越大,也不利于观看和维护。因此需要将不同功能写入到不同剧本里面并使用角色来组织起来。
而且使用了角色之后,可以很方便的把别人写好的角色直接集成进来,团队维护更方便。
ansible角色分为三种:系统内置的角色,外部环境获取的角色,自己创建的角色。
加载系统内置角色
需要安装rhel-system-roles
这个软件包才能使用系统内置角色
[root@foundation0 ansible]# yum install rhel-system-roles -y
使用ansible-galaxy文件来查看有哪些自带的角色可以使用。可以看到最下面
[root@foundation0 ansible]# ansible-galaxy list
# /usr/share/ansible/roles
- linux-system-roles.kdump, (unknown version)
- linux-system-roles.network, (unknown version)
- linux-system-roles.postfix, (unknown version)
- linux-system-roles.selinux, (unknown version)
- linux-system-roles.timesync, (unknown version)
- rhel-system-roles.kdump, (unknown version)
- rhel-system-roles.network, (unknown version)
- rhel-system-roles.postfix, (unknown version)
- rhel-system-roles.selinux, (unknown version)
- rhel-system-roles.timesync, (unknown version)
# /etc/ansible/roles
这些角色实现的主要功能如下,有时候可以拿来参考:
角色名称 | 作用 |
---|---|
rhel-system-roles.kdump | 配置kdump崩溃恢复服务 |
rhel-system-roles.network | 配置网络接口 |
rhel-system-roles.selinux | 配置SELinux策略及模式 |
rhel-system-roles.timesync | 配置网络时间协议 |
rhel-system-roles.postfix | 配置邮件传输服务 |
rhel-system-roles.firewall | 配置防火墙服务 |
rhel-system-roles.tuned | 配置系统调优选项 |
比如使用timesync这个roles来同步时间,剧本可以这么写
---
- hosts: all
vars:
timesync_ntp_servers:
- hostname: pool.ntp.org
iburst: yes
roles:
- rhel-system-roles.timesync
其实我们一般在写项目的时候,会创建一个单独的目录,里面存放roles,清单文件(包含主机和变量信息),主运行文件(比如deploy.yml) ,大概是下面这个结构
[root@foundation0 ansible]# tree -C test_playbooks/
test_playbooks/
├── deploy.yml
├── inventory
│ └── testenv
└── roles
└── testbox
└── tasks
└── main.yml
4 directories, 3 files
从外部获取角色
Ansible Galaxy是Ansible的一个官方社区,用于共享角色和功能代码,用户可以在网站自由地共享和下载Ansible角色。该社区是管理和使用角色的不二之选。
Ansible Galaxy官网中,左侧有3个功能选项,分别是首页(Home)、搜索(Search)以及社区(Community)。单击Search按钮进入到搜索界面,这里以nginx服务为例进行搜索,即可找到Nginx官方发布的角色信息。

如何安装使用
安装很简单,可以选择使用ansible collection install xxx
去安装,或者手动下载源码到playbook项目里面
使用:可以参考说明文档,正常使用
[root@foundation0 ansible]# ansible-galaxy install community-docker-2.0.0.tar.gz
- extracting community-docker-2.0.0.tar.gz to /root/.ansible/roles/community-docker-2.0.0.tar.gz
- community-docker-2.0.0.tar.gz was installed successfully
[root@foundation0 ansible]# ansible-galaxy list
# /root/.ansible/roles
- community-docker-2.0.0.tar.gz, (unknown version)
# /usr/share/ansible/roles
- linux-system-roles.kdump, (unknown version)
- linux-system-roles.network, (unknown version)
- linux-system-roles.postfix, (unknown version)
- linux-system-roles.selinux, (unknown version)
- linux-system-roles.timesync, (unknown version)
- rhel-system-roles.kdump, (unknown version)
- rhel-system-roles.network, (unknown version)
- rhel-system-roles.postfix, (unknown version)
- rhel-system-roles.selinux, (unknown version)
- rhel-system-roles.timesync, (unknown version)
# /etc/ansible/roles
创建新的角色
除了能够使用系统自带的角色和从Ansible Galaxy中获取的角色之外,也可以自行创建符合工作需求的角色。这种定制化的编写工作能够更好地贴合生产环境的实际情况。
创建一个名为apache的新角色,它能够帮助我们自动安装、运行httpd网站服务,设置防火墙的允许规则,以及根据每个主机生成独立的index.html首页文件。用户在调用这个角色后能享受到“一条龙”的网站部署服务。
查看当前ansible读取的配置文件
可以看到当前读取的/etc/ansible/ansible.cfg配置文件
[root@foundation0 ansible]# ansible --version
ansible 2.8.0
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, Jan 11 2019, 02:17:16) [GCC 8.2.1 20180905 (Red Hat 8.2.1-3)]
查看配置文件里面当前roles所在目录
可以看到没有配置,也就是在/etc/ansible/roles目录下面
[root@foundation0 ansible]# grep roles /etc/ansible/ansible.cfg
# additional paths to search for roles in, colon separated
#roles_path = /etc/ansible/roles
# by default, variables from roles will be visible in the global variable
使用ansible-galaxy init
来创建新的role
[root@foundation0 ansible]# cd /etc/ansible/roles/
[root@foundation0 roles]# ls
[root@foundation0 roles]# ansible-galaxy init apache
- apache was created successfully
[root@foundation0 roles]# ls
apache
[root@foundation0 roles]# tree apache/
apache/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files
ansible角色目录的结构和含义
目录 | 含义 |
---|---|
defaults | 包含角色变量的默认值(优先级低)。 |
files | 包含角色执行tasks任务时做引用的静态文件。 |
handlers | 包含角色的处理程序定义。 |
meta | 包含角色的作者、许可证、频台和依赖关系等信息。 |
tasks | 包含角色所执行的任务。 |
templates | 包含角色任务所使用的Jinja2模板。 |
tests | 包含用于测试角色的剧本文件。 |
vars | 包含角色变量的默认值(优先级高)。 |
部署一个网站的步骤:
- 1、安装httpd服务。使用yum模块
- 2、启动httpd服务,设置开机起启动。使用service模块。
- 3、修改防火墙,开通80端口。使用firewalld模块。
- 4、修改网站首页内容:index.html。使用template模块
编写apache role项目
[root@foundation0 ansible]# cat /etc/ansible/roles/apache/tasks/main.yml
---
- name: install httpd
yum:
name: httpd
state: latest
- name: start httpd service
service:
name: httpd
state: started
enabled: yes
- name: firewalld
firewalld:
service: http
permanent: yes
state: enabled
immediate: yes
- name: copy index.html
template:
src: index.html.j2
dest: /var/www/html/index.html
[root@foundation0 roles]# cat apache/templates/index.html.j2
Welcome to {{ ansible_fqdn }} on {{ ansible_all_ipv4_addresses }}
#使用ansible-galaxy查看我们写的apache role是不是有了
[root@foundation0 ansible]# ansible-galaxy list
......
# /etc/ansible/roles
- apache, (unknown version)
编写roles.yml调用上面写的apache role
[root@foundation0 ansible]# cd /root/ansible/
[root@foundation0 ansible]# cat roles.yml
---
- name: apache
hosts: all
roles:
- apache
#执行
[root@foundation0 ansible]# ansible-playbook roles.yml -i inventory
访问测试
[root@foundation0 ansible]# curl servera
Welcome to servera.lab.example.com on ['172.25.250.10']
[root@foundation0 ansible]# curl serverb
Welcome to serverb.lab.example.com on ['172.25.250.11']
[root@foundation0 ansible]# curl serverc
Welcome to serverc.lab.example.com on ['172.25.250.12']
六、逻辑卷操作
逻辑卷的操作步骤:
物理磁盘 --> PV --> VG --> LV --> 创建文件系统(mkfs) --> 挂载(mount)
相关模块:
物理磁盘 --> PV :lvg
PV --> VG:lvg
VG --> LV:lvol
创建文件系统:filesystem
挂载:lineinfile
给servera加一块1G的磁盘测试
virt-manager
打开虚拟化图形化管理界面 --> 将servera机器关机 --> 双击点开servera --> 点击左上角小灯泡添加磁盘 --> 开机确认

确认servera的磁盘已经存在
[root@foundation0 ~]# ssh root@servera
Warning: Permanently added 'servera' (ECDSA) to the list of known hosts.
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Sun Nov 14 20:53:47 2021 from 172.25.250.250
[root@servera ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 10G 0 disk
└─vda1 252:1 0 10G 0 part /
vdb 252:16 0 5G 0 disk
vdc 252:32 0 1G 0 disk
编写ansible脚本操作sdc磁盘。
pesize是物理卷中最小存储单元,这个一般不用设置。默认是4k
- 将sdc磁盘创建为pv;并加入到名为test-vg1的vg里面;
- 在test-vg1上创建一个100MB的名为test-lv1的lv,格式化为xfs,挂载到/opt/lv1目录
- 在test-vg1上创建一个200MB的test-lv2的lv,格式化为ext4,挂载到/opt/lv2目录下面
---
- name: lvg test
hosts: dev
tasks:
- name: create pv and vg
lvg:
vg: vg-test1
pvs: /dev/vdc
- name: create lv1
lvol:
vg: vg-test1
lv: test-lv1
size: 100M
- name: create lv2
lvol:
vg: vg-test1
lv: test-lv2
size: 200M
- name: mkfs lv1
filesystem:
fstype: xfs
dev: /dev/vg-test1/test-lv1
force: yes
- name: mkfs lv2
filesystem:
fstype: ext4
dev: /dev/vg-test1/test-lv2
force: yes
# - name: create /opt/lv1
# file:
# path: /opt/lv1
# state: directory
# mode: '0755'
# - name: create /opt/lv2
# file:
# path: /opt/lv2
# state: directory
# mode: '0755'
- name: mount lv1
mount:
path: /opt/lv1
src: /dev/vg-test1/test-lv1
fstype: xfs
state: mounted
- name: mount lv2
mount:
path: /opt/lv2
src: /dev/vg-test1/test-lv2
fstype: ext4
state: mounted
效果:
[root@servera ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
test-lv1 vg-test1 -wi-ao---- 100.00m
test-lv2 vg-test1 -wi-ao---- 200.00m
[root@servera ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 10G 0 disk
└─vda1 252:1 0 10G 0 part /
vdb 252:16 0 5G 0 disk
vdc 252:32 0 1G 0 disk
├─vg--test1-test--lv1 253:0 0 100M 0 lvm /opt/lv1
└─vg--test1-test--lv2 253:1 0 200M 0 lvm /opt/lv2
[root@servera ~]# tail -2 /etc/fstab
/dev/vg-test1/test-lv1 /opt/lv1 xfs defaults 0 0
/dev/vg-test1/test-lv2 /opt/lv2 ext4 defaults 0 0
七、when判断
参考:https://www.cnblogs.com/f-ck-need-u/p/7575228.html#2-
ansible也是支持条件判断的,那就是使用when。当满足某个要求的时候我就怎么怎么样。
若主机在dev分组中,则修改/etc/issue文件内容为Development;
若主机在test分组中,则修改/etc/issue文件内容为Test;
若主机在prod分组中,则修改/etc/issue文件内容为Production。
ansible有一些内置变量,可以直接拿来使用
参考:https://cnblogs.com/f-ck-need-u/p/7571974.html#1-5-9-
主机名 inventory_hostname和inventory_hostname_short
返回主机所在的主机组 groups 如果不在组里面,会返回ungrouped
清单里面没有分组的主机 group.ungrouped
组名 group.name
ansible版本号 ansible_version
注意二点:
- when判断的对象是task,所以和task在同一列表层次。它的判断结果决定它所在task是否执行,而不是它下面的task是否执行。
- when中引用变量的时候不需要加{{ }}符号。
- 等值判断用
==
,包含关系判断用in
,取反使用not,多个条件可以使用and或者or
[root@foundation0 ansible]# cat issue.yml
---
- name: issue
hosts: all
tasks:
- name: test
copy:
content: 'Test'
dest: /etc/issue
when: inventory_hostname in groups.dev
- name: dev
copy:
content: 'Development'
dest: /etc/issue
when: inventory_hostname in groups.dev
- name: prod
copy:
content: 'Production'
dest: /etc/issue
when: '"prod" in group_names'
八、管理文件属性
请创建出一个名为/zhangsan的新目录,所有者及所属组均为root管理员身份;
设置所有者和所属于组拥有对文件的完全控制权,而其他人则只有阅读和执行权限;
给予SGID特殊权限;
仅在dev主机组的主机上实施。
suid:root相关,4;sgid:组相关,2;sbit:其他用户相关,1
[root@foundation0 ansible]# cat file.yml
---
- name: create directory
hosts: dev
tasks:
- name: create directory /zhangsan
file:
path: /zhangsan
state: directory
owner: root
group: root
mode: '2755'
[root@foundation0 ansible]# ssh 172.25.250.10 "ls -ld /zhangsan"
drwxr-sr-x. 2 root root 6 Nov 14 23:14 /zhangsan
九、管理密码库
自Ansible 1.5版本发布后,vault作为一项新功能进入到了运维人员的视野。它不仅能对密码、剧本等敏感信息进行加密,而且还可以加密变量名称和变量值,从而确保数据不会被他人轻易阅读。使用ansible-vault命令可以实现内容的新建(create)、加密(encrypt)、解密(decrypt)、修改密码(rekey)及查看(view)等功能。
1、加密键值对
[root@foundation0 ansible]# cat kv.yml
---
login_user: root
login_pass: redhat
[root@foundation0 ansible]# ansible-vault encrypt kv.yml
New Vault password:
Confirm New Vault password:
Encryption successful
[root@foundation0 ansible]# cat kv.yml
$ANSIBLE_VAULT;1.1;AES256
62373161353166343632303737343562616134316262303731366330363039363066313238666338
6438383965356136653463396662336536363632623739630a373663643438643632623066393835
32353631623639346234323163653465646131356338643237666338653631313130333938396233
3731653235393662660a363539353138383134303533333063653131636430623130666132336461
30613435613931393733366666646561643064396434666566623632353463623733383236316565
3539323363396230373137643734616434633163643233613838
2、解密查看
[root@foundation0 ansible]# ansible-vault view kv.yml
Vault password:
---
login_user: root
login_pass: redhat
3、将密码保存到文件,避免交互式输入
[root@foundation0 ansible]# ls -l pass.txt
-rw-------. 1 root root 4 Nov 14 23:27 pass.txt
[root@foundation0 ansible]# cat pass.txt
123
[root@foundation0 ansible]# egrep ^vault_password /etc/ansible/ansible.cfg
vault_password_file = /root/ansible/pass.txt
[root@foundation0 ansible]# ansible-vault view kv.yml
---
login_user: root
login_pass: redhat
4、更新密码
#没有设置vault_password_file
[root@foundation0 ansible]# ansible-vault rekey kv.yml
Vault password:
New Vault password:
Confirm New Vault password:
Rekey successful
[root@foundation0 ansible]# ansible-vault view kv.yml
Vault password:
---
login_user: root
login_pass: redhat
#设置了vault_password_file 新密码放到vault_password_file
ansible-vault rekey kv.yml --ask-vault-pass