Asibleの研究ノート - 共通モジュール(A)

Ansible共通モジュール

ansible-doc -l | grep module_nameあなたがしたいモジュールを見つけます。そして、使用しansible-doc -s module_name、このモジュールの使用状況を表示します。

公式モジュールのリストと説明:https://docs.ansible.com/ansible/latest/modules_by_category.html

それを注意することは、モジュールの使用方法についてstate多くのモジュールが含まれているほぼすべてのオプションとその値を持つことになりますpresentし、absent正と負の意味を示しています。

自然ansibleモジュールの冪等の特性の大半は、シェルやコマンドモジュールとしてのみ少数のモジュールは、冪等を持っていません。いわゆる冪等は、同じ操作が最終的な結果には影響しません実行を繰り返し言及します。たとえば、パッケージがインストールされている場合、ansibleのはyumをインストールする、rpmパッケージモジュールをインストールし、再度何回が本当に実装されることはありませんインストールや操作を行います。

別の例として、ときコピーモジュールのファイルをコピーし、あなたはすでにターゲットホスト上で正確に同じファイルがある場合、その後、繰り返し実行されるコピーモジュールは、実際にコピーされません。実行ansible冪等モジュール、自動的に実行するか否かを判断します。

コマンドシェル

Ansible使用して、デフォルトのモジュールcommandいくつかのシェルコマンドを実行することができます。使用コマンドシェルと実際コマンドモジュールシェルを実行するために、実質的に同じ方法をリモート/ビン/ SHを行う、例えばAS /ビン/ SHピングです。

コマンドは、このような変数として、解決できない$HOMEと、いくつかの事業者"<", ">", "|", ";"以及"&"は、これらの使用は、その代わりに、シェルコマンドモジュールを使用するのでは、解決できないオペレータにオフにします。

シェル - ドキュメントのAnsible公用

コマンド - ドキュメントのAnsible公用

ansible-doc -s shell
- name: Execute commands in nodes.
       action: shell
    chdir          # 在执行命令前,先cd到指定的目录下
    creates        # 用于判断命令是否要执行。如果指定的文件(可以使用通配符)存在,则不执行。
    removes        # 用于判断命令是否要执行。如果指定的文件(可以使用通配符)不存在,则不执行。
    executable     # 不再使用默认的/bin/sh解析并执行命令,而是使用此处指定的命令解析。
                   # 例如使用expect解析expect脚本。必须为绝对路径。

使用シェルまたはコマンドモジュールansible必見の注意を払うが、それらはデフォルトの冪等に満足していない、多くの操作が繰り返し実行されますが、いくつかの操作を繰り返し実行することはできません。例えばMySQLの初期化コマンドMYS ql_ins T all_db、それは最初の構成時に一度初期化することができる必要とされない場合、他の任意の時点で、許可されていません。今回はモジュールを介して、冪等を達成するために、createsremoves裁判官のオプションに、いずれにせよ、これらの二つのモジュールの実装に実行されるコマンドは、冪等を実装する必要があるかどうかを検討する必要があります。

例としては、次のとおりです:

tasks:
  - shell: touch helloworld.txt creates=/tmp/hello.txt

しかし、可能なあいまいなパラメータの場合には、引数の使用がansibleパラメータを渡すために、あることを示唆しました。以下のような:

- shell: touch helloworld.txt
  args:
    creates: /tmp/hello.txt
# You can use shell to run other executables to perform actions inline
- name: Run expect to wait for a successful PXE boot via out-of-band CIMC
  shell: |
    set timeout 300
    spawn ssh admin@{{ cimc_host }}
    expect "password:"
    send "{{ cimc_password }}\n"
    expect "\n{{ cimc_name }}" send "connect host\n"
    expect "pxeboot.n12" send "\n"
    exit 0
  args:
    executable: /usr/bin/expect 
  delegate_to: localhost

コピーコピーモジュール

コピー - ドキュメントのAnsible公用

ansible-doc -l |grep copy

どのように使用するには:

ansible-doc -s copy

