Ansible的使用3

[复制链接]
发表于 2025-9-29 21:01:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
#### 一、Ansible增补模块
try    ()    {
}    catch    ()    {
}    finally
等同于
block    ()    {
}    rescue    ()    {
}    always
##### 使命块
- block使命块
  - 通过block关键字,将多个使命组合到一起
  - 将整个block使命组,一起控制是否要实行
```shell
# 判断webservers主机组内主机体系发行版为Rocky的主机,安装nginx并启动服务
- name: block tasks
  hosts: webservers
  tasks:
    - name: group tasks
      block:
        - name: install nginx
          yum:
            name: nginx
            state: present
        - name: start nginx
          service:
            name: nginx
            state: started
            enabled: true
      when: ansible_distribution == "Rocky"     #条件作用与整组使命
```
- rescue和always
  - 用于增补block使命
  - block中的使命都实行乐成则rescue中的使命不实行
  - block中的使命出现失败则实行rescue中的使命
  - always中的使命总会实行
```shell
# 测试block使命实行乐成
- name: test block/rescue/always
  hosts: webservers
  tasks:
    - name: test
      block:
        - name: touch file1
          file:
            path: /tmp/test1.txt
            state: touch
      rescue:
        - name: touch file2
          file:
            path: /tmp/test2.txt
            state: touch
      always:
        - name: touch file3
          file:
            path: /tmp/test3.txt
            state: touch
```
##### loop循环
- 批量数值载入变量时使用loop循环,等同于for循环
- 特点是loop中的变量名固定为:item
```shell
## 变量界说方法
    简单变量:单个元素赋值给item
        loop: [a,b,c,d]
        #或
        loop:
          - a
          - b
          - c
    复杂变量:团体赋值给item,可以用item.key获取指定value
        loop: 
          - {"key": "value", "key": "value"}
- name: create dir
  hosts: webservers
  tasks:
    - name: create dir with loop
      file:
        path: /tmp/{{item}}
        state: directory
      loop:
        - aa
        - bb
        - cc
- name: create users
  hosts: webservers
  tasks:
    - name: create user with loop
      user:
        name: "{{item.iname}}"
        password: "{{item.ipass|password_hash('sha512')}}"
        state: present
      loop:
        - {"iname":"test01", "ipass":"123456"}
        - {"iname":"test02", "ipass":"654321"}
```
#### 二、Ansible脚色
> playbook范围在于大量文件无法管理的情况,编写后的大量Playbook文件以及调用文件,云云海量、无序的文件只有使用"脚色"管理yml文件
- roles是ansible自1.2版本引入的新特性,用于条理性、布局化地构造playbook
- roles可以大概根据条理型布局自动装载变量文件、tasks以及handlers等
- 要使用roles只须要在playbook中使用include指令引入即可
- roles分别将变量、文件、使命、模板及处理处罚器放置于单独的目次中,并可以便捷的include
- roles一样平常用于基于主机构建服务的场景中,但也可以是用于构建守卫进程等场景中
<img src="19901269-0375cab5a41cada6.jpeg" style="zoom:50%;" />
```shell
roles:                  #脚色必须放在roles目次下,可以自界说位置,默认/etc/ansible/roles/
    project:            #脚色项目名称
        files:          #用于存放静态文件,如copy或script模块须要调用的文件
        templates:      #用于存放动态文件,即jinja2模板,template模块会自动到此目次下探求模板文件
        tasks:          #界说使命列表的地方
            main.yml        #使命列表内容编写在此文件中
        handlers:       #界说触发器的地方
            main.yml        #触发器内容编写在此文件中
        vars:           #界说变量的地方(优先级高)
            main.yml        #变量界说在此文件中
        defaults:       #界说变量缺省值的地方(优先级低)
            main.yml
        meta:           #界说作者、版本等形貌信息、依靠关系等
            main.yml
        README.md       #整个脚色的形貌信息
```
##### Roles使用方法
```shell
# 修改ansible.cfg设置文件
[defaults]
inventory = inventory
host_key_checking = false
module_name = shell
nocows = true
roles_path = ./roles
# 查察现有脚色
ansible-galaxy list
# 创建脚色
ansible-galaxy init roles/motd
## 设置脚色三部曲
# 在templates目次下---创建模板文件
vim roles/motd/templates/motd.j2
Hostname: "{{ansible_hostname}}"
Date: "{{ansible_date_time.date}}"
Contact to: "{{admin}}"
# 在vars目次下---创建变量
vim roles/motd/vars/main.yml
---
# vars file for roles/motd
admin: "test@tedu.cn"
# 在tasks目次下---创建使命
vim roles/motd/tasks/main.yml
## 使用脚色
vim role_motd.yml
- name: modify motd with role
  hosts: webservers
  roles:
    - motd
ansible-playbook role_motd.yml
```
##### Roles训练
```shell
## 创建一个脚色用于安装指定软件
# 创建脚色
ansible-galaxy init roles/pkgs
## 设置脚色三部曲
# 创建模板文件、创建变量文件、创建使命文件
vim roles/pkgs/tasks/main.yml
- name: install pkg
  yum:
    name: "{{pkg}}"
    state: present
vim roles/pkgs/defaults/main.yml
pkg: nginx
```
#### 三、Ansible加密解密文件
#### ansible-vault下令
> 该下令用于实现数据加密/解密
```shell
## 常用选项
    encrypt:加密
    decrypt:解密
    view:查察
    rekey:重置暗码
# 加密文件
ansible-vault encrypt hello.txt
# 解密文件
ansible-vault decrypt hello.txt
# 重置暗码
ansible-vault rekey hello.txt
# 不解密文件查察内容
ansible-vault view hello.txt
# 使用暗码文件
ansible-vault encrypt --vault-password-file=pass.txt data.txt    #pass对data文件加密
ansible-vault decrypt --vault-password-file=pass.txt data.txt    #pass对data文件解密
ansible-vault view --vault-password-file=pass.txt data.txt        #不解密查察文件内容
# 加密脚本
ansible-vault encrypt user_test.yml
# 实行加密脚本
ansible-playbook --ask-vault-password user_test.yml
```
#### 四、sudo提权
##### sudo提权测试
sudo提权设置文件:/etc/sudoers
- 修改授权方法
  - visudo(带语法查抄,默认没有颜色提示)
  - vim /etc/sudoers(不带语法查抄,默认有颜色提示)
