ansible的常用的模块

ansible查看模块的帮助的命令

ansible-doc 模块的名字

一:file模块

file模块是关于文件一些操作的模块

1:查看file模块的帮助文档

[q7@controller ansible]$ ansible-doc file

EXAMPLES:

- name: Change file ownership, group and permissions
  file:
    path: /etc/foo.conf
    owner: foo
    group: foo
    mode: '0644'

- name: Give insecure permissions to an existing file
  file:
    path: /work
    owner: root

2:file模块常用的一些参数

path:必须存在的参数,用于指定要操作文件或者目录

state:有很多的值,touch--创建文件,directory为创建文件夹,hard为创建硬链接,link为创建软连接

src:当创建硬链接或者软连接的时候,sre可以指定链接源

force:就是强制的意思,当state的值为link的时候,

强制创建链接文件有三种方式,

第一种:就是链接源的路径不存在的时候,会强制创建一个链接文件

第二种:就是在创建链接文件的目录中有同名的存在的时候,会覆盖掉原来的链接文件,就是删除

第三种:创建链接文件的目录中有同名的时候,并且连接文件的路径不存在的时候,也会强制替换掉同名的文件为链接文件

owner:用于指定文件的属主,文件的属主在远程用户中必须存在

group:用于指定文件的属组,文件的属组在远程用户组中必须存在

mode:用于指定被操纵文件的权限,可以用数字或者rwx来表示,rwx来表示的时候,需要用逗号隔开,比如755,u=rwx,g=rw

recurse:当要操作文件为目录,可以将resource设置为yes,可以递归的修改目录中文件的属性

3:一些列子

有一个疑问:就是我是以普通用户登录上去的,为什么创建文件的时候,还是root用户呢?

在使用普通用户控制被控节点创建文件时,文件属主为root用户是因为在ansible的控制端中,使用了sudo或su等命令来提升普通用户的权限,使其具有root用户的权限来执行操作。因此,创建的文件的属主就是root用户。如果想要更改文件的属主,可以在ansible的playbook中使用file模块的owner参数来指定文件的属主。

 

如果使用ansible命令的很短的的话,使用ad-hoc就行了

创建链接文件时,如果不使用force这个参数,那么被控节点一定要有源文件,否则会报错(我在这里纠结了一会,一直在报错,一定要注意下)  

1)创建一个硬链接文件

[q7@controller ansible]$ ansible test -m file -a "src=/mnt/11.txt state=hard path=/mnt/11_hard "
client | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": true,
    "dest": "/mnt/11_hard", 

 硬链接文件和源文件一样,对硬链接文件进行修改,源文件的内容也会修改

2)创建一个软连接文件

[q7@controller ansible]$ ansible test -m file -a "src=/mnt/11.txt state=link path=/mnt/11_link "
client | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": true,
    "dest": "/mnt/11_link", 

 在被控节点上查看硬链接和软连接文件

[q7@client mnt]$ ls
11_hard  11_link  11.txt  hgfs
[q7@client mnt]$ 

  

3)使用force参数

情况1:就是源文件不存在,使用force

情况2:就是创建链接文件的目录有同名的文件,替换成链接文件

情况3:就是源文件不存在,并且有同名的文件,替换成链接文件

[q7@client mnt]$ ls
11_hard  11_link  11.txt  22link  hgfs
[q7@client mnt]$ 
#源文件不存在,但是有同名的情况下,替换成链接文件
[q7@controller ansible]$ ansible test -m file -a "src=/mnt/22 state=link path=/mnt/22link force=yes "
[q7@client mnt]$ ll
total 0
-rw-r--r--. 2 root root  0 Nov 13 00:50 11_hard
lrwxrwxrwx. 1 root root 11 Nov 13 00:57 11_link -> /mnt/11.txt
-rw-r--r--. 2 root root  0 Nov 13 00:50 11.txt
lrwxrwxrwx. 1 root root  7 Nov 13 01:03 22link -> /mnt/22
drwxr-xr-x. 2 root root  6 Nov 10 18:12 hgfs
[q7@client mnt]$ 

 

4)删除被控节点的链接文件

