Ansible

一、Ansible介绍

1.1 功能

Ansible 是一个强大的 IT 自动化工具,能够帮助你在多个远程主机上同时执行任务。以下是它的一些主要功能:

  1. 批量执行命令:Ansible 可以在多台远程主机上同时执行命令,简化了大规模系统管理的复杂性。
  2. 自动化软件安装和配置:它可以自动化地在多台主机上安装和配置各种软件服务,减少了手动操作的繁琐过程。
  3. 高级任务编排:通过 Ansible 的 Playbook 和 Role 功能,你可以轻松实现企业级复杂 IT 架构的自动化编排。
  4. 开发运维工具:Ansible 提供 API,帮助开发基于 Ansible 的自动化运维工具,如 Jumpserver(堡垒机)。
1.2 特性

Ansible 的一些关键特性包括:

  1. 模块化设计:Ansible 使用特定模块来完成特定任务,并支持自定义模块,任何编程语言都可以用来编写模块。
  2. 基于 Python 实现:Ansible 主要依赖于 Paramiko、PyYAML 和 Jinja2 这三个关键模块,所有功能都是用 Python 语言实现的。
  3. 部署简单:Ansible 不需要安装代理,基于 SSH 进行通信,默认情况下使用 OpenSSH,确保了安全性。
  4. 幂等性:同一个任务执行一次和多次的结果是一样的,不会因为重复执行而产生意外情况。
  5. 任务编排:支持使用 YAML 格式的 Playbook 编排任务,可以处理复杂的数据结构和多层次的任务。
  6. Role 功能:Role 用于解决大型项目的多层次问题,方便分层处理和管理。

二、Ansible安装

2.1 使用 yum 安装

可以使用以下命令通过 yum 安装 Ansible:

yum install epel-release.noarch -y
yum install ansible -y

2.2 编译安装

如果需要编译安装 Ansible,可以按照以下步骤操作:

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 相关文件

Ansible 的一些重要配置文件和目录:

  1. /etc/ansible/ansible.cfg:主配置文件,可以在项目目录中创建独立的配置文件以覆盖默认设置。
  2. /etc/ansible/hosts:主机清单,存放需要管理的主机列表。
  3. /etc/ansible/roles/:存放角色(Role)的目录。

三、Ansible配置和工具

3.1 主配置文件

Ansible 的配置文件可以放在多个不同的地方,优先级从高到低依次是:

  1. 当前目录下的 ansible.cfg
  2. 用户主目录下的 .ansible.cfg
  3. 系统默认的 /etc/ansible/ansible.cfg
3.2 inventory 主机清单文件

主机清单文件是 Ansible 用于批量操作主机的关键配置文件。默认位置是 /etc/ansible/hosts,其中可以配置以下参数:

  • ansible_ssh_host:远程主机名。
  • ansible_ssh_port:SSH 端口号。
  • ansible_ssh_user:SSH 用户名。
  • ansible_ssh_pass:SSH 密码(不推荐,建议使用 SSH 密钥)。
  • ansible_sudo_pass:sudo 密码(不推荐,建议使用 --ask-sudo-pass)。
  • ansible_connection:连接类型(如 localsshparamiko)。
  • ansible_ssh_private_key_file:SSH 私钥文件。
  • ansible_shell_type:目标系统的 shell 类型。
  • ansible_python_interpreter:目标主机的 Python 路径。

可以根据需要将主机分组,如:

[web]
192.168.91.101:666
192.168.91.102

[server]
192.168.91.[100:105]

[ky15]
node[1:5]

3.3 Ansible 工具

Ansible 提供了一系列工具用于执行各种任务:

  • /usr/bin/ansible:主程序,用于临时命令执行。
  • /usr/bin/ansible-doc:查看配置文档和模块功能。
  • /usr/bin/ansible-playbook:编排自动化任务。
  • /usr/bin/ansible-pull:远程执行命令。
  • /usr/bin/ansible-vault:文件加密工具。
  • /usr/bin/ansible-console:基于 Console 界面的交互式工具。
  • /usr/bin/ansible-galaxy:下载和上传优秀代码或 Role 模块的平台。
3.4 Ansible 命令

使用 Ansible 命令时,可以指定主机、模块和参数,常用选项包括:

  • –version:显示版本。
  • -m module:指定模块,默认是 command。
  • -v:显示详细过程,-vv-vvv 更详细。
  • –list-hosts:显示主机列表。
  • -C, --check:检查但不执行。
  • -T, --timeout=TIMEOUT:执行命令的超时时间,默认 10 秒。
  • -k, --ask-pass:提示输入 SSH 连接密码,默认使用 Key 验证。
  • -u, --user=REMOTE_USER:指定远程执行的用户,默认是 root。
  • -b, --become:切换用户,代替旧版的 sudo。
  • –become-user=USERNAME:指定 sudo 的 runas 用户,默认为 root。
  • -K, --ask-become-pass:提示输入 sudo 的口令。
  • -f FORKS, --forks FORKS:指定并发执行任务的主机数。

