Skip to content

Ansible

script

creates -a 检测路径为被控主机的路径下的文件
yum -y install python-jinja2 PyYAML python-paramiko pythonbabel python-crypto
vim /etc/ansible/ansible.cfg
[defaults]
#inventory = /etc/ansible/hosts # 主机列表配置文件
#library = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp = $HOME/.ansible/tmp # 临时py命令文件存放在远程主
机目录
#local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录
#forks = 5 # 默认并发数,同时可以执行5次
#sudo_user = root # 默认sudo 用户
#ask_sudo_pass = True # 每次执行ansible命令是否询
问ssh密码
#ask_pass = True # 每次执行ansible命令是否询
问ssh口令
#remote_port = 22 # 远程主机的端口号(默认22)
建议优化项:
host_key_checking = False # 检查对应服务器的host_key,
建议取消注释
log_path=/var/log/ansible.log # 日志文件,建议取消注释
module_name = command # 默认模块
[webservers] webservers组
www1.xingyun.com:2222 可以指定端口
www2.xingyun.com
[dbservers]
db1.xingyun.com
db2.xingyun.com
db3.xingyun.com


[zxnbmk1]
192.168.242.81
[zxnbmk2]
192.168.242.82
ansible 主机名/ip/组 -m 模块名 -a 模块动作 -k(密码登录)
例: ansible 192.168.242.81 -m shell -a 'hostname' -k


常用模块:
[command]
模块作用:在远程主机执行命令,默认模块(ansible.cfg中可配置),可忽略-m选项

变量的优先级:命令行中的-e > playbook中定义的变量 > 主机清单中定义的变量

image-20241107165510717

Ansible之playbook

- name: "命令说明"
  # 命令详细
  copy: src=/etc/yum.repos.d/nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes

playbook语法

vi nginx.yaml


- hosts: zxnbmk1
  remote_user: root
  tasks:
   - name: "配置nginx yum源"
     copy: src=/etc/yum.repos.d/nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes
   - name: "更新yum缓存"
     shell: 'yum clean all'
   - name: "更新yum"
     shell: 'yum makecache'
   - name: "更新yum"
     shell: 'yum -y update'
   - name: "安装nginx"
     yum: name=nginx state=present
   - name: "copy一份 /etc/nginx/conf.d/"
     copy: src=/root/server.conf dest=/etc/nginx/conf.d/server.conf backup=yes
   - name: "注释"
     shell: 'mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.back'
   - name: "创建目录/etc/nginx/html/"
     file: path=/etc/nginx/html/ recurse=True
   - name: "导游戏包"
     copy: src=/root/qmfjdz/ dest=/etc/nginx/html/
   - name: "关闭防火墙"
     systemdctl: name=nginx stat=stop
   - name: "启动 "
     service: name=nginx state=started
  handlers:
   - name: "重启nginx"
     service: name=nginx state=restart


----------------------------------------------------------
# 运行文件
ansible-playbook nginx.yaml -k

handlers和notify触发器

- hosts: zxnbmk1
  remote_user: root
  tasks:
    - name: "第一个变量执行"
      shell: "echo {{ var1 }}"
      notify: restart httpd # 只要上面的命令是引起变化的,那么就触发底下的handlers
    - name: "第二个变量执行"
      file: path=/{{ var2 }}.txt state=directory
  handlers:
    - name: restart httpd

setup变量

ansible_all_ipv4_addresses:仅显示ipv4的信息。
ansible_devices:仅显示磁盘设备信息。
ansible_distribution:显示是什么系统,例:centos,suse等。
ansible_distribution_major_version:显示是系统主版本。
ansible_distribution_version:仅显示系统版本。
ansible_machine:显示系统类型,例:32位,还是64位。
ansible_etns33:仅显示ens33的信息。
ansible_hostname:仅显示主机名。
ansible_kernel:仅显示内核版本。
ansible_lvm:显示lvm相关信息。
ansible_memtotal_mb:显示系统总内存。
ansible_memfree_mb:显示可用系统内存。
ansible_memory_mb:详细显示内存情况。
ansible_swaptotal_mb:显示总的swap内存。
ansible_swapfree_mb:显示swap内存的可用内存。
ansible_mounts:显示系统磁盘挂载情况。
ansible_processor:显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus:显示cpu个数(只显示总的个数)。


---------------------------------------------------------------------
# 直接使用案例
ansible all -m setup -a 'filter="ansible_nodename"'
# yaml文件使用
vi ceshi.yaml

---
- hosts: zxnbmk1
  remote_user: root
  tasks:
  - name: "setup案例仅显示ipv4的信息"
    debug:
     msg: "{{ ansible_all_ipv4_addresses }}"
  - name: "仅显示eth0的信息"
    debug:
     msg: "{{ ansible_ens33 }}"