[q7@controller ansible]$ ansible test -m file -a "path=/mnt/22link state=absent"
[q7@client mnt]$ ls
11_hard  11_link  11.txt  hgfs
[q7@client mnt]$ 

 

5)创建目录,修改属主和属组

属主和属组都为q7

[q7@controller ansible]$ ansible test -m file -a "path=/mnt/33.txt state=directory owner=q7 group=q7" 

查看被控节点的这个目录

[q7@client mnt]$ ll
total 0
-rw-r--r--. 2 root root  0 Nov 13 00:50 11_hard
lrwxrwxrwx. 1 root root 11 Nov 13 00:57 11_link -> /mnt/11.txt
-rw-r--r--. 2 root root  0 Nov 13 00:50 11.txt
drwxr-xr-x. 2 q7   q7    6 Nov 13 01:09 33.txt  

在这个目录下创建文件

[q7@controller ansible]$ ansible test -m file -a "path=/mnt/33.txt/qq.txt state=touch"

#查看被控节点
[q7@client 33.txt]$ ll
total 0
-rw-r--r--. 1 root root 0 Nov 13 01:12 qq.txt
[q7@client 33.txt]$  

发现在该文件里面创建的文件都是root用户

 

6)递归的操作(recurse)

在33.txt这文件中再创建一个文件夹44。在44这个文件里面在创建一个文件44-1

44的文件夹里面都是root用户和root用户组

都修改为q7

[q7@controller ansible]$ ansible test -m file -a "path=/mnt/33.txt/44 state=directory recurse=yes owner=q7 group=q7"
#查看被控节点
[q7@client 33.txt]$ ll -R
.:
total 0
drwxr-xr-x. 2 q7   q7   18 Nov 13 01:18 44
-rw-r--r--. 1 root root  0 Nov 13 01:12 qq.txt

./44:
total 0
-rw-r--r--. 1 q7 q7 0 Nov 13 01:18 44-1
[q7@client 33.txt]$  

都被修改了,但是33.txt这个文件夹里面没有被修改,44这个文件夹及其目录下的文件都被修改了

 

 

 

 

二:user模块和group模块

user模块是关于用户相关的操作

1:首先可以查看user模块的帮助文档

[q7@controller ansible]$ ansible-doc user
#搜索EXAMPLES快速的找到列子
EXAMPLES:

- name: Add the user 'johnd' with a specific uid and a primar>
  user:
    name: johnd
    comment: John Doe
    uid: 1040
    group: admin

- name: Add the user 'james' with a bash shell, appending the>
  user:
    name: james
    shell: /bin/bash
    groups: admins,developers
    append: yes

- name: Remove the user 'johnd'
  user:

2:user模块常用的参数

name:必须参数,用于指定要操作的用户名称

group:用于指定用户的主要组

groups:用于指定用户的附加组,注意的就是,如果用户已经存在了,并且有很多的附加组的话,再次添加到附加组中的话,就要加上append参数来设置附加组,否则,原来的会被替换掉

append:就是如果用户有很多的附加组的话,想要继续添加的话,又不想原来的附加组被覆盖掉的话,append设置为yes,表示追加附加组到现有的附加组设置,append默认值为no

shell:用于指定用户的默认shell

uid:指定用户的uid

comment:用于指定用户的注释信息

state:用于指定用户是否存在远程主机中,可选的值为,present(添加),absent(删除),默认是present

remove:当state的值设置为absent,表示要删除远程主机的用户,但是在删除用户时,不会删除用户的家目录,应为remove的参数默认值为no,如果想要删除用户的家目录,remove的值为yes,就可以彻底的删除干净

password:设置用户的密码,但是这个密码必须使经过哈希加密的才行,

格式为:

password: "{{'123'|password_hash('sha512')}}"

就是先有双引号,2个花括号,加上password_hash('sha512')

update_password:有2个值可以选,always,就是password参数设置的值与当前用户设置的值不一样的话,就更新密码,on_create,就是password设置的值与当前用户不一样的话,不会更新密码,如果是创建新的用户,参数的值为on_create,也会把用户的密码设置为password的值

 

 

3:列子

以上的列子我用的是剧本来写的啊,没有使用ad-hoc

1)创建用户

创建一个joe的用户,uid为2020,家目录为/home/jjoe,添加多个附加组,,主要组为joe,注释:我是joe,shell默认是/bin/bash,密码设置为123456