例如,执行 ping 命令:

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

3.5 Ansible 执行过程

Ansible 的执行过程如下:

  1. 加载配置文件,默认是 /etc/ansible/ansible.cfg
  2. 加载相应的模块文件,如 command
  3. 将模块或命令生成临时 Python 文件,并传输到远程服务器的相应目录。
  4. 为文件添加执行权限。
  5. 执行并返回结果。
  6. 删除临时 Python 文件,完成任务。

自动化运维Ansible

云计算稿手

已于 2024-06-26 16:44:16 修改

阅读量950
 收藏 18

点赞数 11
文章标签: 运维 自动化 ansible
版权
目录

一、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

ansible db -a "df -h"
192.168.91.103 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   30G   20G  60% /

ansible all -a "uptime"
192.168.91.104 | CHANGED | rc=0 >>
 10:43:08 up  1:23,  1 user,  load average: 0.00, 0.01, 0.05

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

ansible web -a "ps aux | grep nginx"
192.168.91.102 | CHANGED | rc=0 >>
root       1124  0.0  0.1  12544   932 ?        Ss   12:00   0:00 nginx: master process /usr/sbin/nginx

ansible web -a "cat /etc/passwd | grep root"
192.168.91.101 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash

4.3 script模块

功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)

注意:此模块不具有幂等性

例子:

vim test.sh
#!/bin/bash
hostname

ansible web -m script -a '/root/test.sh'

vim backup.sh
#!/bin/bash
tar czf /backup/home.tar.gz /home

ansible web -m script -a '/root/backup.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"

ansible web -m copy -a "src=/etc/hosts dest=/opt/hosts mode=644"
ansible web -m copy -a "content='Hello, World!' dest=/opt/hello.txt"

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/"
ansible web -m get_url -a "url=https://example.com/file.txt dest=/tmp/file.txt"

ansible web -m get_url -a "url=https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.10.1.tar.xz dest=/usr/src/linux-5.10.1.tar.xz"
ansible web -m get_url -a "url=http://ftp.gnu.org/gnu/wget/wget-1.21.1.tar.gz dest=/opt/wget-1.21.1.tar.gz"

4.6 fetch模块

功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录

例子:

ansible web -m fetch -a 'src=/etc/passwd dest=/mnt'
ansible web -m fetch -a 'src=/var/log/messages dest=/mnt/logs/'

ansible web -m fetch -a 'src=/home/user/file.txt dest=/local/path/file.txt'
ansible web -m fetch -a 'src=/etc/ssh/sshd_config dest=/backup/sshd_config'

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'
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"

ansible web -m file -a 'path=/var/log/test.log state=touch mode=644'
ansible web -m file -a 'path=/var/www/html state=directory'

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
}

ansible web -m stat -a 'path=/etc/hosts'
ansible web -m stat -a 'path=/var/log/messages'

ansible web -m stat -a 'path=/home/user/.bashrc'
ansible web -m stat -a 'path=/usr/local/bin/script.sh'

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  代表压缩文件不是去本机上查找   去远端服务器查找

ansible web -m unarchive -a 'src=/path/to/local/file.tar.gz dest=/var/tmp copy=yes'
ansible web -m unarchive -a 'src=/path/to/remote/file.zip dest=/opt/applications copy=no'

4.10 archive模块

功能:打包压缩保存在被管理节点

对远端机器进行压缩

例子:

ansible web -m archive -a "path=/var/log/ dest=/data/log.tar.bz2 format=bz2"
ansible web -m archive -a "path=/home/user/docs dest=/backup/docs.tar.gz format=gz"

ansible web -m archive -a "path=/var/www/html dest=/backup/www-html.tar.gz format=gz"
ansible web -m archive -a "path=/etc dest=/backup/etc.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'

ansible web -m cron -a 'hour=3 minute=0 day=1 name="monthly cleanup" job="/usr/local/bin/cleanup.sh"'
ansible web -m cron -a 'minute=15 name="check disk space" job="df -h > /tmp/disk_space.txt"'

crontab -l 查看

删除任务:
ansible websrvs -m cron -a "name='backup mysql' state=absent"
ansible web -m cron -a "name='check disk space' 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"

ansible web -m apt -a "name=nginx state=present"
ansible web -m apt -a "name=curl state=latest"
ansible web -m apt -a "name=apache2 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'