ansible-doc -s copy
- name: Copy files to remote locations
  copy:
      backup=[yes|no]:   # 拷贝的同时也创建一个包含时间戳信息的备份文件,默认为no
      dest:              # 目标路径,只能是绝对路径,如果拷贝的文件是目录,则目标路径必须也是目录
      content:           # 直接以content给定的字符串或变量值作为文件内容保存到远程主机上,它会替代src选项
      directory_mode:    # 当对目录做递归拷贝时,设置了directory_mode将会使得只拷贝新建文件,
                         # 旧文件不会被拷贝。默认未设置
      follow=[yes|no]:   # 是否追踪到链接的源文件。
      force=[yes|no]:    # 设置为yes(默认)时,将覆盖远程同名文件。设置为no时,忽略同名文件的拷贝
      group:             # 设置远程文件的所属组
      owner:             # 设置远程文件的所有者
      mode:              # 设置远程文件的权限。使用数值表示时不能省略第一位,如0644。
                         # 也可以使用'u+rwx'或'u=rw,g=r,o=r'等方式设置。
      src:               # 拷贝本地源文件到远程,可使用绝对路径或相对路径。如果路径是目录,且目录后加了
                         # 斜杠"/",则只会拷贝目录中的内容到远程,如果目录后不加斜杠,则拷贝目录本身和
                         # 目录内的内容到远程。

デフォルトでは、ansibleコピーは、ファイルにMD5をコピーする必要があるかどうかをチェックします、同じ意志それ以外の場合はコピーされ、コピーしません。セット力は= yesの場合、ファイルが同じでないとき場合(別のファイルの内容、すなわち)カバーのみMD5のコピー、ファイルのセット力=なし、他のコピーではないだけ。

コピーモジュールについてbackup、以下にいくつかの例を使用しました:

(1)ファイルがセットであっても、ターゲット・マシン上のコピーではないことがあるbackup=yesなど、便利ではありません。

ansible test -m copy -a "src=/tmp/temp/test.pub dest=/tmp backup=yes" -o -f 6

実行後、次のターゲットマシンの/ tmpディレクトリがtest.pubファイルの過去の唯一のコピーで、好きではなかったtest.pub.3286.2019-11-14@11:22:34~〜、バックアップファイルが表示されます

ターゲットは、ファイルのコピーである必要がありますが、サーバー側と対象ファイルが同一である場合(つまり、ファイルのサーバ側が変更されていない)(2)は、セットがあってもbackup=yesほとんど役に立ちません。

ターゲットマシン上のファイルをコピーすることがあるが、サーバー側のファイルとターゲットが同じでない場合(3)(すなわち、文書の変更内容をサーバ側)は、設定backup=yes、バックアップファイルは先のファイルパスでターゲットマシン上に表示されます、例えば:

# 我们更改下server端 test.pub 文件的内容,然后执行ansible
ansible test -m copy -a "src=/tmp/temp/test.pub dest=/tmp backup=yes" -o -f 6

# 我们登入到目标机上 /tmp 目录下查看,会发现有一个备份文件出现,即 test.pub.3286.2019-11-14@11:22:34~ ,它的内容就是上次 server 端copy过来的文件内容~

ディレクトリをコピーする場合、ターゲット・パスがディレクトリパスでなければなりません。あなたは「/」エンディングを使用している場合は、スラッシュ、プラスのディレクトリ内のディレクトリのファイルのコピーを終了しない場合、その後、ディレクトリ内のファイルをコピーしています。たとえば、次のように:

(1)ケース1: "/" の終わりを使用します

## server端

