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官方发布的角色信息。

image-20211113172941609

如何安装使用

安装很简单,可以选择使用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 --> 点击左上角小灯泡添加磁盘 --> 开机确认

image-20211114210437801

确认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