一、工作模式
1. adhoc临时命令
语法: ansible 主机或者组列表 -m 模块 -a “参数”
2. playbook
语法:
ansible-playbook xxx.yml
二、模块
1. ping
2.command:默认模块(不支持重定向,管道)
3.shell:类似command,但是支持shell特性,如管道,重定向
4.script:用于在远程主机上执行脚本
5.file:可以创建文件,目录,链接等,还可以修改权限,属性等
6.copy:用于将文件从控制端拷贝到被控制端
7.fetch:与copy模块相反,copy是上传,fetch是下载
8.lineinfile:用于确保目标文件中有一行内容
9.replace:inlinefile会替换一行,replace可以替换关键词
10.user:实现linux用户管理
11.group:创建、删除组
12.yum_repository:用于配置yum
13.yum:用于rpm软件包管理,如安装、升级、卸载
14.service:用于控制服务
15.lvg:创建,删除卷组,修改卷大小
16.lvol:创建,删除逻辑卷,修改逻辑卷大小
17.filesystem:格式化,也就是创建文件系统
18.mount:挂载文件系统
19.parted:硬盘分区管理
20.setup:facts变量
21.debug:打印指定内容
22.firewalld:防火墙配置
23.template:可以上传具有特定格式的文件(如文件中包含变更)
三、变量
1.预定义变量(facts)
1.1 通过setup模块获取
1.2 常用变量
ansible_hostname:主机名
ansible_all_ipv4_addresses:所有的ipv4地址
ansible_bios_version:BIOS版本信息
ansible_memtotal_mb:总内存大小
ansible_eth0.ipv4.address:eth0的ip地址
2.自定义变量
2.1 用户自己定义的变量
2.2定义位置
2.2.1 主机清单文件中定义
2.2.2 playbook中定义
2.2.3 专门的变量文件中定义
2.2.4 在角色的defaults目录和vars目录中定义
四、错误处理
1.使用ignore_errors忽略错误
2.在task级别忽略,只针对某一任务
3.在play级别定义,针对play中所有任务
五、触发执行的任务
1.通过handlers定义触发执行的任务
2.handlers中定义的任务,不是一定会执行的
3.在tasks中定义的任务,通过notify关键通知handlers中哪个任务要执行
4.只有tasks中的任务状态是changed才会进行通知
六、条件执行
1.使用when关键字进行条件判断
2.常用操作符:
==,!=,>, <, >= ,<=
3.多条件:and, or
4.取反:not关键字
七、注册变量
1.使用register关键字
2.用于捕获和保存任务执行结果
八、任务块
1.通过block关键字,将多个任务组合到一起
2.将整个block任务组,一起控制是否要执行
3.与rescue,always连用
3.1 block中的任务都成功,rescue的任务不执行
3.2 block中的任务出现失败(failed),rescue的任务执行
3.1 block中的任务不论如何,always的任务总是执行
九、循环
1.使用loop关键字
2.相当于shell中的for循环
3.循环用到的变量名是固定的,叫item
十、角色role
1.主要目的:代码重用
2.创建命令: ansible-galaxy init
3.角色目录说明:
3.1 README.md
3.2 tasks
3.3 handlers
3.4 files
3.5 templates
3.6 vars
3.7 defaults
3.8 meta:包含一个main.yml文件,用于描述角色元信息,例如作者、依赖等
3.9 tests:存放一些测试代码和测试用例文件
随着ansible模块越来越多,每次把ansible程序和模块打包在一起,软件的更新就特别麻烦,
软件更新了,模块可能跟不上,或者模块更新了,而软件更新又跟不上模块的更新,所以
目前发展的方向是“软件和模块分离”
ansible软件包为ansible-core(该软件包中包含ansible核心命令和核心模块),其他更多模块单独发布。
而模块和插件等都单独发布,也比较乱,所以设计了新的collection概念,一个collection目录中可以把某一类的模块,角色,插件都封装在一起,下载collection就可以一次性下载所有相关的模块,角色,插件。
红帽会不定期发布一个容器,将ansible核心软件和更多collection封装的模块都一起放到一个容器中,简直是新手的福音,用户不用关心软件的安装,也不用关心模块从哪儿下载。
用户只要启动一个容器就可以搞定一切,然后通过ansible-navigator管理这个容器。
可以参考以下网站:
github地址:
GitHub - ansible/ansible-navigator: A text-based user interface (TUI) for Ansible.
配置文档网址:Configuration - Ansible Navigator Documentation
在nginx中使用:
#适用于RHEL9
1)sudo yum -y install ansible-core ansible-navigator
2) mkdir ~/ansible && cd ~/ansible #目录名称并不限制必须为ansible,要视情况而定,但是目录下的ansible.cfg和inventory文件是不可或缺的
3) vim ansible.cfg
[defaults]
inventory=inventory #清单文件
role_path=roles #角色目录
remote_user=xxx #远程用户
[privilege_escalation] #sudo提权
become=True #是否提权
become_method=sudo #提权方式
become_user=root #提权用户
become_ask_pass=False #是否需要密码
4)vim inventory
略。。。
5) mkdir roles # 创建角色目录
6)ansible all -m ping #测试是否能够ping通所有inventory记录的主机
7)vim ~/.ansible-navigator.yml
---
ansible-navigator:
execution-environment:
image: registry.lab.example.com:5000/ee-supported-rhel8:latest
pull:
policy: missing
8) sudo vim /etc/containers/registries.conf #修改容器配置
。。。略
[registries.search]
registries = ['registry.lab.example.com:5000']
[registries.insecure]
registries = ['registry.lab.example.com:5000']
9)podman login registry.lab.example.com
按照题目提示输入用户名,密码
10)ansible-navigator images #下载镜像
11)podman images #查看镜像
# 注意:image的值看考题给的是什么,不要照抄
例题1-自定义角色:
根据下列要求,在/home/alice/ansible/roles 中创建名为httpd的角色:
1)安装 httpd 软件,并能够开机自动运行
2)开启防火墙,并允许 httpd 通过
3)使用模板 index.html.j2,用来创建/var/www/html/index.html 网页, 内容如下(HOSTNAME是受管理节点的完全域名,IPADDRESS是IP地址):
Welcome to HOSTNAME on IPADDRESS
然后创建剧本 /home/alice/ansible/myrole.yml,为webtest主机组启用httpd角色。
ansible目录下的ansible.cfg文件(注意要定义roles_path)和inventory文件,略。。。
1) cd ~/ansible
2) mkdir roles
3) cd roles
4) ansible-galaxy init httpd
5) ls httpd
6) vim httpd/templates/index.html.j2
Welcome to {{ansible_fqdn}} on {{ansible_enp1s0.ipv4.address}}
7) vim httod/tasks/main.yml #编辑任务文件
---
- yum:
name: httpd
- service:
name: httpd
state: started
enabled: yes
- template:
src: index.html.j2
dest: /var/www/html/index.html
8) cd ~/ansible
9) vim myrole.yml
---
- hosts: webtest
roles:
- httpd
10) ansible-playbook myrole.yml #执行剧本
如果是从网络资源下载角色:
#1.通过galaxy 安装角色与collection
创建剧本~/ansible/roles/down.yml,用来从以下 URL 下载角色,
并安装到~/ansible/roles 目录下:
http://server1.lab0.example.com/roles/haproxy.tar 此角色名为 haproxy
http://server1.lab0.example.com/roles/myphp.tar 此角色名为 myphp
从http://server1.lab0.example.com/materials/下载如下 collection 并安装到
~/ansible/collections 目录下(仅适用于 RHEL9):
ansible-posix-1.5.1.tar.gz
community-general-6.3.0.tar.gz
解题参考:
# ~/ansible目录下
1) vim roles/down.yml
- src: http://server1.lab0.example.com/roles/haproxy.tar
name: haproxy
- src: http://server1.lab0.example.com/roles/myphp.tar
name: myphp
2) ansible-galaxy install -r roles/down.yml
#从上图可知,ansible-galaxy collection install 网络角色,且有下载路径要求的使用下方命令,注意使用"-p"参数
3) ansible-galaxy collection install \
http://server1.lab0.example.com/materials/ansible-posix-1.5.1.tar.gz \
-p ~/ansible/collections
4)ansible-galaxy collection install \
http://server1.lab0.example.com/materials/community-general-6.3.0.tar.gz \
-p ~/ansible/collections
注意:http://server1.lab0.example.com为假设场景中的linux真机
#使用上述通过galaxy下载的角色
1)vim web.yml
---
- hosts: test05
roles:
- haproxy
- hosts: webtest
roles:
- myphp
2) ansible-playbook web.yml
3)使用curl命令查看效果
4.在playbook,通过role引入要使用的模块
十一、加解密
1.加密:
1.1 普通加密,回车提示输入密码,确认密码
ansible-vault encrypt 文件
1.2 使用密码本给文件加密:
1)vim pass.txt #密码文件
123
//使用密码文件加密testfile文件
2) ansible-vault encrypt testfile --vault-id pass.txt
或者
ansible-vault encrypt --vault-id=pass.txt testfile
// 使用密码文件查看被加密的testfile文件
3)ansible-vault view testfile --vault-id pass.txt
或者ansible-vault view testfile --vault-id=pass.txt
注:--vault-id pass.txt等同于--vault-id=pass.txt,可以放在encrypt之后,或者在命令的末尾
2.解密:
ansible-vault decrypt 文件
//使用密码本解密testfile文件
1) ansible-vault decrypt testfile --vault-id pass.txt
或者
ansible-vault decrypt --vault-id=pass.txt testfile
// 查看testfile文件
2)cat testfile
3.改密码:
ansible-vault rekey 文件
4.执行加密的playbook:
ansible-playbook --ask-vault-password 文件
eg: 创建一个用户lisi,密码123,使用ansible剧本操作
- user.yml文件:
---
- name: create a user
hosts: webservers
tasks:
- name: create user lisi
user:
name: lisi
password: "{{'123'|password_hash('sha512')}}"
- 执行playbook时,通过
--ask-vault-password
选项提示输入密码
ansible-playbook --ask-vault-password user.yml
回车后,提示输入密码Vault password: 123(输入和user.yml中要求的密码一致)
十二、特殊主机清单变量
1.ansible_ssh_user:指定登录远程主机的用户名
2.ansible_ssh_pass:指定登录远程主机的密码
3.ansible_ssh_port:指定登录远程主机的端口号