# pwd
/tmp/temp
# ll
-rw-r--r-- 1 root root    0 11月 13 11:18 a.log
-rwxr-xr-x 1 root root  338 11月 13 11:31 auto_sshcopyid.exp
-rw------- 1 root root 1679 11月 13 10:31 id_rsa
-rw-r--r-- 1 root root  395 11月 13 10:31 id_rsa.pub
-rw-r--r-- 1 root root  416 11月 13 11:27 sshkey.sh
-rw------- 1 root root 1679 11月 13 10:34 test
-rw-r--r-- 1 root root  342 11月  5 10:48 test01.py
-rw-r--r-- 1 root root   75 11月  5 14:23 test02.py
-rw-r--r-- 1 root root  299 11月  5 16:18 test03.py
-rw-r--r-- 1 root root  371 11月  5 18:52 test04.py
-rw-r--r-- 1 root root  217 11月  5 22:26 test05.py
-rw-r--r-- 1 root root   60 11月  5 22:26 test06.py
-rw-r--r-- 1 root root  406 11月 14 11:22 test.pub

「/」の終わりを使用して実行し、ディレクトリ内のファイルをコピーしています。

ansible test -m copy -a "src=/tmp/temp/ dest=/tmp/test" -o -f 6

ターゲット・マシンの/ tmp / testディレクトリの内容を表示します。

# pwd
/tmp/test
# ll
总用量 48
-rw-r--r-- 1 root root    0 11月 14 11:39 a.log
-rw-r--r-- 1 root root  338 11月 14 11:39 auto_sshcopyid.exp
-rw-r--r-- 1 root root 1679 11月 14 11:39 id_rsa
-rw-r--r-- 1 root root  395 11月 14 11:39 id_rsa.pub
-rw-r--r-- 1 root root  416 11月 14 11:39 sshkey.sh
-rw-r--r-- 1 root root 1679 11月 14 11:39 test
-rw-r--r-- 1 root root  342 11月 14 11:39 test01.py
-rw-r--r-- 1 root root   75 11月 14 11:39 test02.py
-rw-r--r-- 1 root root  299 11月 14 11:39 test03.py
-rw-r--r-- 1 root root  371 11月 14 11:39 test04.py
-rw-r--r-- 1 root root  217 11月 14 11:39 test05.py
-rw-r--r-- 1 root root   60 11月 14 11:39 test06.py
-rw-r--r-- 1 root root  406 11月 14 11:39 test.pub

(2)ケース2:なし最後にスラッシュ

それがスラッシュで終わっていない「/」、コピーがディレクトリ内のディレクトリのファイルに追加されます。

ansible test -m copy -a "src=/tmp/temp dest=/tmp/test01 backup=yes" -o -f 6

ターゲット・マシンの/ tmp /ディレクトリのコンテンツTEST01を見ます:

# pwd
/tmp/test01
# ll
总用量 0
drwxr-xr-x 2 root root 224 11月 14 11:40 temp
# cd temp
# pwd
/tmp/test01/temp
# ll
总用量 48
-rw-r--r-- 1 root root    0 11月 14 11:40 a.log
-rw-r--r-- 1 root root  338 11月 14 11:40 auto_sshcopyid.exp
-rw-r--r-- 1 root root 1679 11月 14 11:40 id_rsa
-rw-r--r-- 1 root root  395 11月 14 11:40 id_rsa.pub
-rw-r--r-- 1 root root  416 11月 14 11:40 sshkey.sh
-rw-r--r-- 1 root root 1679 11月 14 11:40 test
-rw-r--r-- 1 root root  342 11月 14 11:40 test01.py
-rw-r--r-- 1 root root   75 11月 14 11:40 test02.py
-rw-r--r-- 1 root root  299 11月 14 11:40 test03.py
-rw-r--r-- 1 root root  371 11月 14 11:40 test04.py
-rw-r--r-- 1 root root  217 11月 14 11:40 test05.py
-rw-r--r-- 1 root root   60 11月 14 11:40 test06.py
-rw-r--r-- 1 root root  406 11月 14 11:40 test.pub

テンプレートモジュール

テンプレートモジュールの使用と基本的に同じモジュールの用途をコピーし、主にコンフィギュレーションファイルをコピーするために使用されます。テンプレート-ドキュメントのAnsible公用