---
- hosts: test
  tasks:
    - name: create joe...
      user:
        name: joe
        uid: 2020
        home: /home/joe
        groups: a,b
        shell: /bin/bash
        password: "{{'123456'|password_hash('sha512')}}"
        comment: woshijjoe
        state: present

#执行该剧本
[q7@controller ansible]$ ansible-playbook useradd_joe.yaml  

就是主要组不设置任何值的,默认就是以用户本身为主要组

在被控节点上查看joe用户

[root@client /]# id joe
uid=2020(joe) gid=2020(joe) groups=2020(joe),2001(a),2002(b)

  

2)更改用户的附加组

第一种:不使用append参数

---
- hosts: test
  tasks:
    - name: modify joe
      user:
        name: joe
        groups: q7 

在被控节点上查看joe的信息

[root@client /]# id joe
uid=2020(joe) gid=2020(joe) groups=2020(joe),1000(q7) 

可以看到,joe之前的附加组被q7这个附加组覆盖掉了

第二种:使用append参数

---
- hosts: test
  tasks:
    - name: modify joe
      user:
        name: joe
        groups: q7,a,b
        append: yes 

查看joe用户的信息

[root@client /]# id joe
uid=2020(joe) gid=2020(joe) groups=2020(joe),1000(q7),2001(a),2002(b) 

可以看出使用了append的参数的话,原来的附加组不会被覆盖掉

所以,如果想要添加附加组的话,又不想要被覆盖掉的话,就是使用append这个参数

3:删除用户

删除用户要带上remove的选项,这样就能删除干净相当于userdel -r 这个选项

---
- hosts: test
  tasks:
    - name: absent joe
      user:
        name: joe
        state: absent
        remove: yes 

在被控节点上查看joe用户的信息

[root@client /]# id joe
id: ‘joe’: no such user
[root@client /]#  
[root@client /]# cd /home/
[root@client home]# ls
a  b  q7
[root@client home]#  

家目录下没有joe用户的信息了,则代表这彻底的删除干净了

 

 4:group模块常用的参数

就是创建组,gid

name:就是创建一个组

state:prsent和absent

gid:设置组的gid

---
- hosts: test
  tasks:
    - name: add group
      group:
        name: rrr
        state: present

  

 

 

  

 

 

 

  

 

 

三:shell模块

 

四:yum_repository模块

 就是关于管理远程主机上的yum源的配置文件的编写

1:查看帮助文档

[q7@controller ansible]$ ansible-doc yum_repository
EXAMPLES:

- name: Add repository
  yum_repository:
    name: epel
    description: EPEL YUM repo
    baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/

2:常用的参数

name:用于指定要操作的唯一仓库的id,也就是方括号内的仓库的id

baseurl:此参数用于设置yum仓库的baseurl

description:此参数用于设置仓库的注释信息,就是name字段的意思

file:用于设置仓库的配置文件的名称,即就是.repo配置文件的文件名前缀,没有的话,默认会用name参数的仓库名称,一个repo配置文件可以存在多个yum源

enabled:用于设置是否激活对应的yum源,默认为yes

gpgcheck:用于是否开启rpm包验证功能,默认为no,

gpgcheckey:为yes时,指定验证包所需的公钥

state:默认值为present,当设置为absent时,表示删除对应的yum源

3:案列

我用剧本编写的

1)编写多个yum源的配置文件

都写在一个配置文件中的话,使用file这个参数指定repo的前缀名都是一致的就行了

[q7@controller ansible]$ vim yum_repository.yaml 
---
- hosts: test
  tasks:
    - name: createAppStreamrepo
      yum_repository:
        name: AppStream
        description: AS
        baseurl: file:///media/AppStream
        gpgcheck: no
        enabled: yes
        file: local
        state: present
    - name: createBaseOSrepo
      yum_repository:
        name: BaseOS
        description: BS
        baseurl: file:///media/BaseOS
        gpgcheck: no
        enabled: yes
        state: present
        file: local

2)删除单独的repo配置文件

---
- hosts: test
  tasks:
    - name: remove unique repo
      yum_repository:
        name: AppStream
        state: absent
        file: local

