飞天使-linux操作的一些技巧与知识点6-ansible结合jinja2使用,可规范化进行自动化管控

文章目录

在议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
相关推荐
柳鲲鹏5 分钟前
WINDOWS最快布署WEB服务器:apache2
服务器·前端·windows
无敌暴龙兽z2 小时前
离线环境安装elk及设置密码认证
运维·elk
M4K02 小时前
Linux百度网盘优化三板斧
linux
好奇的菜鸟3 小时前
如何在 Ubuntu 24.04 (Noble) 上使用阿里源
linux·运维·ubuntu
bcbobo21cn3 小时前
初步了解Linux etc/profile文件
linux·运维·服务器·shell·profile
wayuncn3 小时前
月付物理服务器租用平台-青蛙云
运维·服务器·服务器租用·服务器托管·物理机租用
望获linux3 小时前
【实时Linux实战系列】CPU 隔离与屏蔽技术
java·linux·运维·服务器·操作系统·开源软件·嵌入式软件
0wioiw04 小时前
C#基础(项目结构和编译运行)
linux·运维·服务器
2401_873587825 小时前
Linux常见指令以及权限理解
linux·运维·服务器
RW~5 小时前
Minio安装配置,桶权限设置,nginx代理 https minio
运维·nginx·https·minio