飞天使-linux操作的一些技巧与知识点6-ansible结合jinja2使用,可规范化进行自动化管控
2023-12-14 23:38:08
文章目录
在议playbook
主要是使用不同的模块进行编排
如果格式有问题,找chatgpt调整下格式输出就可以
缺点是比较死板,不能成体系
虚拟环境中安装ansible
要在CentOS 7系统上让Ansible使用Python 3,你可以按照以下步骤进行操作:
确认你的CentOS 7系统已安装Python 3。你可以通过在终端中运行python3 --version命令来检查是否已安装Python 3。
安装Python 3的pip包管理工具。在CentOS 7上,你可以使用以下命令安装:
sudo yum install python3-pip
安装python3-devel软件包以支持Python 3的开发库。运行以下命令进行安装:
sudo yum install python3-devel
创建一个Python 3虚拟环境(可选)。虚拟环境可以帮助你隔离Ansible所需的Python包与系统级安装的Python包。使用以下命令创建虚拟环境:
python3 -m venv ansible-env
激活虚拟环境:
source ansible-env/bin/activate
安装Ansible和所需的Python包。在虚拟环境中运行以下命令:
pip install ansible
配置Ansible以使用Python 3。打开/etc/ansible/ansible.cfg文件,并找到以下行:
# interpreter_python = auto_silent
取消注释并将其更改为以下内容:
interpreter_python = /usr/bin/python3
确认Ansible使用Python 3。运行以下命令来检查:
ansible --version
playbook 结合变量的一些演示
普通的vars_files 变量,在同级目录创建目录
- hosts: webservers
vars_files:
- ./test.yml
tasks:
- name: Output Vars
debug:
msg:
- "{{ http_packages }}"
- "{{ db_packages }}"
$cat test.yml
test: ansible_vars_files
http_packages: 123
db_packages: 123r
返回结果
=> {
"msg": [
123,
null
]
}
注意: test.yml 一定要有这个变量,哪怕为空,否则报错
test.yml 可以被多个playbook 引用
vars_files:
- ./test.yml
使用host_vars 定义变量
hosts 配置文件为
[webservers]
1.1.1.1 aaa=2 bbb=master
[webservers:vars]
port=80
---
- hosts: webservers
tasks:
- name: output variables
debug:
msg: "{{ aaa }} {{ bbb }} {{ port }}"
> {
"msg": "2 master 80"
}
group_vars定义变量
在项目目录中创建 group_vars 目录,然后在创建一个文件,文件的文件名称要与
inventory 清单中的组名称保持完全一致;
在 group_vars 目录中创建 webservers 文件,为 webservers 主机组设定变
量;
"msg": [
11,
22
]
}
$cat group_vars/all
web: 11
web1: 22
(ansible-env)
$cat t5.yml
- hosts: webservers
tasks:
- name: Output Vaiables"
debug:
msg:
- "{{ web }}"
- "{{ web1 }}"
根据不同系统操作不同版本
注意 www 用户是有sudo 权限
---
- hosts: webservers
become: yes
become_user: www
tasks:
# 通过fact变量判断系统为centos才会安装httpd
- name: Centos Install httpd
yum: name=httpd state=present
when: (ansible_distribution == "CentOS")
# 通过fact变量判断系统为ubuntu才会安装httpd2
- name: Ubuntu Install httpd
yum: name=httpd2 state=present
when: (ansible_distribution == "Ubuntu")
传递多个外置变量
ansible-playbook f5.yml -i hosts -e
"web_packages=GeoIP" -e "ftp_packages=telnet"
举例几个不同的示例
- hosts: all
tasks:
- name:
shell: netstat -lntp
register: System_Status
- name: Get System Status
debug: msg={{System_Status.stdout_lines}}
- hosts: webservers
tasks:
- name: Output variables ansible facts
debug:
msg: >
this default IPv4 address "{{ ansible_fqdn}}" is "{{ ansible_default_ipv4.address }}"
- hosts: all
tasks:
- name: Ignore False
command: /bin/false
ignore_errors: yes
- name: touch new file
file: path=/tmp/old state=touch
facts
用来采集客户端信息,
ansible localhost -m setup -a "filter="ansible_default_ipv4""
when
when 判断在 Ansible 中的使用频率非常高;比如 yum 模块可以自动检测软件包是
否已被安装,而无需人为干涉,但对于有些任务则是需要进行判断才可以实现的。
比如: web 节点都需要配置 nginx 仓库,但其他节点并不需要,此时就会用到
when 判断。
比如: Centos 与 Ubuntu 都需要安装 Apache ,而 Centos 系统软件包为
httpd ,而 Ubuntu 系统软件包为 httpd2 ,那么此时就需要判断主机系统,然
后为不同的主机系统安装不同的软件包。
hen: (ansible_hostname is match("web*"))
主机名不为web的不做任何处理
loop
loop 是重复
- hosts: web
tasks:
- name: Add Users
user:
name: {{ item.name }}
groups: {{ item.groups }}
state: present
loop:
- { name: 'testuser1', groups: 'bin' }
- { name: 'testuser2', groups: 'root' }
- hosts: all
tasks:
- name: Configure Rsync Server
copy: src={{ item.src }} dest=/etc/{{ item.dest }} mode={{
item.mode }}
with_items:
- {src: "rsyncd.conf", dest: "rsyncd.conf", mode: "0644"}
- {src: "rsync.passwd", dest: "rsync.passwd", mode:
"0600"}
handlers 与 notify
Handlers 是一个触发器,同时是一个特殊的 tasks ,它无法直接运行,它需要被
tasks 通知后才会运行。比如: httpd 服务配置文件发生变更,我们则可通过
Notify 通知给指定的 handlers 触发器,然后执行相应重启服务的操作,如果配
置文件不发生变更操作,则不会触发 Handlers 任务的执行;
如果配置文件发生变化会调用该handlers下面的对应名称的task
handlers:
- name: Restart Httpd Server
service: name=httpd state=restarted
handlers 注意事项
1.无论多少个 task 通知了相同的 handlers , handlers 仅会在所有
tasks 结束后运行一次。
2.只有 task 发生改变了才会通知 handlers ,没有改变则不会触发
handlers
3.不能使用 handlers 替代 tasks 、因为 handlers 是一个特殊的 tasks
tags 任务标签
默认情况下, Ansible 在执行一个 playbook 时,会执行 playbook 中所有的任
务。而标签功能是用来指定要运行 playbook 中的某个特定的任务;
1.为 playbook 添加标签的方式有如下几种:
对一个 task 打一个标签
对一个 task 打多个标签
对多个 task 打一个标签
2. task 打完标签使用的几种方式
-t 执行指定tag标签对应的任务
--skip-tags 执行除 --skip-tags 标签之外的所有任务
ansible-playbook --skip-tags install_server
xxx.yml
标签结合include
[root@ansible ~]# cat main.yml
- hosts: localhost
tasks:
- name: Installed Tomcat8 Version
include: install_tomcat8.yml
tags: tomcat8
- name: Installed Tomcat9 Version
include: install_tomcat9.yml
tags: tomcat9
异常处理
- hosts: webservers
tasks:
- name: configure httpd server
template:
src: ./httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
notify: Restart Httpd Server
- name: Check HTTPD
shell: /usr/sbin/httpd -t
register: httpd_check
failed_when: httpd_check.rc != 0 or '"OK"' not in httpd_check.stdout
- name: start httpd server
service:
name: httpd
state: started
enabled: yes
handlers:
- name: Restart Httpd Server
systemd:
name: httpd
state: restarted
nginx 的异常处理
- hosts: webserver
tasks:
- name: Install Nginx Server
yum:
name: nginx
state: present
- name: Configure Nginx Server
template:
src: ./nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart Nginx Server
- name: Check Nginx Server
shell: /usr/sbin/nginx -t
register: check_nginx
changed_when: '"successful" in check_nginx.stdout'
- name: Start Nginx Server
service:
name: nginx
state: started
enabled: yes
handlers:
- name: Restart Nginx Server
systemd:
name: nginx
state: restarted
在这个标准格式的 Playbook 中,我们在"hosts"中指定了目标主机组,并定义了多个任务。每个任务都有一个名称以及对应的模块和参数。
要解决场景1,即要求每台主机的端口都不一样,可以在 Jinja2 模板文件 (nginx.conf.j2) 中使用变量来动态设置端口号。例如,可以通过定义一个名为nginx_port的变量,并在模板文件中使用它来设置 Nginx 的监听端口。
要解决场景2,即使用 Jinja2 模板来修改被管理主机的配置文件,我们使用了template模块。该模块会将指定的模板文件复制到远程主机,并在复制过程中解析文件中的变量值。
在"Check Nginx Server"任务中,我们使用了changed_when来定义任务的改变条件。只有当检查 Nginx 配置的输出中包含"successful"时,任务才会被标记为已改变。
最后,在处理程序部分,我们定义了一个名为"Restart Nginx Server"的处理程序,它会在被通知时使用systemd模块重启 Nginx 服务。
请注意,Ansible Playbook 的格式要求严格,正确的缩进和符号使用非常重要。以上提供的输出已经按照标准格式进行了调整。
jinja2
Jinja2 是 Python 的全功能模板引擎
Ansible 需要使用 Jinja2 模板来修改被管理主机的配置文件。
ansible 使用 jinja2 模板需要借助 template 模块实现,那 template 模块是用
来做什么的?
template 模块和 copy 模块完全一样,都是拷贝文件至远程主机,区别在于
template 模块会解析要拷贝的文件中变量的值,而 copy 则是原封不动的将文件拷
贝至被控端。
roles
更加规范,更加标准的去灵活安排你维护的业务
roles 示范
$tree base_module/
base_module/
├── files
├── handlers
├── tasks
│ ├── main.yml
│ └── main.yml_bak
└── templates
tree nginx/
nginx/
├── files
├── handlers
│ └── main.yml
├── meta
├── tasks
│ ├── main1.yml
│ ├── main2.yml
│ └── main.yml
└── templates
└── nginx.conf.j2
cat site.yml
- hosts: all
roles:
- base_module
- name: Install and Configure Nginx
hosts: your_host
become: yes
become_user: www
roles:
- nginx
$cat base_module/tasks/main.yml
- name: Disable Selinux
selinux:
state: disabled
- name: Disable Firewalld
systemd:
name: firewalld
state: stopped
enabled: no
- name: Installed Base SoftWare
yum:
name: "{{ item }}"
state: present
loop:
- wget
- lrzsz
- bind-utils
- net-tools
- unzip
- vim
文章来源:https://blog.csdn.net/startfefesfe/article/details/134922999
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!