- 授权格式
```
用户名或组名(%groupname)      在会集认证域中有效,单机忽略      可以实行的下令列表
用户/组                        ALL=(ALL)                   NOPASSWD: ALL
```
##### Ansible设置sudo提权
```shell
# 被控节点创建用户并设置sudo提权
- name: sudo user
  hosts: all
  tasks:
    - name: create sudo user
      user:
        name: alice
        password: "{{'123456'|password_hash('sha512')}}"
        state: present
    - name: config sudo
      lineinfile:
        path: /etc/sudoers
        line: "alice ALL=(ALL) NOPASSWD: ALL"
        state: present
# 修改ansible设置文件
[root@pubserver ansible]# vim ansible.cfg 
[defaults]
...
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
```
#### 五、特殊的主机清单变量
> 如某个被控节点不能免密登录、ssh服务端口不是标准22端口等情况,则须要设置特殊的主机清单变量
```shell
## 常用设置
    ansible_ssh_host:指定被控节点服务器IP所在
    ansible_ssh_user:指定登岸远程主机的用户名
    ansible_ssh_pass:指定登岸远程主机的暗码
    ansible_ssh_port:指定登岸远程主机的端标语
# 设置特殊的主机清单变量
vim inventory
[group]
web1
web2
db1 ansible_ssh_host=192.168.88.13 ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass=a
```

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表