ansible-doc -s template
- name: Template a file out to a remote server
  template:
      backup:   # 拷贝的同时也创建一个包含时间戳信息的备份文件,默认为no
      dest:     # 目标路径
      force:    # 设置为yes (默认)时,将覆盖远程同名文件。设置为no时,忽略同名文件的拷贝
      group:    # 设置远程文件的所属组
      owner:    # 设置远程文件的所有者
      mode:     # 设置远程文件的权限。使用数值表示时不能省略第一位,如0644。
                # 也可以使用'u+rwx' or 'u=rw,g=r,o=r'等方式设置
      src:      # ansible控制器上Jinja2格式的模板所在位置,可以是相对或绝对路径
      validate: # 在复制到目标主机后但放到目标位置之前,执行此选项指定的命令。
                # 一般用于检查配置文件语法,语法正确则保存到目标位置。
                # 如果要引用目标文件名,则使用%s,下面的示例中的%s即表示目标机器上的/etc/nginx/nginx.conf。

例としては、次のとおりです:

ansible centos -m template -a "src=/tmp/nginx.conf.j2 dest=/etc/nginx/nginx.conf mode=0770 owner=root group=root backup=yes validate='nginx -t -c %s'" -o -f 6

テンプレートモジュールの設定ファイルは、ホスト上、被告人にテンプレートをコピーするには、コンテンツのニーズに応じて変更されますが、解決できない状況があることができますが:異なる必要なノード構成ファイルに大きな差で充電が複数の変数を満たすように変更されていません。実施例6においてとYUMのCentOSによって7は/etc/nginx/conf.d/default.confがあり、CentOSのnginxの上にそれらのコンテンツのプロファイルに非常に大きな差、およびCentOSの6のデフォルトnginxのマウント。nginxの設定ファイルが直接CentOSの6とCentOSの7に同じテンプレートをコピーした場合、それは開始されませんのnginxのバージョンにつながる可能性があります。

この時点では、テンプレートマッチングをコピーするときにコピーし、対応するリリース・テンプレート・ファイルを選択する必要があり、たとえば、あなたが6つのCentOSの上のソーステンプレートにコピーする7つのCentOS上でのソーステンプレートにコピーし、nginx6.conf.j2あるnginx7.confです。 J2。この動作は、「ファイルまたはテンプレートに基づいて変数選択」と呼ぶことができます。

---
 - tasks:
     - name: template file based var
       template: src=/templates/nginx{{ ansible_distribution_major_version }}.conf.j2 dest=/etc/nginx/nginx.conf validate="/usr/sbin/nginx -t -c %s"

また、最初はansibleにおける変数のコンテンツの実装に合わせてレンダリングされる、文書の内容に代替変数Jinja2のを指定し、関連するモジュールの実装をレンダリングすることができます。例えば、テンプレートモジュールここでは、ソースプロファイルのYUMベースのリリース番号のコピー。以下は、レポファイルテンプレートbase.repo.j2内容です。

[epel]
name=epel
baseurl=http://mirrors.aliyun.com/epel/{{ ansible_distribution_major_version }}Server/x86_64/ enable=1
gpgcheck=0

そして、それをコピーしてください。

---
 - tasks:
     - template: src=my.repo.j2 dest=/etc/yum.repos.d/my.repo

ファイルモジュールファイル

ファイル管理は、ディレクトリの属性は、ファイルまたはディレクトリを作成することができます。ファイル-ドキュメントのAnsible公用

ansible-doc -s file
- name: Manage files and file properties
  file:
      group:   # file/directory的所属组
      owner:   # file/directory的所有者
      mode:    # 修改权限,格式可以是0644、'u+rwx'或'u=rw,g=r,o=r'等
      path:    # 指定待操作的文件,可使用别名'dest'或'name'来替代path
      recurse: # (默认no)递归修改文件的属性信息,要求state=directory
      src:     # 要链接到的文件的路径。
               # 这只适用于state=link和state=hard。
               # 对于state=link,这也将接受一个不存在的路径。
               # 相对路径相对于正在创建的文件(路径),这是Unix命令ln -s SRC DEST处理相对路径的方式。
      state:   # directory:如果目录不存在则递归创建
               # file:文件不存在时,不会被创建(默认值)
               # touch:touch由path指定的文件,即创建一个新文件,或修改其mtime和atime
               # link:修改或创建软链接
               # hard:修改或创建硬链接
               # absent:目录和其中的文件会被递归删除,文件或链接将取消链接状态