删除的时候,就是要指定repo的文件名称---file ,state的值为absent,name的值为要删除的仓库名称

 

 

五:yum模块

yum模块就是在远程主机上通过yum源管理软件包

1:查看帮助文档

[q7@controller ansible]$ ansible-doc yum
EXAMPLES:

- name: install the latest version of Apache
  yum:
    name: httpd
    state: latest

- name: ensure a list of packages installed
  yum:
    name: "{{ packages }}"

2:常用的参数

name:必须的参数,用于指定需要管理的软件包,比如httpd

state:用于指定软件包的状态,默认值为present,installed与present等效,latest表示安装yum中最新的版本,absent和removed等效,表示删除对应的软件包

enablerepo:用于指定安装软件包临时启用yum源,值为yes,就是不确定这个源是否启动的话,就是用

disablerepo:用于指定安装软件包临时禁用的yum源,就是当多个yum源同时存在要安装的软件包时,你可以使用这个参数禁用某个源,设置后,安装时,就不会从对应源中选择软件包

disable_gpg_check:禁用rpm包的公钥gpg验证,默认值为no,表示不禁用验证,设置为yes,即不验证包,直接安装,在对应的的yum源没有开启gpg验证的情况下,需要将此参数设置为yes,否则会报错,从而无法进行安装

3:列子

1)安装httpd包

---
- hosts: test
  tasks:
    - name: install httpd
      yum:
        name: httpd
        state: present

 

2:临时禁用repo

就是当有多个源有相同的软件包的时候,可以禁用一个源,安装的时候避免从那个源中安装软件

 

 

 

六:service模块

就是关于服务的开机或者开机自启的服务的模块

1:查看帮助文档

EXAMPLES:

- name: Start service httpd, if not started
  service:
    name: httpd
    state: started

- name: Stop service httpd, if started
  service:
    name: httpd
    state: stopped

2:常用的参数

name:用于指定操作服务名称,如httpd

state:用于指定服务的状态,可选值有,started,stopped,restarted,reloaded

enabled:用于设置服务是否开机自启,可选值为,yes,no

3:案列

1)将httpd服务设置为开机自启,设置为启动

---
- hosts: test
  tasks:
    - name: 安装httpd服务
      yum:
        name: httpd
        state: present
    - name: 开机自启和启动httpd服务
      service:
        name: httpd
        state: started
        enabled: yes

#在被控节点上查看
[q7@client ~]$ systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2023-11-13 14:57:48 CST; 52s ago
     Docs: man:httpd.service(8)
 Main PID: 3755 (httpd)
   Status: "Running, listening on: port 80"
    Tasks: 213 (limit: 12106)

2)httpd服务设置为关闭,开机不自动启

---
- hosts: test
  tasks:
    - name: 开机不自启和关闭httpd服务
      service:
        name: httpd
        state: stopped
        enabled: no

#在被控节点上查看http服务的状态
[q7@client ~]$ systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd.service(8)
[q7@client ~]$ 

  

七:firewalld模块

https://blog.csdn.net/m0_46305762/article/details/107160317?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170074950516800197017718%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170074950516800197017718&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-4-107160317-null-null.142^v96^pc_search_result_base4&utm_term=ansible%E4%B8%AD%E7%9A%84firewalld%E6%A8%A1%E5%9D%97&spm=1018.2226.3001.4187

  

 常用的参数:

service:指定放行的服务

permanent:保存策略,下次启动的时候自动的挂载

state:指定防火墙的策略状态,enable表示策略生效,disbale表示禁用,present表示新建策略,absent表示删除策略

immediate:策略立即生效

 

列子:

1)放行ftp服务

---
- hosts: client
  tasks:
          - name: 放行 ftp
            firewalld:
                    service: ftp
                    state: enabled
                    permanent: true
                    immediate: yes