在独立的变量yaml文件中定义

vi vars.yaml

var1: "变量一"
var2: "变量二文件"

vi var_yaml.yaml

---
- hosts: zxnbmk1
  remote_user: root
  vars_files:
  - vars.yaml
  tasks:
    - name: "第一个变量执行"
      shell: "echo {{ var1 }}"
    - name: "第二个变量执行"
      file: path=/{{ var2 }}.txt state=directory

变量注册debug

register关键字可以将某个 task 任务结果存储至变量中,最后使用 debug模块 输出变量内容,可以用于后续排障;

变量基本使用

---
- hosts: zxnbmk1
  remote_user: root
  tasks:
  - name: "变量注册示例"
  # 注意这里没安装netstst会报错,可以换成ls命令
    shell: 'netstat -ntlp'
    register: port_status
  - name: "打印变量port_status"
    debug: msg={{ port_status.stdout_lines }}
    # 注意这里的stdout_lines作用是只输出命令的内容。
  

模板templates

模板是一个文本文件,可以做为生成文件的模版,并且模板文件中还可嵌套jinja语法

  • jinja2 语言使用字面量,有下面形式:
  • 字符串:使用单引号或双引号
  • 数字:整数,浮点数
  • 列表:[item1, item2, …]
  • 元组:(item1, item2, …)
  • 字典:{key1:value1, key2:value2, …}
  • 布尔型:true/false
  • 算术运算:+, -, *, /, //, %, **
  • 比较操作:==, !=, >, >=, <, <=
  • 逻辑运算:and,or,not
  • 流表达式:For,If,When

template功能:可以根据和参考模块文件,动态生成相类似的配置文件 template文件必须存放于templates目录下,且命名为 .j2 结尾 yaml/yml 文件需和templates目录平级,目录结构如下示例: ./ ├── temnginx.yml └── templates └── nginx.conf.j2

template中使用流程控制 for 和 if

for

[root@CentOS-mini16 ~]# tree yml/
yml/
├── nginx.yaml
├── temnginx.yaml
└── templates
    └── nginx.conf.j2




# 准备templates/nginx.conf.j2文件
vi ./templates/nginx.conf.j2

{% for vhost in vhosts %}
第{{ vhost }}
{% endfor %}



vim temnginx.yml

---
- hosts: zxnbmk1
  remote_user: root
  vars:
   vhosts:
    - 1
    - 2
    - 3
    - 4
   tasks:
    - name: "测试templates"
      template: src=templates/nginx.conf.j2 dest=/root/aa.txt

创建role

创建role的步骤 (1) 创建以roles命名的目录 (2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等 (3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和 vars目录;用不到的目录可以创建为空目录,也可以不创建 (4) 在playbook文件中,调用各角色

# 创建httpd角色

1> 创建roles目录
    mkdir roles/httpd/tasks -pv
    mkdir roles/httpd/{handlers,files}
查看目录结构
tree roles/
tree roles/
roles/
├── httpd
 ├── files
 ├── handlers
 └── tasks

2> 创建目标文件
    cd roles/httpd/tasks/
    touch install.yml config.yml service.yml

3> vim install.yml
    - name: install httpd package
      yum: name=httpd

    vim config.yml
    - name: config file
      copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes

    vim service.yml
    - name: start service
      service: name=httpd state=started enabled=yes

4> 创建main.yml主控文件,调用以上单独的yml文件,
main.yml定义了谁先执行谁后执行的顺序
main.yml定义了谁先执行谁后执行的顺序
vim main.yml
    - include: install.yml
    - include: config.yml
    - include: service.yml

5> 准备httpd.conf文件,放到httpd单独的文件目录下
cp /app/ansible/flies/httpd.conf ../files/

6> 创建一个网页
vim flies/index.html
<h1> welcome to weixiaodong home <\h1>

7> 创建网页的yml文件
vim tasks/index.yml
    - name: index.html
      copy: src=index.html dest=/var/www/html
8> 将网页的yml文件写进main.yml文件中
vim main.yml
    - include: install.yml
    - include: config.yml
    - include: index.yml
    - include: service.yml
9> 在handlers目录下创建handler文件main.yml
vim handlers/main.yml
    - name: restart service httpd
      service: name=httpd state=restarted

10> 创建文件调用httpd角色(与httpd同级)
cd /app/ansible/roles
vim role_httpd.yml
    ---
    # httpd role
    - hosts: appsrvs
      remote_user: root
      roles: #调用角色
       - role: httpd

11> 查看目录结构
tree .
httpd
├── files
 ├── httpd.conf
 └── index.html
├── handlers
 └── main.yml
└── tasks
    ├── config.yml
    ├── index.yml
    ├── install.yml
    ├── main.yml
    └── service.yml

12> ansible-playbook role_httpd.yml

Comments