あなたがだけにして、ディレクトリを作成し、このディレクトリにファイルを作成することができ、ファイル・モジュールはディレクトリを再帰的に作成することができ、注意しなければならないが、存在しないディレクトリ内のファイルを作成することはできません。私たちは、テスト中に検証する必要があります。

# 被控制机上并不存在/root/test这个目录
# 使用ansible在被控制机上/root/test目录下创建foo.conf
ansible test -m file -a "path=/root/test/foo.conf owner=duser group=duser mode='0644' state=touch"

ansible実行結果は次のとおりです。

192.168.246.187 | FAILED! => {
    "changed": false,    ## 失败
    "msg": "Error, could not touch target: [Errno 2] 没有那个文件或目录: b'/root/test/foo.conf'",
    "path": "/root/test/foo.conf"
}
# 现在我们在被控制机上创建/root/test目录
# 再次执行ansible
ansible test -m file -a "path=/root/test/foo.conf owner=duser group=duser mode='0644' state=touch"

ansible実行結果は次のとおりです。

192.168.246.187 | CHANGED => {
    "changed": true,  ## 成功
    "dest": "/root/test/foo.conf",
    "gid": 1009,
    "group": "duser",
    "mode": "0644",
    "owner": "duser",
    "size": 0,
    "state": "file",
    "uid": 1009
}

ディレクトリを作成し、再帰的にディレクトリの属性を変更します。

ansible test -m file -a "path=/tmp/xyz/test state=directory owner=root group=root mode='0755' recurse=yes"

テスト機関でディレクトリを/ tmp / XYZ /テストを変更

ansible test -m file -a "path=/tmp/xyz/test state=directory mode='0777'"

ファイルの属性/アクセス権を作成または変更

ansible test -m file -a "path=/tmp/xyz/test/wtf.txt state=touch mode='0644'"

ファイルのモジュールをフェッチ引っ張ります

そして、コピーのような作品は、リモートホストから単にファイルは、ローカル側に引っ張って保存した場合、ディレクトリツリーとしてホスト名を使用して、ファイルのみがディレクトリを引くことができない引っ張ってきます!

フェッチ - ドキュメントのAnsible公式使用を

ansible-doc -s fetch
- name: Fetch files from remote nodes
  fetch:
      dest:              # 本地存储拉取文件的目录。例如dest=/data,src=/etc/fstab,
                         # 远程主机名host.exp.com,则保存的路径为/data/host.exp.com/etc/fstab。
      fail_on_missing:   # 当设置为yes时,如果拉取的源文件不存在,则此任务失败。默认为no。
      flat:              # 改变拉取后的路径存储方式。如果设置为yes,且当dest以"/"结尾时,将直接把源文件
                         # 的basename存储在dest下。显然,应该考虑多个主机拉取时的文件覆盖情况。
      src:               # 远程主机上的源文件。只能是文件,不支持目录。在未来的版本中可能会支持目录递归拉取。
      validate_checksum: # fetch到文件后,检查其md5和源文件是否相同。

/tmp/192.168.246.187/etc/fstabとして保存:

ansible test -m fetch -a "src=/etc/fstab dest=/tmp"

/ tmp / fstabファイルとして保存:

ansible test -m fetch -a "src=/etc/fstab dest=/tmp/ flat=yes"

/tmp/fstab-192.168.246.187として保存:

ansible test -m fetch -a "src=/etc/fstab dest=/tmp/fstab-{{inventory_hostname}} flat=yes"

ここで指摘します:

{{inventory_hostname}}上記のように、ホスト・エイリアスの/ etc / ansible /ホストを指します。

# /etc/ansible/hosts如下定义:
[test]
192.168.246.187
[test:vars]
ansible_ssh_private_key_file=/root/.ssh/rsa_back/id_rsa
ansible_python_interpreter=/usr/local/python3/bin/python3