[root@client ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160 ens192
  sources: 
  services: cockpit dhcpv6-client ftp ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
[root@client ~]# 

 

就是永久生效  

 

 

八:copy模块(管理节点的主机文件------>>> 被控节点的主机)

 就是将ansible管理主机上的文件拷贝到远程主机上,fetch模块是从远程主机中拉取文件到ansible的管理主机

常用参数

src:用于指定需要copy的文件或者目录

dest:用于指定文件背靠背到远程主机的那个目录

content:当不使用src指定文件和目录,可以使用content直接定义文件内容,src与content2个参数必有其一

force:当远程主机的目标路径中有同名文件,并且内容不同时,可以使用强制覆盖,或者no,即不进行拷贝操作

mode:权限

owner:文件的属主

group:文件属组

backup:如果有同名的情况,是否备份,将远程的同名的进行备份

 

列子:

 将自己的文件复制到被管理主机

目录也可以,隐藏文件(不行)

---
- hosts: test
  tasks:
          - name: ddd
            copy:
                    src: /home/q7/ansible/hosts
                    dest: /mnt/ee

 

使用content参数

---
- hosts: test
  tasks:
          - name: copy
            copy:
                    dest: /mnt/qq
                    content: www\ndasda\n

 

强制copy

---
- hosts: test
  tasks:
          - name: copy
            copy:
                    dest: /mnt/11.txt
                    src: /home/q7/ansible/hosts
                    force: yes

  

备份

---
- hosts: test
  tasks:
          - name: copy
            copy:
                    dest: /mnt/11.txt
                    src: /mnt/ee
                    backup: yes

   

 

九:lineinfile模块

Ansible 常用模块之文件内容修改 blockinfile|lineinfile_ansible 修改远程文件不改变文件编码-CSDN博客

就是关于文本编辑的模块

 

就是确保某一行存在于指定的文件,或从文本里面删除某一行,插入某一行,替换某一行,使用正则表达式来匹配

常用的参数:

path:必须指定的参数,指定要操作的文件

line:指定文本内容

regexp:使用正则表达式匹配所对应的行,当替换文文本时,如果有多行文本都被匹配成功了,就只有最后一个被匹配的文本才会被替换掉,但删除文本时,如果有多行文本都被匹配了,就将这些内容全部删除掉

create:当要操作的文件并不存在时,是够创建对应文件

 

列子:

1)插入一行内容

确保指定的"一行文本"存在于文件中,如果指定的文本本来就存在于文件中,则不做任何操作,如果不存在,默认在文件的末尾插入这行文本

---
- hosts: client
  tasks:
          - name: append line aaa
            lineinfile:
                    path: /mnt/11.txt
                    line: ddd
                    create: yes
~                                  

 

[q7@client mnt]$ cat 11.txt 
aaa
bbb
ccc
ddd
[q7@client mnt]$ 

 

2)匹配的文本替换掉

---
- hosts: client
  tasks:
          - name: replace line aaa
            lineinfile:
                    path: /mnt/11.txt
                    regexp: "^aaa"
                    line: "kkk"


[q7@client mnt]$ cat 11.txt 
kkk
bbb
ccc
ddd
[q7@client mnt]$  

 

以后得以后写  

  

 

 

 10:mount模块

常用的参数:

path:挂载点

src:需要挂载的设备

fstype:挂载设备的文件系统

state:present,开机挂载,仅将配置文件写入/etc/fstab并不会真的挂载

            mounted 挂载设备,并将配置写入/etc/fstab,永久挂载,

            umounted   卸载设备,不会清除/etc/fstab中的配置

            absent 卸载设备,并清理/etc/fstab中的配置

 

 列子:

实现开机自动挂载

---
- hosts: test
  tasks:
          - name: mount
            mount:
                    src: /dev/cdrom
                    path: /media
                    fstype: iso9660
                    state: present
~                                 

永久挂载

---
- hosts: test
  tasks:
          - name: mount
            mount:
                    src: /dev/cdrom
                    path: /media
                    fstype: iso9660
                    state: mounted
~                                 
  

  

卸载设备,但是不会更改/etc/fstab中的数据

---
- hosts: test
  tasks:
          - name: mount
            mount:
                    src: /dev/cdrom
                    path: /media
                    fstype: iso9660
                    state: unmounted

 

永久卸载设备

---
- hosts: test
  tasks:
          - name: mount
            mount:
                    src: /dev/cdrom
                    path: /media
                    fstype: iso9660
                    state: absent

  

  

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

  

 

posted @ 2023-11-11 18:54  q_7  阅读(63)  评论(0编辑  收藏  举报