ansible web -m yum_repository -a 'name=customrepo description="Custom Repository" baseurl=http://repo.example.com/customrepo/ gpgcheck=yes gpgkey=http://repo.example.com/RPM-GPG-KEY-customrepo'
ansible web -m yum_repository -a 'name=customrepo description="Custom Repository" 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'

ansible web -m service -a 'name=nginx state=started'
ansible web -m service -a 'name=nginx state=stopped'
ansible web -m service -a 'name=nginx state=restarted'

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参数设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码

五、Playbook

由于 Playbook 使用 YAML 文件,该文件对格式要求非常严格,因此建议为文本编辑器添加以下配置:

vim ~/.vimrc
set ai
set ts=2

5.1 Playbook 介绍

Playbook 是由一个或多个 “play” 组成的列表。每个 play 的主要功能在于将预定义的一组主机,装扮成事先通过 Ansible 中的 task 定义好的任务角色。Task 实际上是调用 Ansible 的一个 module,将多个 play 组织在一个 Playbook 中,即可以让它们联合起来,按事先编排的机制执行预定义的动作。

Playbook 文件使用 YAML 语言编写。例如,我们可以编写一个简单的 Playbook 来安装 HTTP 服务器:

---
- hosts: web
  tasks:
    - name: 安装并启动 HTTP 服务器
      service:
        name: httpd
        state: started

5.2 Playbook 核心组件

一个 Playbook 由多个组件组成,常见组件类型如下:

Hosts

远程主机列表,指定在哪些主机上执行任务。

Tasks

任务集,由多个 task 组成的列表,每个 task 是一个字典,包含至少 name 和 task 元素。例如:

tasks:
  - name: 安装 HTTP 服务器
    yum:
      name: httpd
      state: present

Variables

内置变量或自定义变量在 Playbook 中调用。例如:

vars:
  http_port: 80

Templates

模板文件,可以替换模板中的变量并实现一些简单逻辑。例如,生成配置文件:

tasks:
  - name: 部署 Nginx 配置文件
    template:
      src: nginx.conf.j2
      dest: /etc/nginx/nginx.conf

Handlers

结合 notify 使用,由特定条件触发的操作。例如:

tasks:
  - name: 复制文件
    copy:
      src: /etc/passwd
      dest: /opt/1.txt
    notify:
      - 重启 Nginx

handlers:
  - name: 重启 Nginx
    service:
      name: nginx
      state: restarted

Tags

指定某条任务执行,用于选择运行 Playbook 中的部分代码。例如:

tasks:
  - name: 添加用户
    user:
      name: test
      state: present
    tags: useradd

执行带标签的任务:

ansible-playbook -t useradd test.yaml

5.3 Playbook 中使用变量

定义变量

变量名只能由字母、数字和下划线组成,并且只能以字母开头。例如:

vars:
  http_port: 80

调用变量

通过 {{ variable_name }} 调用变量,变量名前后建议加空格。例如:

tasks:
  - name: 启动 HTTP 服务
    service:
      name: httpd
      state: started
      port: {{ http_port }}

变量来源

  • Ansible 的 setup facts:远程主机的所有变量都可直接调用。
  • 命令行指定变量,优先级最高。例如:
ansible-playbook -e http_port=8080 test.yml

使用 setup 模块中变量

setup 模块自动在 Playbook 调用,不要用 ansible 命令调用,生成的系统状态信息存放在 facts 变量中。例如,通过 facts 变量获取被控端 CPU 的个数信息:

tasks:
  - name: 获取 CPU 信息
    debug:
      msg: "{{ ansible_processor_vcpus }}"

自定义变量

使用 -e 选项定义变量。例如:

ansible-playbook -e pkname=httpd test2.yml

5.4 Template 模板

目录结构

template 文件必须存放于 templates 目录下,且命名为 .j2 结尾。目录结构示例如下:

my_playbook/
├── templates/
│   └── nginx.conf.j2
└── my_playbook.yml

模板示例

利用 template 同步 Nginx 配置文件:

# templates/nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }};

# my_playbook.yml
---
- hosts: web
  gather_facts: yes
  tasks:
    - name: 部署 Nginx 配置文件
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify:
        - 重启 Nginx

  handlers:
    - name: 重启 Nginx
      service:
        name: nginx
        state: restarted

5.4.1 循环迭代

创建用户示例:

tasks:
  - name: 创建用户
    user:
      name: "{{ item }}"
      state: present
      groups: wheel
    with_items:
      - testuser1
      - testuser2
      - testuser3

5.4.2 迭代嵌套子变量

创建用户和组示例:

tasks:
  - name: 创建组
    group:
      name: "{{ item }}"
      state: present
    with_items:
      - nginx
      - mysql
      - tomcat

  - name: 创建用户
    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' }
  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值