この場合にファイル名を生成し、制御端子は/tmp/fstab-192.168.246.187です。

# /etc/ansible/hosts如下定义:
[test]
nginx ansible_ssh_host=192.168.246.187
[test:vars]
ansible_ssh_private_key_file=/root/.ssh/rsa_back/id_rsa
ansible_python_interpreter=/usr/local/python3/bin/python3

この場合の制御端子を生成すると、ファイル名を/ tmp / fstabの-nginxのです。

rsyncのモジュール同期

rsyncの共通機能の簡易版を実装するための同期手段が、それはすべての後、あまりにも多くの機能があまりにも詳細に、rsyncは、rsyncのフルバージョンを実現することはできません。あなたはrsyncのを使用している場合、またはあなたは、rsyncコマンドを呼び出すためのコマンドやシェルモジュールを使用する必要があります。

完全な機能のrsyncを参照してくださいrsyncコマンド中国のマニュアルを

ansible-doc -s synchronize
- name: A wrapper around rsync to make common tasks in your playbooks quick and easy
  synchronize:
      src:           # 指定待传输的源文件。可以是相对路径,也可以是绝对路径。
      dest:          # 目标路径。可以是绝对路径,也可以是相对路径。
      mode:          # 指定推(push)还是拉(pull)的传输模式。
                     # push时,本地为sender端,pull时,远程为sender端。默认为push。
      archive:       # 等价于rsync的"-a"选项,即使用归档模式。它等价于rsync的"-rtopgDl"选项。值为yes/no。
      times:         # 保留mtime属性,值为yes/no。
      group:         # 保留所属组属性,值为yes/no。
      owner:         # 保留所有者属性,值为yes/no。
      links:         # 拷贝链接文件自身,值为yes/no。
      perms:         # 保留权限属性,值为yes/no。
      recursive:     # 递归到目录中的文件,值为yes/no。
      compress:      # 传输过程中压缩传输。应该总是开启,除非遇到问题。即rsync的"-z"选项。值为yes/no,默认是yes。
      copy_links:   # 拷贝软链接的文件名和其指向的文件的内容。即a指向b文件时,将在目标端生成a普通
                     # 文件,但此文件中的内容是b中的内容。
      dirs:         # 非递归方式传输目录。
      delete:       # 目标端如果比源端文件多,则删除这些多出来的文件,要求recursive=yes。
      checksum:     # 等价于"-c"选项,将基于文件的checksum来判断是否同步,而不是默认的quick check
                     # 算法,该算法基于文件大小和最近的mtime来判断是否要同步。该选项会大幅降低效率,
                     # 应谨慎使用。注意,它无法影响archive,即archive仍会启用。
      existing_only:# receiver端没有的文件不同步。但仍会传输,只是临时文件重组后不重命名而已。
      partial:      # 等价于"--partial"选项。默认rsync在传输中断时会删除传输了一半的文件,指定该选
                     # 项将保留这部分不完整的文件,使得下次传输时可以直接从未完成的数据块开始传输。
      dest_port:    # ssh的连接端口。
      rsync_opts:   # 指定额外的rsync选项。使用数组的方式传递这些选项。
      rsync_path:   # 等价于"--rsync-path"选项,目的是启动远程rsync。
                     # 例如可以指定[--rsync-path=rsync],甚至[--rsync-path=cd /tmp/c && rsync]。
                     # 当不指定rsync路径时,默认为/usr/bin/rysnc。
      rsync_timeout:# 指定rsync在多久时间内还没有数据传输就超时退出。
      verify_host:  # 对目标主机进行ssh的host key验证。

説明

ボーエンは、基準であるマローンハンサム兄貴ブロガーの研究ノートに属する世代を終え記事、侵害あれば、私の兄に連絡してください、李は削除されました!

最後に、オープンソースのおかげで、オープンソースの抱擁〜

おすすめ

転載: blog.51cto.com/wutengfei/2450346